FFmpeg是一个开源免费跨平台的视频和音频流方案,属于自由软件,采用LGPL或GPL许可证(依据你选择的组件)。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec,为了保证高可移植性和编解码质量,libavcodec里很多codec都是从头开发的。FFmpeg在Linux平台下开发,但它同样也可以在其它操作系统环境中编译运行。
在java开发中,FFmpeg也常被调用用来进行视频的转码,录播和直播,总的来说,FFmpeg是一款非常强大的,而且做与视频相关的业务平台开发人员必须要学会的工具,那具体怎么实习呢,第一章我们先从分别windows和linux下调用FFmpeg进行视频的转码,和对视频的截图做出说明解释。
ffmpeg能解析的格式:(asx,asf,mpg,wmv,3gp,mp4,mov,avi,flv等),而对于ffmpeg无法解析的文件格式(wmv9,rm,rmvb等),我们在下面采用了mencoder工具,先将视频转换成AVI格式再用ffmpeg进行转码;
windows下:
1.首先需要FFmpeg和mencoder的工具。一共五个文件,点此下载,将他解压放在你的D盘FFmpeg文件夹下。
linux下:
依次执行下面的指令
1.下载yasm-1.3.0.tar.gz这个版本:
?1yasm是一个完全重写的NASM汇编。目前,它支持x86和AMD64指令集,接受NASM和气体汇编语法,产出二进制, ELF32 , ELF64 , COFF , Mach - O的( 32和64 ) , RDOFF2 ,的Win32和Win64对象的格式,并生成STABS 调试信息的来源,DWARF 2 ,CodeView 8格式。之所以在FFmpeg中用这个,主要是支持编译ffmpeg-x264.
wget http://www.tortall.net/projects/yasm/releases/yasm-1.3.0.tar.gz
tar xzvf yasm-1.3.0.tar.gz
cd yasm-1.3.0
./configure
make
make install
2.下载3.1.3 release ffmpeg(时间可能会有点长,耐心等待~!安装完成之后输入 ffmpeg -version 可以看到版本说明安装成功)
wget http://ffmpeg.org/releases/ffmpeg-3.1.3.tar.gz
tar -zxvf ffmpeg-3.1.3.tar.gz
cd ffmpeg-3.1.3
./configure
make
make install
ffmepg命令格式:ffmepg -i filename -vcodec copy newfilename
package test;
import java.io.File;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
public class ConvertVideo {
public static void main(String[] args) {
String fileName = "192.168.10.1836Time20181213150000Time20181213150010.mp4_";
if(args != null && args.length>=1){
fileName = args[0];
}
String path = Test.TEMP_VIDEO_PATH + File.pathSeparator + fileName;
String newPath = Test.TEMP_VIDEO_PATH + File.pathSeparator + fileName.replace(Test.TEMP_VIDEO_SUFFIX, Test.REAL_VIDEO_SUFFIX);
// path = "C:\\download\\192.168.10.1836Time20181213150000Time20181213150010_1544684887325.mp4";
// newPath = "/var/log/smartpark/wi.mp4";
if (ConvertVideo.processMP4(path,newPath)) { //执行转码任务
System.out.println("ok");
}
}
private static boolean checkfile(String path) {
File file = new File(path);
if (!file.isFile()) {
System.out.println(path + " is not file");
return false;
}
return true;
}
public static boolean processMP4(String filePath, String newfilePath) {
if(!checkfile(filePath)){
return false;
}
List<String> commend = new ArrayList<String>();
commend.add("/usr/local/bin/ffmpeg");
commend.add("-i");
commend.add(filePath);
commend.add("–vscodec");
commend.add("copy");
commend.add(newfilePath);
try {
//调用线程命令启动转码
ProcessBuilder builder = new ProcessBuilder();
builder.command(commend);
Process process = builder.start();
InputStream in=process.getInputStream();
byte[] re=new byte[1024];
while (in.read(re)!= -1) {
System.out.println("==>"+new String(re));
}
in.close();
if(process.isAlive()){
process.waitFor();
}
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
}