提取视频流
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
表示复制到新文件
多个不同的视频合并
- 先创建一个文本 文件
list.txt
,每行一个 file
空格跟文件路径:
1
2
3
4
|
file 'input1.mp4'
file 'input2.mp4'
file 'input3.mp4'
file 'input4.mp4'
|
- 再输入以下命令:
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
参考链接:
- 如何使用ffmpeg去除视频声音
- StackOverFlow:repeat-loop-input-video-with-ffmpeg
- StackExchange:merge-and-convert-swf
- 3-easy-ways-to-concatenate-mp4-files-using-ffmpeg