本片文章主要介绍如何使用MEncoder进行视频转码(也包含使用ffmpeg插件进行无字幕视频转码)
准备工作:
1.下载ffmpeg插件包
地址:http://ffmpeg.org/download.html#releases
解压后目录结构为:
|-ffmpeg.exe
|-bin ---|-...
| |-...
|
ffmpeg |-doc ---..
|-licenses ---..
|-presets ---..
|-README.TXT
2.下载mencoder插件包(也就是linux的MPlayer的整个包,mencoder是Mplayer的编码工具,MPlayer包内有这个插件mencoder.exe)
地址:http://www.mplayerhq.hu/design7/dload.html
|-codecs ..
| |-font.conf
mencoder |-fonts-----|-conf.avail
| |-conf.d
|
| |-codecs.conf
|-mplayer---|-config
| |-input.conf
| |-subfont.ttf
|
|-mencoder.exe
|-mplayer.exe
|-vfw2menc.exe
|-dsnative.dll
3.Eclipse建立一个简单的项目transferVideo
正式开始
1.创建一个接口:ICMDResponseGetter.java
package com.edu.ccnu.videocourse.ffmpeg;
/**
* FFMPEG插件接口
* @author Si.Li
*
*/
public interface ICMDResponseGetter {
/**
* 用来抓取命令行返回的信息
* @param str
*/
public void controlString(String str);
}
2.创建能够执行命令行并抓取命令行响应的Excuter类
package com.edu.ccnu.videocourse.ffmpeg;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.List;
/**
* 执行cmd的执行
* @author Si.Li
*
*/
public class CMDExcuter {
public static void exec(List<String> cmd,ICMDResponseGetter getter){
try{
ProcessBuilder builder = new ProcessBuilder();
builder.command(cmd);
builder.redirectErrorStream(true);
Process proc = builder.start();
BufferedReader stdout = new BufferedReader(
new InputStreamReader(proc.getInputStream()));
String line;
while ((line = stdout.readLine()) != null) {
if( getter != null )
getter.controlString(line);
}
proc.waitFor();
stdout.close();
}
catch (Exception e) {
e.printStackTrace();
}
}
}
3.创建主类 VideoTransfer.java进行视频转码的工作,代码如下:
package com.edu.ccnu.videocourse.ffmpeg;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import com.edu.ccnu.videocourse.base.CommonConstants;
/**
* VideoTransfer
* @author Si.Li
*
*/
public class VideoTransfer implements ICMDResponseGetter{
/**
* 用来记录视频时长
*/
private int videoTimeCount=0;
/**
* 可执行文件的路径
*/
private String ffmpegPath;
/**
* 视频源文件地址
*/
private String sourceFilePath;
/**
* FFMPEG 的一些自述状态
*/
private enum FFMpegUtilStatus { Empty, CheckingFile, GettingRuntime };
/**
* 初始状态为Empty
*/
private FFMpegUtilStatus status = FFMpegUtilStatus.Empty;
/**
* 用来装载cmd命令
*/
private List<String> cmd = new ArrayList<String>();
/**
* 是否支持源文件格式的转换 Method : isSupported()
*/
private boolean isSupported;
/**
* 构造函数
* @param ffmpegPath FFMPEG可执行文件的绝对路径 例如 WINDOWS: e:/ffmpeg/ffmpeg.exe LINUX: /root/ffmpeg/bin/ffmpeg
* @param sourceFilePath 处理视频的源文件绝对路径
* @param destinationFile 视频转换成FLV后的存储路径
*/
public VideoTransfer(String ffmpegPath,String sourceFilePath){
this.ffmpegPath=ffmpegPath;
this.sourceFilePath=sourceFilePath;
}
/**
* 获取视频时长
* @return
*/
public int getVideoTimeCount(){
videoTimeCount = 0;
//设置当前状态为获取时长
status=FFMpegUtilStatus.GettingRuntime;
cmd.clear();
cmd.add(ffmpegPath);
cmd.add("-i");
cmd.add(sourceFilePath);
CMDExcuter.exec(cmd, this);
return videoTimeCount;
}
/**
* FFMPEG是否支持转换的源视频文件格式
* @return
*/
public boolean isSupported(){
isSupported=true;
status=FFMpegUtilStatus.CheckingFile;
cmd.clear();
cmd.add(ffmpegPath);
cmd.add("-i");
cmd.add(sourceFilePath);
CMDExcuter.exec(cmd, this);
return isSupported; //通过回调,isSupported值根据命令行响应会调整该值
}
/**
* 视频转换
* @param saveFilePath 存储路径,精确到 xxx.flv
* @param screenSize 屏幕分辨率 以:720x576 格式为准
* @param autoByte 音频比特率 Kbps
* @param autocollection 音频采样率 HZ
* @param quality 视频质量 (官方文档 1-31)
* @param fps 每秒帧率
*/
public void videoTransfer(String saveFilePath,String screenSize,Integer autoByte,Integer autocollection,Integer quality,Integer fps){
cmd.clear();
cmd.add(ffmpegPath); //执行文件目录绝对路径例如 WINDOWS: e:/ffmpeg/ffmpeg.exe LINUX: /root/ffmpeg/bin/ffmpeg
cmd.add("-i"); //-i 后面指明源文件绝对路径,精确到 xx.视频格式
cmd.add(sourceFilePath); //源文件绝对路径
cmd.add("-y"); //设置转换的文件如果存在,那么直接覆盖
cmd.add("-ab"); //设置音频比特率
cmd.add(autoByte.toString()); //音频比特率值 Kbps为单位
cmd.add("-ar"); //设置音频采样率
cmd.add(autocollection.toString()); //音频采样率值 HZ为单位
cmd.add("-qscale"); //设置视频质量,目前设置为1
cmd.add(quality.toString());
cmd.add("-r"); //设置视频每秒帧数
cmd.add(fps.toString());
cmd.add("-s"); //设置视频分辨率
cmd.add(screenSize);
cmd.add(saveFilePath);
CMDExcuter.exec(cmd, null);
}
/**
* 视频合成字幕转换
* @param saveFilePath 存储的FLV路径
* @param srtPath 字幕文件的物理路径
* @param mencoderPath mencoder.exe的物理路径
*/
public void videoTransferByMencoder(String saveFilePath,String srtPath,String mencoderPath){
cmd.clear();
cmd.add(mencoderPath); //mencoder.exe的物理地址
cmd.add(sourceFilePath); //源文件的物理地址
cmd.add("-o"); //目标文件地址(也就是转换后的物理地址,要精确到 xx.flv)
cmd.add(saveFilePath);
cmd.add("-of"); //指定输出格式
cmd.add("lavf");
cmd.add("-oac"); //指定输出音频编码
cmd.add("mp3lame");
cmd.add("-lameopts");
cmd.add("abr:br="+CommonConstants.SOUND_AUDIOBYTE);
cmd.add("-ovc"); //指定输出编码选择,
cmd.add("lavc");
cmd.add("-lavcopts"); //输出视频编码选项,参数较多,自行查询
cmd.add("vcodec=flv");
cmd.add("-srate"); //音频采样率
cmd.add(CommonConstants.SOUND_SAMPLING.toString());
cmd.add("-sub"); //字幕地址
cmd.add(srtPath);
cmd.add("-subfont"); //字幕ziti
cmd.add("SimSun");
cmd.add("-subcp");
cmd.add("GB18030");
cmd.add("-fontconfig");
System.out.println(cmd.toString());
CMDExcuter.exec(cmd, null);
}
/**
* 根据视频开始后的描述进行视频截图
* @param imagesSavePath 存储图片的全路径 精确到 xxx.jpg
* @param begin 设置视频截图在视频的第几秒内
* @param screenSize 截图的分辨率 格式参照:720x576
*
*/
public void makeScreenImage(String imagesSavePath,Integer begin,String screenSize){
cmd.clear();
cmd.add(ffmpegPath);
cmd.add("-i");
cmd.add(sourceFilePath);
cmd.add("-y");
cmd.add("-f");
cmd.add("image2");
cmd.add("-ss");
cmd.add(begin.toString());
cmd.add("-t");
cmd.add("0.001");
cmd.add("-s");
cmd.add(screenSize);
cmd.add(imagesSavePath);
CMDExcuter.exec(cmd,null);
}
/**
* 执行CMDExcuter后,获取响应会回调本方法
* 本类主要用于 视频格式支持判断函数【isSupported()】和 获取视频时长函数【 getRunTime()】
*/
@Override
public void controlString(String str) {
switch( status )
{
case Empty:
break;
case CheckingFile:{ //检查是否能够支持当前文件的转换
Matcher m = Pattern.compile("Unknown format").matcher(str);
if( m.find() )
this.isSupported = false;
break;
}
case GettingRuntime:{ //获取视频截图的时间
String zz="Duration: ([0-9][0-9]:[0-9][0-9]:[0-9][0-9])";
Matcher m = Pattern.compile(zz).matcher(str);
while (m.find())
{
String msg = m.group();
msg = msg.replace("Duration: ", "");
videoTimeCount=changeMsgToVideoCount(msg);
/**
* TODO msg Duration: 00:06:17,替换之后,不知道是否是 00:06:17先输出
*/
}
break;
}
}
}
/**
* 将获取的视频时长字符串解析成
*/
private Integer changeMsgToVideoCount(String msg){
Integer count=0;
String [] times=msg.split(":");
count+=Integer.parseInt(times[2]);
count+=Integer.parseInt(times[1])*60;
count+=Integer.parseInt(times[0])*60*60;
return count;
}
}
暂时这样吧,coding过程中已经将一部分注释写上了,以后完善
分享到:
相关推荐
在本文中,我们将深入探讨如何使用Java程序调用FFmpeg执行视频文件格式转换,特别是将非FFmpeg原生支持的格式转换为FLV格式。FFmpeg是一个强大的多媒体处理工具,支持多种视频、音频格式的编码、解码和转换。在这个...
FFmpeg和mencoder是两种广泛使用的开源工具,用于处理音视频文件,包括转换视频格式为FLV(Flash Video)格式。在本文中,我们将深入探讨这两个工具,了解它们的工作原理,以及如何使用它们来完成视频格式转换。 ...
本篇文章将详述如何使用开源工具ffmpeg和mencoder将不同格式的视频文件转换为FLV(Flash Video)格式,以及如何从这些视频文件中提取第一帧作为图片。同时,我们还会提及如何在C#环境中调用这些工具,实现自动化处理...
本文将深入探讨如何使用Java结合FFmpeg和mencoder工具对视频进行转换。FFmpeg是一个强大的跨平台的命令行工具,用于处理音频和视频文件,而mencoder是MPlayer的一部分,同样用于视频编码和转换。 首先,让我们理解...
FFmpeg和MEncoder是两种广泛使用的开源视频处理工具,它们都可以将不同的视频格式转换为FLV(Flash Video)格式,适合在Web上进行流媒体播放。让我们深入了解一下这两个工具及其在视频转码过程中的应用。 FFmpeg是...
在Java开发中,它们经常被用作后台处理视频的工具,因为它们提供了强大的命令行接口来处理各种视频和音频格式。 FFmpeg是一个全面的、跨平台的解决方案,用于处理音频和视频流。它包括一系列的库(如libavcodec、...
在ASP.NET环境中,将各种视频文件转换为FLV格式是一项常见的需求,特别是在处理在线视频流或构建媒体库时。此过程涉及多个步骤和技术组件,包括使用特定的编码工具(如FFmpeg和Mencoder)、配置应用设置、以及实现...
例如,将一个MP4视频转换为FLV格式,可以使用以下代码: ```java JAVE jave = new JAVE("input.mp4", "output.flv"); jave.addInputParam("-i", "input.mp4"); jave.addOutputParam("output.flv"); jave.execute();...
在视频转换过程中,需要首先将视频文件上传到服务器,然后使用FFMPEG和MENCODER将其转换成FLV格式,最后将其嵌入PHP网页中。这个过程可以自动完成,无需人工干预。 PHP网页是指使用PHP语言编写的网页程序。PHP是一...
在这个命令中,`input_video.ext`是源文件,`output.flv`是目标文件,`-of lavf`指定输出格式为lavf(Libavformat),`-ovc lavc`指定使用lavc(Libavcodec)作为视频编码器,`-lavfopts format=flv`设定输出为FLV...
例如,你可以使用以下命令将所有MP4格式的视频转换为AVI格式: ``` for file in $(cat video_queue.txt); do mencoder "$file" -oac mp3lame -lameopts abr:br=128 -ovc lavc -lavcopts vcodec=mpeg4 -o "${file%....
使用mencoder,你可以将视频文件转换为不同的编码格式,如MPEG-1、MPEG-2、XviD、DivX、H.264等。此外,还可以调整输出视频的分辨率、比特率、帧率等参数,以适应不同的设备或网络条件。 3. **音频处理** 不仅...
与FFmpeg相比,Mencoder在某些特定的视频转码任务上可能更加高效,但它的功能相对较为单一,主要用于视频文件的格式转换和质量调整。Mencoder支持的编码格式包括MPEG-1/2、DVD、VCD、SVCD等,对于旧版的编码格式支持...
标题 "mencoder xxx to flv" 指的是使用 mencoder 这个工具将某个视频文件(xxx)转换为 FLV 格式的过程。mencoder 是 MPlayer 的一个命令行工具,广泛用于视频编码和格式转换。在本文中,我们将深入探讨 mencoder ...
例如,如果你需要将一个MP4视频转换为WebM格式,你可以使用以下命令: ``` ffmpeg -i input.mp4 -c:v libvpx-vp9 -crf 30 -b:v 1M -c:a libvorbis output.webm ``` 在这个命令中,`-i`指定输入文件,`-c:v libvpx-vp...
视频转码是将视频文件从一种格式转换为另一种格式的过程,例如从AVI转换为MP4或从MOV转换为FLV等。 在本文中,我们将详细介绍如何使用Java语言调用ffmpeg和mencoder来实现视频转码。首先,我们需要下载ffmpeg和...
总之,ASP.NET结合mencoder或ffmpeg可以实现视频格式转换服务,将用户上传的各种视频格式转换为适合在网络流式传输的FLV格式。这个过程涉及到文件上传、服务器端处理、文件存储、错误处理和视频播放等多个环节,体现...
Mencoder是MPlayer的一个附属工具,它主要用于视频的编码、转换和处理,包括视频剪切、合并以及添加字幕等功能。在本文中,我们将详细探讨如何利用Mencoder进行这些操作,以便于您更好地理解和掌握这一强大的命令行...
本教程将深入探讨如何使用mencoder工具来实现视频的截取与合并,并添加字幕功能。mencoder是MPlayer项目的衍生产品,是一个强大的命令行视频编码工具,能够处理各种格式的视频文件。 首先,我们来了解视频截取的...