FFmpeg音视频处理详解及实战
1 介绍
项目由 在2000年创立。到目前为止,项目的开发者仍然与VLC、MPV、dav1d、x264等多媒体开源项目有着广泛的重叠。( Mpeg)是一款遵循GPL的开源软件,在音视频处理方面表现十分优秀,几乎囊括了现存所有的视音频格式的编码,解码、转码、混合、过滤及播放。作为最受欢迎的视频和图像处理软件,它被来自各行各业的不同公司所广泛使用。同时也是一款跨平台的软件,完美兼容Linux、、Mac OSX等平台。其实它由3大部件组成,号称音视频处理工具三剑客:
应该是 工具集中最核心的利器,支持多种多样的编码器、解码器、封装格式、滤镜功能。框架的基本组成包含、、、、等模块库,结构图如下:
(1)–的封装模块
中实现了目前多媒体领域中的绝大多数媒体封装格式,包括封装和解封装,如MP4、FLV、KV、TS等文件封装格式,RTMP、RTSP、MMS、HLS等网络协议封装格式。是否支持某种媒体封装格式,取决于编译时是否包含了该格式的封装库。根据实际需求,可进行媒体封装格式的扩展,增加自己定制的封装格式,即在中增加自己的封装处理模块。
(2)–的编解码模块
中实现了目前多媒体领域绝大多数常用的编解码格式,即支持编码,也支持解码。除了支持MPEG4、AAC、MJPEG等自带的媒体编解码格式之外,还支持第三方的编解码器,如H.264(AVC)编码,需要使用x264编码器;H.265(HEVC)编码,需要使用x264编码器;MP3()编码,需要使用编码器。如果希望增加自己的编码格式,或者硬件编解码,则需要在中增加相应的编解码模块。
(3)–的滤镜模块
库提供了一个通用的音频、视频、字幕等滤镜处理框架。在中,滤镜框架可以有多个输入和多个输出。
(4)–的音频转换计算模块
模块提供了高级别的音频重采样API。例如允许操作音频采样、音频通道布局转换与布局调整。
(5)–的视频图像转换计算模块
模块提供了高级别的图像转换API,例如它允许进行图像缩放和像素格式转换,常见于将图像从1080p转换成720p或者480p等的缩放,或者将图像数据从转换成YUYV,或者YUV转RGB等图像格式转换。
2 conda环境安装 (1)环境安装
安装方法详见:安装
(2)安装
conda install ffmpeg
3 命令
提供的命令行(CLI)工具,其使用方法如下(方括号表示可选项,花括号表示必选项目):
ffmpeg [global options] {[infile options]['-i' 'infile'] ...} {[outfile options] 'outfile' ...}
参数选项由三部分组成:可选的一组全局参数、一组或多组输入文件参数、一组或多组输出文件参数,其中,每组输入文件参数以‘-i’为结束标记;每组输出文件参数以输出文件名为结束标记。
(1)能力集列表
使用方法:
ffmpeg configure -encoders
(2)常用输入选项
对于输入,以下选项通常是自动识别的,但也可以强制设定。
(3)常用输出选项 (4)流标识
的某些选项可以对一个特定的媒体流起作用,这种情况下需要在选项后面增加一个流标识。流标识允许以下几种格式:
假如要设定第二个音频流为copy,则需要指定-codec:a:1 copy
(5)音频选项 (6)视频选项 (7)高级选项 4 使用示例 (1)视频播放
input.mp4
- input.mp4
-i input.mp4 - 16:9 .mp4
(2)视频压缩与拼接
-i demo.mp4 - h264 -vf scale=640:-2 - 4 .mp4
-i demo.mp4 - -2 - h264 .mp4
-i 0.mp4 -i 1.mp4 -i 2.mp4 -i 3.mp4 - '[0:0][1:0] [2:0][3:0] =n=4:v=1 [v]' -map '[v]' .mp4
-i 1.mp4 -i 2.mp4 -i 3.mp4 - '[0:0][0:1] [1:0][1:1] [2:0][2:1] =n=3:v=1:a=1 [v][a]' -map '[v]' -map '[a]’ .mp4
-i 0.mp4 -i 1.mp4 - "[0:v]pad=iw*2:ih*1[a];[a][1:v]=w" out.mp4
-i 0.mp4 -i 1.mp4 - "[0:v]pad=iw:ih*2[a];[a][1:v]=0:h" out_2.mp4
-i 0.mp4 -i 1.mp4 - "[0:v]pad=iw:ih*2[a];[a][1:v]=0:h" out_2.mp4
-i 0.mp4 -i 1.mp4 -i 2.mp4 - "[0:v]pad=iw:ih*3[a];[a][1:v]=0:h[b];[b][2:v]=0:2.0*h" .mp4
-i 0.mp4 -i 1.mp4 -i 2.mp4 -i 3.mp4 - "[0:v]pad=iw*2:ih*2[a];[a][1:v]=w[b];[b][2:v]=0:h[c];[c][3:v]=w:h" out.mp4
(2)视频帧操作
-v error - .mp4
-y -i demo.mp4 -ss 00:03:22.000 - 1 -an .jpg
-v error - - v:0 - = -of =nokey=1:=1 .mp4
-v error - - v:0 - = -of =nokey=1:=1 .mp4
-v error - - v:0 - = -of =nokey=1:=1 - nokey .mp4
-v error - nokey - v:0 - frame= -of csv==0 .mp4
-v error - .mp4 | grep
-v error - v - - frame= -of csv .mp4 | grep -n I | cut -d ':' -f 1
-i .mp4 - -x264- =1:=0 - copy out.mp4
-v error - v:0 - = -of ==1:nokey=1 .mp4
(3)图片与视频
-i demo.avi -vf scale=640:640 .avi
-i .mp4 -an -.mp4
-i input.mp4 - copy -an .mp4
-i test.asf -y -f -t 0.001 -s a.jpg
-i test.asf - 30 -y -f gif a.gif
-i test.avi -y -f -ss 8 -t 0.001 -s test.jpg
-i demo.avi - copy - copy .mp4
-i video.mp4 -i .srt -c:v copy -c:a copy - -c:s -map 0 -map 1 .mp4
-y -i test.mpeg - - h263 -b 128 -r 15 -s
- aac -ac 2 -ar 22500 -ab 24 -f 3gp test.3gp
-re -i demo.mp4 - copy - -s -map 0:0 -f rtp rtp://10.10.10.100:1234 -map 0:1 -f rtp rtp://10.10.10.100:1238 > /var/www/live.sdp
- mpeg4 -b 1000 -r 10 -g 300 -vd x11:0,0 -s ~/test.avi
- mpeg4 -b 1000 -r 10 -g 300 -i ~/test.avi -s 800×600 ~/test-800-600.avi
-f -s 320*240 -r 10 -i /dev/ test.asf
-f -i 'in%6d.jpg' - -r 25 -b 200k test.mp4
方法1:不规则图片名称合成视频文件
- 10 - glob -i '*.jpg' out.mp4
cat *.png | -f -i - .mp4
方法2:先动手把不规则文件重命名规则图片名。
def getTpyeFile(filelist, type): res = [] for item in filelist:name, suf = os.path.splitext(item) # 文件名,后缀if suf == type:res.append(item)return respwd = os.getcwd() # 返回当前目录的绝对路径
dirs = os.listdir() # 当前目录下所有的文件名组成的数组
typefiles = getTpyeFile(dirs, '.jpg')for i in range(0,len(typefiles)):os.rename(typefiles[i],"./%d.jpg" % (i)) #将文件以数字规则命令
将需要合成的图片放在txt中,通过读取txt文件合并成视频。
-f -i files.txt .mp4
-i .mp4 -r 24 .mp4
-i .mp4 -c:v -ac 2 -c:a aac - -2 -b:a 128k -crf 28 .mp4
(4)音频处理
demo.ape
- 1 demo.ape
- 2 demo.ape
-i video.mp4 -vn audio.mp3
-i video.mp4 -vn -ab 128k audio.mp3
-loop 1 -i image.jpg -i audio.wav -c:v -c:a aac - -b:a 192k - .mp4
-f alsa -i hw:0 -t 100 .wav
-f alsa -i - aac - -2 -b:a 128k -r 44100 /var/www/data/main.m3u8
-i .mp3 -ab 128k .mp3
-i .mp3 -b:a 192k .mp3
(5)格式转换
-i input.mp4 - -2 - h264 .mp4
-i input.mp4 - -2 - mpeg4 .mp4
-i in.webp out.jpg
-i in.webp out.png
-i in.jpg out.png
-i in.jpg out.webp
-i in.png out.webp
-i in.png out.jpg
(6)其它指令
-
-
-
--help
-i .mp4 -t 5 .mp4
-i .wav -t 00:00:05 .wav
通过 -ss 给出一个开始时间,-to 给出结束时间
-i .mp3 -ss 00:01:14 .mp3
-i .wav -ss 00:00:30 -t 10 .wav
-i .h264 -ss 00:01:30 -to 00:01:40 .h264
-i .ogg -ss 5 .ogg