FFmpeg是一个开源的多媒体框架,它包含了一个用于音频和视频编解码的库。它可以执行各种多媒体操作,如格式转换、视频剪辑、音频处理等。可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。
FFmpeg的结构
默认的编译会生成 4 个可执行文件和 8 个静态库。可执行文件包括用于转码、推流、Dump 媒体文件的 ffmpeg、用于播放媒体文件的ffplay、用于获取媒体文件信息的 ffprobe,以及作为简单流媒体服务器的 ffserver。8 个静态库其实就是 FFmpeg 的 8 个模块,具体包括如下内容:
- AVUtil:核心工具库,该模块是最基础的模块之一,下面的许多其他模块都会依赖该库做一些基本的音视频处理操作。
- AVFormat:文件格式和协议库,该模块是最重要的模块之一,封装了 Protocol 层和 Demuxer、Muxer 层,使得协议和格式对于开发者来说是透明的。
- AVCodec:编解码库,该模块也是最重要的模块之一,封装了 Codec 层,但是有一些 Codec 是具备自己的 License 的,FFmpeg 是不会默认添加像 libx264、FDK-AAC、lame 等库的,但是 FFmpeg 就像一个平台一样,可以将其他的第三方的 Codec 以插件的方式添加进来,然后为开发者提供统一的接口。
- AVFilter:音视频滤镜库,该模块提供了包括音频特效和视频特效的处理,在使用 FFmpeg 的 API 进行编解码的过程中,直接使用该模块为音视频数据做特效处理是非常方便同时也非常高效的一种方式。
- AVDevice:输入输出设备库,比如,需要编译出播放声音或者视频的工具 ffplay,就需要确保该模块是打开的,同时也需要 libSDL的预先编译,因为该设备模块播放声音与播放视频使用的都是 libSDL 库。
- SwrRessample:该模块可用于音频重采样,可以对数字音频进行声道数、数据格式、采样率等多种基本信息的转换。
- SWScale:该模块是将图像进行格式转换的模块,比如,可以将 YUV 的数据转换为 RGB 的数据。
- PostProc:该模块可用于进行后期处理,当我们使用 AVFilter 的时候需要打开该模块的开关,因为 Filter中 会使用到该模块的一些基础函数。
FFmpeg的简单使用
- 将input.avi转换成output.mp4:
ffmpeg -i input.avi output.mp4
- 增加一些要求:
ffmpeg -threads 4 -i input.avi -ab 32 -flags +loop -vol 200 -vf yadif input.mp4
-ab:设置比特率
-vol:音量提高到200%
- 转码时修改尺寸:
ffmpeg -i input.avi -s 640x320 input.mp4
- 将视频转成m3u8点播文件
ffmpeg.exe -i input.avi -strict -2 -hls_time 10 -hls_list_size 0 -c:v libx264 -c:a aac -f hls input.m3u8
-hls_time 10:每个ts文件10秒左右。这个会根据具体情况,尽量维系在10秒一个ts
-hls_list_size 0:m3u8索引里保留所有的ts路径
- 将视频转成加密的m3u8点播文件
ffmpeg -i input.mp4 -c copy -bsf:v h264_mp4toannexb -hls_time 10 -hls_list_size 0 -hls_key_info_file key_info input.m3u8
key_info需要替换成自己的路径,因为需要加密,所以需要准备二个文件一个是:key.key,一个是key_info。详细的不在这里作介绍,如果有兴趣可以看视频实际了解详细使用方法。
- 截图:
ffmpeg -ss 00:02:06 -i input.mp4 -f image2 -y poster.jpg
-ss:截图的时间点
- 连续截图:
ffmpeg -y -i input.mp4 -vf “fps=1/2,scale=iw/4:-1,tile=10x10” -an %d.png
fps=1/2:每2秒截一张图,如果是每秒截一张的话应该是fps=1
scale:所截图片大小,上面的代码是设置宽为原始的1/4大小,高度自动,相当于iw/4:ih/4,也可以设置成固定值如120:80
tile:网格化,自动将100张图合并成一张大图
- 连续截图的另外一个方法
ffmpeg -i my_dream.mp4 -vf fps=1/2 -q:v 2 -s 120x67 preview/%d.png
fps=1/2:每2秒截一张图,如果是每秒截一张的话应该是fps=1
-s:尺寸
这种方式截出来的是小图,需要自己再拼合。
本文主要是对音视频开发中的FFmpeg的技术简单的介绍以及他的原理与简单使用,有关FFmpeg的技术还有很多。可以参考以下的技术路线:摘要《音视频入门精通手册》详细类容可以查看。
最后注意
FFmpeg是一个全球领先的多媒体框架,能够友好的在大部分设备实现解码、编码、转码、复用、解复用、转码、混流、流媒体、过滤和播放。FFmpeg能够在各个平台(Linux、Mac OS X、Microsoft Windows、BSDs、Solaris等)和架构(x86、arm、mips等)中运行和编译。值得注意的是,FFMpeg并不是直接就可以用于各种视频的编解码工作,它只是一个框架。真正执行编解码工作的通常会用到其它编解码器。