FFmpeg命令过滤器
生成测试文件
-
找三个不同的视频每个视频截取10秒内容
ffmpeg -i test_video_01.mp4 -ss 00:00:00 -t 10 -codec copy test_video_01_cut.mp4 ffmpeg -i test_video_02.mp4 -ss 00:00:00 -t 10 -codec copy test_video_02_cut.mp4 ffmpeg -i test_video_03.mp4 -ss 00:00:00 -t 10 -codec copy test_video_03_cut.mp4 #如果音视频格式不统一则强制统一为: -vcodec libx264 -acodec aac
- 这些命令会将视频文件裁剪为前 10 秒,并将视频编码器设置为 libx264,音频编码器设置为 AAC。可以使用
-strict -2
参数用于避免警告信息。
- 这些命令会将视频文件裁剪为前 10 秒,并将视频编码器设置为 libx264,音频编码器设置为 AAC。可以使用
-
将上述test_video_01_cut.mp4/test_video_02_cut.mp4/test_video_03_cut.mp4转换成ts格式
ffmpeg -i test_video_01_cut.mp4 -codec copy -vbsf h264_mp4toannexb test_video_01_cut_ts.ts ffmpeg -i test_video_02_cut.mp4 -codec copy -vbsf h264_mp4toannexb test_video_02_cut_ts.ts ffmpeg -i test_video_03_cut.mp4 -codec copy -vbsf h264_mp4toannexb test_video_03_cut_ts.ts
-i test_video_01_cut.mp4
:指定输入文件为test_video_01_cut.mp4
,裁剪后的视频文件。-codec copy
:指定视频和音频编解码器都为 copy,表示将视频流和音频流直接复制到输出文件中,而不进行重新编码。-vbsf h264_mp4toannexb
:指定使用 h264_mp4toannexb 过滤器,将 H.264 编码的视频流转换为 Annex B 格式。test_video_01_cut_ts.ts
:指定输出文件名为test_video_01_cut_ts.ts
,即将转换后的视频保存为 MPEG-2 Transport Stream (TS) 格式文件。
同样的过程适用于
test_video_02_cut.mp4
和test_video_03_cut.mp4
文件。 -
转换成flv格式
ffmpeg -i test_video_01_cut.mp4 -codec copy test_video_01_cut_flv.flv ffmpeg -i test_video_02_cut.mp4 -codec copy test_video_02_cut_flv.flv ffmpeg -i test_video_03_cut.mp4 -codec copy test_video_03_cut_flv.flv
-i test_video_01_cut.mp4
:指定输入文件为test_video_01_cut.mp4
,裁剪后的视频文件。-codec copy
:指定视频和音频编解码器都为 copy,表示将视频流和音频流直接复制到输出文件中,而不进行重新编码。test_video_01_cut_flv.flv
:指定输出文件名为test_video_01_cut_flv.flv
,即将裁剪后的视频保存为 FLV 格式文件。
这些命令将输入的裁剪后的视频文件转换为 FLV 格式的文件,并保持了视频和音频编解码方式不变。
-
分离某些封装格式(例如MP4/FLV/MKV等)中的H.264的时候,需要首先写入SPS和PPS,否则会导致分离出来的数据没有SPS、PPS而无法播放。H.264码流的SPS和PPS信息存储在AVCodecContext结构体的extradata中,需要使用FFmpeg中名称为“h264_mp4toannexb”的bitstream filter处理。
开始拼接文件
-
以MP4格式进行拼接
-
ffmpeg -i "concat:test_video_01_cut.mp4|test_video_02_cut.mp4|test_video_03_cut.mp4" -codec copy output_test_video_mp4.mp4
- 这个命令将会将三个输入文件
test_video_01_cut.mp4
、test_video_02_cut.mp4
和test_video_03_cut.mp4
拼接起来,并将结果保存为output_test_video_mp4.mp4
文件,保持视频和音频流不变。
- 这个命令将会将三个输入文件
-
ffmpeg -f concat -i mp4list.txt -codec copy output_test_video_mp4.mp4
-
其中
mp4list.txt
的具体内容如下:file 'test_video_01_cut.mp4' file 'test_video_02_cut.mp4' file 'test_video_03_cut.mp4'
-
-f concat
:指定使用 concat 协议。 -
-i mp4list.txt
:指定输入文件为 mp4list.txt,其中包含了要拼接的视频文件列表。这个文件应该是一个文本文件,每行包含一个视频文件的路径。 -
-codec copy
:指定视频和音频编解码器都为 copy,表示将视频流和音频流直接复制到输出文件中,而不进行重新编码。 -
output_test_video_mp4.mp4
:指定输出文件名为 output_test_video_mp4.mp4,即将拼接后的视频保存为一个 MP4 格式文件。
确保 mp4list.txt 中的视频文件路径是正确的,并且文件列表格式正确,每行一个文件路径。这样,FFmpeg 将会按照列表中文件的顺序将它们拼接在一起,输出一个 MP4 文件。
-
-
-
以TS格式进行拼接
-
ffmpeg -i "concat:test_video_01_cut_ts.ts|test_video_02_cut_ts.ts|test_video_03_cut_ts.ts" -codec copy output_test_video_ts.mp4
-i "concat:test_video_01_cut_ts.ts|test_video_02_cut_ts.ts|test_video_03_cut_ts.ts"
:指定输入文件列表,使用 concat 协议来指定多个文件的路径,这些文件将被拼接在一起。竖线|
用于分隔文件路径。在这里,三个 TS 文件test_video_01_cut_ts.ts
、test_video_02_cut_ts.ts
和test_video_03_cut_ts.ts
被指定为输入文件。-codec copy
:指定视频和音频编解码器都为 copy,表示将视频流和音频流直接复制到输出文件中,而不进行重新编码。这保持了视频和音频的原始编码格式和质量。output_test_video_ts.mp4
:指定输出文件名为output_test_video_ts.mp4
,即将拼接后的视频保存为 MP4 格式文件。
这个命令可以将多个 TS 格式的视频文件合并成一个 MP4 文件,而不进行任何重新编码,从而快速、高效地实现文件合并。
-
ffmpeg -f concat -i tslist.txt -codec copy output_test_video_ts.mp4
-
其中
tslist.txt
的具体内容如下:file 'test_video_01_cut_ts.ts' file 'test_video_02_cut_ts.ts' file 'test_video_03_cut_ts.ts'
-
-f concat
:指定使用 concat 协议来读取输入文件。 -
-i tslist.txt
:指定输入文件为 tslist.txt,这个文件包含了要拼接的 TS 文件的路径列表。tslist.txt 应该是一个文本文件,每行包含一个 TS 文件的路径。 -
-codec copy
:指定视频和音频编解码器都为 copy,表示将视频流和音频流直接复制到输出文件中,而不进行重新编码。这保持了视频和音频的原始编码格式和质量。 -
output_test_video_ts.mp4
:指定输出文件名为 output_test_video_ts.mp4,即将拼接后的视频保存为 MP4 格式文件。
这个命令能够从一个 TS 文件列表中读取并拼接视频文件,而不进行任何重新编码,从而实现了快速、高效地文件合并。
-
-
-
以FLV格式进行拼接
-
ffmpeg -i "concat:test_video_01_cut_flv.flv|test_video_02_cut_flv.flv|test_video_03_cut_flv.flv" -codec copy output_test_video_flv.mp4
-i "concat:test_video_01_cut_flv.flv|test_video_02_cut_flv.flv|test_video_03_cut_flv.flv"
:指定输入文件列表,使用 concat 协议来指定多个文件的路径,这些文件将被拼接在一起。竖线|
用于分隔文件路径。在这里,三个 FLV 文件test_video_01_cut_flv.flv
、test_video_02_cut_flv.flv
和test_video_03_cut_flv.flv
被指定为输入文件。-codec copy
(或-c copy
):指定视频和音频编解码器都为 copy,表示将视频流和音频流直接复制到输出文件中,而不进行重新编码。这保持了视频和音频的原始编码格式和质量。output_test_video_flv.mp4
:指定输出文件名为output_test_video_flv.mp4
,即将拼接后的视频保存为 MP4 格式文件。
这个命令可以将多个 FLV 格式的视频文件合并成一个 MP4 文件,而不进行任何重新编码,从而实现了快速、高效地文件合并。
-
ffmpeg -f concat -i flvlist.txt -codec copy output_test_video_flv.mp4
-
其中
flvlist.txt
的具体内容如下:file 'test_video_01_cut_flv.flv' file 'test_video_02_cut_flv.flv' file 'test_video_03_cut_flv.flv'
-
-f concat
:指定使用 concat 协议来读取输入文件。 -
-i flvlist.txt
:指定输入文件为 flvlist.txt,这个文件包含了要拼接的 FLV 文件的路径列表。flvlist.txt 应该是一个文本文件,每行包含一个 FLV 文件的路径。 -
-codec copy
(或-c copy
):指定视频和音频编解码器都为 copy,表示将视频流和音频流直接复制到输出文件中,而不进行重新编码。这保持了视频和音频的原始编码格式和质量。 -
output_test_video_flv.mp4
:指定输出文件名为 output_test_video_flv.mp4,即将拼接后的视频保存为 MP4 格式文件。
这个命令能够从一个 FLV 文件列表中读取并拼接视频文件,而不进行任何重新编码,从而实现了快速、高效地文件合并。
-
-
-
方法1只适用于部分封装格式,比如TS
-
建议:
- 使用方法2进行拼接
- 转换成TS格式再进行拼接
测试不同编码拼接
-
修改音频编码
ffmpeg -i test_video_02.mp4 -vcodec copy -acodec ac3 -vbsf h264_mp4toannexb test_video_02_ac3_h264.mp4
-i test_video_02.mp4
:指定输入文件为test_video_02.mp4
。-vcodec copy
:指定视频编解码器为 copy,表示直接复制视频流而不进行重新编码。-acodec ac3
:指定音频编解码器为 AC-3,表示重新编码音频流为 AC-3 格式。-vbsf h264_mp4toannexb
:指定视频比特流过滤器,用于将 H.264 视频流重新封装为 H.264 Annex B 格式。test_video_02_ac3_h264.mp4
:指定输出文件名为test_video_02_ac3_h264.mp4
,即将结果保存为该文件。
这个命令可以实现将输入文件的视频流直接复制,音频流重新编码为 AC-3 格式,并重新封装视频流为 H.264 Annex B 格式的功能。
ffmpeg -i "concat:test_video_01_cut_ts.ts|test_video_02_cut_ts.ts|test_video_03_cut_ts.ts" -codec copy output_test_video.mp4 #第二段没声音
-i "concat:test_video_01_cut_ts.ts|test_video_02_cut_ts.ts|test_video_03_cut_ts.ts"
:指定输入文件为通过 concat 协议拼接的多个 TS 文件。这个参数告诉 FFmpeg 从这些文件中读取数据,并进行拼接操作。每个文件路径之间使用竖线|
分隔。-codec copy
(或-c copy
):指定视频和音频编解码器都为 copy,表示将视频流和音频流直接复制到输出文件中,而不进行重新编码。这样可以保持视频和音频的原始编码格式和质量。output_test_video.mp4
:指定输出文件名为output_test_video.mp4
,即将拼接后的视频保存为 MP4 格式文件。
这个命令能够将多个 TS 格式的视频文件合并成一个 MP4 文件,而不进行任何重新编码,从而实现了快速、高效地文件合并。
-
修改音频采样率
ffmpeg -i test_video_02.mp4 -vcodec copy -acodec aac -ar 96000 -vbsf h264_mp4toannexb test_video_02_cut_ts.ts
-i test_video_02.mp4
:指定输入文件为test_video_02.mp4
。-vcodec copy
:指定视频编解码器为 copy,表示直接复制视频流而不进行重新编码。-acodec aac
:指定音频编解码器为 AAC,表示重新编码音频流为 AAC 格式。-ar 96000
:指定音频采样率为 96000 Hz,这是 AAC 格式的典型采样率之一。-vbsf h264_mp4toannexb
:指定视频比特流过滤器,用于将 H.264 视频流重新封装为 H.264 Annex B 格式。test_video_02_cut_ts.ts
:指定输出文件名为test_video_02_cut_ts.ts
,即将结果保存为该文件。
这个命令可以实现将输入文件的视频流直接复制,音频流重新编码为 AAC 格式,并重新封装视频流为 H.264 Annex B 格式的功能。
ffmpeg -i "concat:test_video_01_cut_ts.ts|test_video_02_cut_ts.ts|test_video_03_cut_ts.ts" -codec copy output_test_video.mp4 #第二段播放异常
-
修改视频编码格式
ffmpeg -i test_video_01_cut.mp4 -acodec copy -vcodec libx265 test_video_02_cut_ts.ts
-i test_video_01_cut.mp4
:指定输入文件为test_video_01_cut.mp4
。-acodec copy
:指定音频编解码器为 copy,表示直接复制音频流而不进行重新编码。-vcodec libx265
:指定视频编解码器为 libx265,表示将视频流重新编码为 H.265 格式。test_video_02_cut_ts.ts
:指定输出文件名为test_video_02_cut_ts.ts
,即将结果保存为该文件。
这个命令将视频流重新编码为 H.265 格式,并将音频流直接复制到输出文件中,以保持音频的原始编码格式和质量。
ffmpeg -i "concat:test_video_01_cut_ts.ts|test_video_02_cut_ts.ts|test_video_03_cut_ts.ts" -codec copy output_test_video.mp4
-
修改视频分辨率
ffmpeg -i test_video_01_cut.mp4 -acodec copy -vcodec libx264 -s 800x600 -vbsf h264_mp4toannexb test_video_01_cut_ts.ts
-i test_video_01_cut.mp4
:指定输入文件为test_video_01_cut.mp4
。-acodec copy
:指定音频编解码器为 copy,表示直接复制音频流而不进行重新编码。-vcodec libx264
:指定视频编解码器为 libx264,表示将视频流重新编码为 H.264 格式。-s 800x600
:指定输出视频的分辨率为 800x600。-vbsf h264_mp4toannexb
:指定视频比特流过滤器,用于将 H.264 视频流重新封装为 H.264 Annex B 格式。test_video_01_cut_ts.ts
:指定输出文件名为test_video_01_cut_ts.ts
,即将结果保存为该文件。
这个命令将视频流重新编码为 H.264 格式,并将音频流直接复制到输出文件中,以保持音频的原始编码格式和质量。同时,指定了输出视频的分辨率为 800x600。
ffmpeg -i "concat:test_video_01_cut_ts.ts|test_video_02_cut_ts.ts|test_video_03_cut_ts.ts" -codec copy out4.mp4
- 音视频默认显示窗口会以第一个
test_video_01_cut_ts.ts
修改后的分辨率800x600
为基准
-
注意:
- 把每个视频封装格式统一为ts,拼接输出的时候再输出需要的封装格式,比如MP4等
- 视频分辨率可以不同,但是编码格式需要统一
- 音频编码格式以及音频参数(采样率/声道等)也需要统一