目录

FFmpeg 合并视频常用命令

提取视频流

1
ffmpeg -i input.mp4 -map 0:0 -vcodec copy out.mp4

参数解释:-i-o,输入和输出不用说,-map 表示使用哪个流做为输入,0:0 表示第1个文件的每1个流。 -vcodec 所示使用流的视频,-acodec 表示使用流的音频,我们这里不加这个参数, 表示不需要音频。 copy表示要把新的流复制到新文件

同一个视频重复 N 次

1
ffmpeg -stream_loop 3 -i input.mp4 -c copy output.mp4

参数解释:-stream_loop 3 表示重复3次,-c-codec 的缩写,后边跟 copy 表示复制到新文件

多个不同的视频合并

  1. 先创建一个文本 文件list.txt,每行一个 file 空格跟文件路径:
1
2
3
4
file 'input1.mp4'
file 'input2.mp4'
file 'input3.mp4'
file 'input4.mp4'
  1. 再输入以下命令:
1
ffmpeg -f concat -i list.txt -c copy output.mp4

参数解释:-f-format的缩写,concat 表示连接输入的文件

转换视频格式(封装格式,像素格式,分辨率,帧率)

ffmpeg -i 4.mp4 -vf scale=552:294 -aspect 92:49 -r 12 -c:v mjpeg -pix_fmt yuvj444p 4.swf

实操记录

在实际操作中,部分格式(.mp4, .divx, .mod, .dv, .mxf 等)都成功了,但是在 .swf 格式上出了问题:本来是要把一段 28s 长的 swf 视频复制4次的,但是使用前述第二种方法报错了:

1
2
3
4
5
Seek to start failed.=-1.0 size=       0kB time=00:00:00.00 bitrate=N/A speed=   0x
/Users/justin/SOHU/Videos/more/xxxxx/sample_3840x2160.swf: Operation not permitted
frame=    0 fps=0.0 q=-1.0 Lsize=       0kB time=00:00:00.00 bitrate=N/A speed=   0x
video:0kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown
Output file is empty, nothing was encoded (check -ss / -t / -frames parameters if used)

可见在使用 -stream_loop n 这个参数时需要视频文件本身可以 seek 才行,只能使用上面的多个视频合并的办法了,直接使用: ffmpeg -f concat -safe 0 -i files.txt -c copy long_swf.swf 只能得到一个空的文件,不知为何,猜测是和原 swf 只有视频没有音频有关,搜索到 StackExchange 上的一篇问答(见下文参考),列出如下命令:

1
2
3
ffmpeg -f concat -i inputs.txt \
-c:v libx264 -crf 22 -preset veryfast \
-c:a libfdk_aac -q:a 3 output.mp4

鉴于原视频没有音频流,精简如下:

ffmpeg -f concat -i files.txt -c:v libx264 -crf 22 -preset veryfast output.swf

但是又报错了:

1
2
[concat @ 0x7fca33008200] Unsafe file name '/Users/justin/SOHU/Videos/more/xxxxx/s.swf'
files.txt: Operation not permitted

只好又加上 -safe 0 参数:

ffmpeg -f concat -safe 0 -i files.txt -c:v libx264 -crf 22 -preset veryfast output.swf

叕报错了…:

1
2
3
4
5
6
[libx264 @ 0x7f804c009200] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX FMA3 BMI2 AVX2
[libx264 @ 0x7f804c009200] profile High, level 5.1, 4:2:0, 8-bit
[swf @ 0x7f804c027200] SWF muxer only supports VP6, FLV, Flash Screen Video, PNG and MJPEG
Could not write header for output file #0 (incorrect codec parameters ?): Operation not permitted
Error initializing output stream 0:0 --
Conversion failed!

这下就很清楚了,swf 封装格式只支持 VP6, FLV, Flash Screen Video, PNG 和 MJPEG 编码: 修改为以下命令,就万事大吉,合成成功了:

1
2
ffmpeg -f concat -safe 0 -i files.txt \
-c:v flv -crf 22 -preset veryfast output.swf

PS.

处理 swf 文件过程中还找到一篇文章,命令中使用到了 -filter_complex 参数,貌似后边拼的参数的确如字面意思,还比较复杂,搜索了一下,好像视频加水印,还有一些滤镜的特效,都可以用这个 filter 做出来,目前不太明白,后续还是很有必要深入学习一下的,链接在此:Video-Stream-FFmpeg-Concatenate-Video-Files

参考链接:

  1. 如何使用ffmpeg去除视频声音
  2. StackOverFlow:repeat-loop-input-video-with-ffmpeg
  3. StackExchange:merge-and-convert-swf
  4. 3-easy-ways-to-concatenate-mp4-files-using-ffmpeg