ffmpeg

FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。

采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。

它包含了非常先进的音频/视频编解码库libavcodec,为了保证高可移植性和编解码质量,

libavcodec里很多code都是从头开发的。

FFmpeg在Linux平台下开发,但它同样也可以在其它操作系统环境中编译运行,

包括Windows、Mac OS X等。这个项目最早由Fabrice Bellard发起,

现在由Michael Niedermayer维护。许多FFmpeg的开发人员都来自MPlayer项目,

而且当前FFmpeg也是放在MPlayer项目组的服务器上。项目的名称来自MPEG视频编码标准,

前面的”FF”代表”Fast Forward”。

安装

1.Linux编译源码安装

解压源码包

f83301aa545110c10b8658ffebbf69cc.png

定位到源码根路径(包含configure)

48fd5860286732bc5acd012ef3a8f645.png

执行configure命令【./configure –enable-shared –prefix=/opt/ffmpeg】

如果编译报错,则执行【./configure –disable-yasm –enable-shared –prefix=/opt/ffmpeg】

其中,–prefix= 指定了安装路径

22ffbf9d5f207dc2c82dfdd9fde7438f.png

执行make命令进行编译,编译过程会持续一段时间

393f00af3df9b5eed26a300b262e5123.png

执行安装命令,持续一段时间

bffa69a0b3118768a2e61074008dc715.png

接着定位到安装目录的bin下,运行./ffmpeg但是报错

ddf456aff5f5f63c476199f2e12ce391.png

编辑/etc/ld.so.conf文件

fb1c3a8cae779c2f2d140ee9cf4d53c1.png

将安装好的lib路径添加到文件中,保存

7b0d1983481726ed6031157f0c726bbd.png

运行ldconfig命令使更改生效

caf1bd28767cc85a13a7298f3955e7ba.png

执行命令成功,说明安装、配置成功

a1d56a60045ac108ffbc45ee52c38520.png

2.直接解压release包

下载系统对应的release包,直接解压即可执行

下载地址

A.Windows

b7bf10ca947773f0487b6806d1175f45.png

38357f4e25316f71d5085a9f1c1e8796.png

97be765f5515389fb15865a369fd8b97.png

B.Linux

15c27ea5e99961b7ad1148acca58cc27.png

2ab102aad7a6c5e7efe9ce112e054011.png

常用命令1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30//分离视频流

ffmpeg -i input_file -vcodec copy -an output_file_video

//分离音频流

ffmpeg -i input_file -vcodec copy -vn output_file_audio

//转换格式

ffmpeg -i vedioPathName -ac 2 -r 29.97 vedioDestinationPathName

//截图

ffmpeg -i vedioPathName -y -f image2 -ss cutTime imageDestinationPathName

//-r 提取图像的频率,-ss 开始时间,-t 持续时间

//提取图片(组)

ffmpeg –i test.avi –r 1(可以是0.5 .etc) –f image2 image-%3d.jpeg

//剪切视频

ffmpeg -ss 0:1:30 -t 0:0:20 -i input.avi -vcodec copy -acodec copy output.avi

//视频封装(合成)

ffmpeg –i video_file –i audio_file –vcodec copy –acodec copy output_file

//屏幕抓取,(截屏、屏幕录制等等)

ffmpeg -f gdigrab -i desktop out.mpg

//从屏幕的(10,20)点处开始,抓取640x480的屏幕,设定帧率为5

ffmpeg -f gdigrab -framerate 5 -offset_x 10 -offset_y 20 -video_size 640x480 -i desktop out.mpg

//生成GIF

ffmpeg -i capx.mp4 -t 10 -s 320x240 -pix_fmt rgb24 jidu1.gif

Java封装

因为ffmpeg是C++开发的,所以Java基本无法对其进行封装,

不过考虑到其在控制台下运行的特点,可以通过java的进程调用

对其进行简单的图形化封装(实测效果不是很好,主要为了简化操作)

c4ec40064acf1f1f8188e07c7acb3bf3.png

Java调用外部进程的方式。

67cbc13cd9f4e544c1dc7c600bbb4f20.png

上图中,Progress对CommandBuilder以及Process进行简单的封装,主要的命令则在Executor类中封装成方法,如下图:

9d8e66a7d964c61c4cbf8c921477ae1c.png

52b46208b78ba831471f33feabc677a0.png

然后通过JavaFX可视化界面将操作搬到窗口中:

357ce2f03347784972f5a91f3cbc2099.png

程序效果如下:

c46d8abefd0bc60674a43657a0aac3df.png

这样将常用的操作搬到可视化界面中,大大的简化了操作的复杂度。

不过由于程序通过调用进程进行操作,在消息进度等方面会存在一些问题,

比如主进程取不到子进程的输出信息(缓冲,没有输出到流),以及一些不可控因素等。

实测该程序在转换、视频截取合成和截屏录制功能上是没有问题的。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐