ffmpeg的常用选项
基础指令
一.查看FFmpeg支持的编码器
1 | ffmpeg configure -encoders |
二.查看FFmpeg支持的解码器
1 | ffmpeg configure -decoders |
三.查看FFmpeg支持的通信协议
1 | ffmpeg configure -protocols |
四.查看FFmpeg所支持的音视频编码格式、文件封装格式与流媒体传输协议
1 | ffmpeg configure --help |
map选项
默认情况下只在输入文件中的每种流里选择第一个流。
需要指定放入输出文件的流就需要使用-map选项。
用法举例:
-map 0
From input index #0 (the 1st input) select all streams.
-map 1:a
From input index #1 (the 2nd input) select all audio streams.
-map 3:s:4
From input index #3 (the 4th input) select subtitle stream index #4 (the fifth subtitle stream)。
-map 0 -map -0:s
Will select all streams from input index #0 (the 1st input) except subtitles.
改变视频帧率
有两种方法可以改变输出文件的视频流帧率:
- 使用 -r 选项
- 使用 fps滤镜。
1 | ffmpeg -i [inputfile] -r 30 [output] |
有两种方法可以改变输出文件的视频流帧率:
改变默认音轨
使用ffmpeg修改默认的音频轨道,先取消第二音轨的默认值,在设置为第一音轨。
1 | ffmpeg -i input.mkv -map 0:0 -map 0:1 -map 0:2 -c copy -disposition:a:1 0 -disposition:a:0 default -y output.mp4 |
改变音频采样率
-ar 48k 44.1k 96k
1 | ffmpeg -i input.dsf -map 0:0 -c:0 flac -ar:0 96k output.flac |
改变音频通道数量
-ac
1 | ffmpeg -i input.dsf -map 0:0 -c:0 flac -ar:0 96k -ac:0 2 -filter:0 aformat=channel_layouts=stereo output.flac |
1 | ffmpeg -i input.dsf -map 0:0 -c:0 flac -ar:0 96k -ac:0 6 -filter:0 aformat=channel_layouts=5.1 output.flac |
改变音频位深 bit depth
-sample_fmt
1 | ffmpeg -i input.dsf -map 0:0 -c:0 flac -ar:0 96k -sample_fmt s24 -ac:0 6 -filter:0 aformat=channel_layouts=5.1 output.flac |
生成空白音频
可以使用anullsrc来生成静音音频:
1 | ffmpeg -f lavfi -i anullsrc=r=48000:cl=stereo -t 0.875 /Users/redtux/Movies/converted/silent-audio.aac |
sample_rate, r
指定采样率,默认44100。channel_layout, cl
指定通道布局,详见libavutil/channel_layout.c
中channel_layout_map
定义,常见mono
stereo
5.1
。-t
文件时长,单位事秒,不指定就一直生成。
截取视频片段
1 | ffmpeg -i 源文件名 -vcodec copy -acodec copy -ss 00:00:10 -to 00:00:15 目标文件名 -y |
视频拼接
一.将4个视频拼接成一个很长的视频(无声音)
1 | ffmpeg -i 0.mp4 -i 1.mp4 -i 2.mp4 -i 3.mp4 -filter_complex '[0:0][1:0] [2:0][3:0] concat=n=4:v=1 [v]' -map '[v]' output.mp4 |
二.将4个视频拼接成一个很长的视频(有声音)
1 | ffmpeg -i 1.mp4 -i 2.mp4 -i 3.mp4 -filter_complex '[0:0][0:1] [1:0][1:1] [2:0][2:1] concat=n=3:v=1:a=1 [v][a]' -map '[v]' -map '[a]’ output.mp4 |
参数解释:
1 | [0:0][0:1] [1:0][1:1] [2:0][2:1] |
四.竖向拼接2个视频
1 | ffmpeg -i 0.mp4 -i 1.mp4 -filter_complex "[0:v]pad=iw:ih*2[a];[a][1:v]overlay=0:h" out_2.mp4 |
五.横向拼接3个视频
1 | ffmpeg -i 0.mp4 -i 1.mp4 -i 2.mp4 -filter_complex "[0:v]pad=iw*3:ih*1[a];[a][1:v]overlay=w[b];[b][2:v]overlay=2.0*w" out_v3.mp4 |
六.竖向拼接3个视频
1 | ffmpeg -i 0.mp4 -i 1.mp4 -i 2.mp4 -filter_complex "[0:v]pad=iw:ih*3[a];[a][1:v]overlay=0:h[b];[b][2:v]overlay=0:2.0*h" out_v4.mp4 |
七.4个视频2x2方式排列
1 | ffmpeg -i 0.mp4 -i 1.mp4 -i 2.mp4 -i 3.mp4 -filter_complex "[0:v]pad=iw*2:ih*2[a];[a][1:v]overlay=w[b];[b][2:v]overlay=0:h[c];[c][3:v]overlay=w:h" out.mp4 |
视频帧操作
一.查看每帧的信息
1 | ffprobe -v error -show_frames gemfield.mp4 |
从pict_type=I可以看出这是个关键帧,然后key_frame=1 表示这是IDR frame,如果key_frame=0表示这是Non-IDR frame。
二.截取视频中的某一帧
把gemfield.mp4视频的第1分05秒的一帧图像截取出来。
1 | # input seeking |
参数解释:
-frame:v 1,在video stream上截取1帧。
input seeking使用的是key frames,所以速度很快;而output seeking是逐帧decode,直到1分05秒,所以速度很慢。
重要说明:
ffmpeg截取视频帧有2种 seeking 方式,对应有2种 coding 模式:transcoding 和 stream copying(ffmpeg -c copy)。
transcoding 模式:需要 decoding + encoding 的模式,即先 decoding 再encoding。
stream copying 模式:不需要decoding + encoding的模式,由命令行选项-codec加上参数copy来指定(-c:v copy )。在这种模式下,ffmpeg在video stream上就会忽略 decoding 和 encoding步骤。
三.查看视频总帧数
1 | ffprobe -v error -count_frames -select_streams v:0 -show_entries stream=nb_frames -of default=nokey=1:noprint_wrappers=1 gemfield.mp4 |
四.查看 key frame 帧数
1 | ffprobe -v error -count_frames -select_streams v:0 -show_entries stream=nb_read_frames -of default=nokey=1:noprint_wrappers=1 -skip_frame nokey gemfield.mp4 |
五.查看 key frame 所在的时间
1 | ffprobe -v error -skip_frame nokey -select_streams v:0 -show_entries frame=pkt_pts_time -of csv=print_section=0 gemfield.mp4 |
六.查看 key frame 分布的情况
1 | ffprobe -v error -show_frames gemfield.mp4 | grep pict_type |
七.查看 key frame 所在的帧数
1 | ffprobe -v error -select_streams v -show_frames -show_entries frame=pict_type -of csv gemfield.mp4 | grep -n I | cut -d ':' -f 1 |
八.重新设置 key frame interval
1 | ffmpeg -i gemfield.mp4 -vcodec libx264 -x264-params keyint=1:scenecut=0 -acodec copy out.mp4 |
九.查看视频波特率
1 | ffprobe -v error -select_streams v:0 -show_entries stream=bit_rate -of default=noprint_wrappers=1:nokey=1 gemfield.mp4 |
调整播放速度
调整视频文件中视频速度:
1 | //2倍速播放 |
调整视频文件中音频速度:
1 | ffmpeg -i test.mp4 -filter:a "atempo=2.0" -vn out_test.mp4 |
同时调整视频文件的视频、音频:
1 | ffmpeg -i test.mp4 -filter_complex "[0:v]setpts=0.5*PTS[v];[0:a]atempo=2.0[a]" -map "[v]" -map "[a]" out_test.mp4 |
如果不想丢帧就同时设置 -r
,把帧率设置为原帧率的2倍。
metadata的使用
1 | ffmpeg -i /Users/redtux/Movies/Becoming.Jane.2007.1080p.BluRay.x265.2Audio.mp4 -metadata title="Becoming.Jane.2007.1080p.BluRay.x265.2Audio-RARBG" -map 0:0 -c:0 copy -metadata:s:0 title='Becoming.Jane.2007.1080p.BluRay.x265-RARBG' -metadata:s:0 handler='Becoming.Jane.2007.1080p.BluRay.x265-RARBG' -map 0:1 -c:1 copy -metadata:s:1 title="国语配音" -metadata:s:1 handler="国语配音" -metadata:s:1 language="chi" -disposition:1 default -map 0:2 -c:2 copy -metadata:s:2 title="English" -metadata:s:2 handler="English" -metadata:s:2 language="eng" -disposition:2 0 /Users/redtux/Movies/Becoming.Jane.2007.1080p.BluRay.x265.2Audio-RARBG.mp4 |
提取mp4文件中的封面
1 | ffmpeg -i input.mp4 -map 0:v -map -0:V -c copy ./cover.jpg |
设置mp4文件的封面
1 | ffmpeg -i video.mp4 -i image.png -map 1 -map 0 -c copy -disposition:0 attached_pic out.mp4 |
综合实例
1 | ffmpeg -y -i input.mp4 \ |
ffprobe命令
ffprobe是ffmpeg中一个查看多媒体文件信息的模块。此模块可以用来查看多媒体文件格式以及编码。ffprobe的命令较多,这里只简单的列举了一些比较常用的命令。
1 | -L 显示协议 |
举个例子说明一下:
1 | ffprobe -show_format test.mp4 -print_format json |
输出为:
1 | { |
Select滤镜常用场景
select滤镜的使用方法见官网
1.提取视频关键帧
1 | ffmpeg -i input.mp4 -an -vf select='eq(pict_type\,I)' -vsync 2 -c:v png image-%03d.png |
2.创建缩略图
1 | ffmpeg -i input.mp4 -vf select='gt(scene\,0.4)',scale=-1:200,tile=4x10 -frames:v 1 preview.png |
3.裁剪视频文件的多个部分,并将其合并成一个新的视频
使用选择滤镜
1 | ffmpeg -i video -vf "select='between(t,4,6.5)+between(t,17,26)+between(t,74,91)',setpts=N/FRAME_RATE/TB" -af "aselect='between(t,4,6.5)+between(t,17,26)+between(t,74,91)',asetpts=N/SR/TB" out.mp4 |
select及其对应的滤波器分别应用于视频和音频,选择的分段是4到6.5秒,17到26秒,最后是74到91秒;时间戳与设置点及其对应的过滤器保持连续。