使用ffmpeg合并视频文件的三种方法
来源:互联网 发布:北京软件开发平均工资 编辑:程序博客网 时间:2024/05/16 11:28
ffmpeg合并视频的方法有三种。国内大多数仅介绍了其中之一。于是觉得有必要翻译一下。其实在ffmpeg的 FAQ文档中有比较详细的说明。
使用concat协议进行视频文件的合并
这种方式的适用场景是:视频容器是MPEG-1, MPEG-2 PS或DV等可以直接进行合并的。换句话说,其实可以直接用cat或者copy之类的命令来对视频直接进行合并。很多文章介绍了这种方法,但适用性却没有提及。这并不是一个通用的方法。典型的命令示例如下:
使用concat demuxer进行视频文件的合并
这种合并方式的适用场景是:当容器格式不支持文件层次的合并,而又不想(不需要)进行再编码的操作的时候。这种方式对源视频同样有同格式同性质的要求。其详细语法参见 这里 。典型的命令示例如下:
其中,Cam01.txt 为包含了输入文件的描述文件。
使用concat滤镜(filter)进行视频文件的合并:
当需要进行任意程度的重新编解码时,官方推荐使用的方法即是用concat滤镜来进行视频文件的合并处理。详细说明参见 这里 。典型命令示例如下:
这段命令目的是将三段双语格式的视频合并至最终的一段视频(output.mkv)。参数n=3说明待合成的视频有三段,v=1说明视频流为一,a=2说明音频流为二。 -map参数的详细说明可以从Filtergraph文档中找到。
FFMpeg无损合并视频的多种方法
http://blog.csdn.net/doublefi123/article/details/47276739
众所周知,从某些视频网站下载的视频是分段的。比如新浪视频每隔6分钟分段,俗称“6分钟诅咒”。
现在的任务是将这些视频片段合并起来,并且尽量无损。
方法一:FFmpeg concat 协议
对于 MPEG 格式的视频,可以直接连接:
ffmpeg -i "concat:input1.mpg|input2.mpg|input3.mpg" -c copy output.mpg
对于非 MPEG 格式容器,但是是 MPEG 编码器(H.264、DivX、XviD、MPEG4、MPEG2、AAC、MP2、MP3 等),可以包装进 TS 格式的容器再合并。在新浪视频,有很多视频使用 H.264 编码器,可以采用这个方法
ffmpeg -i input1.flv -c copy -bsf:v h264_mp4toannexb -f mpegts input1.tsffmpeg -i input2.flv -c copy -bsf:v h264_mp4toannexb -f mpegts input2.tsffmpeg -i input3.flv -c copy -bsf:v h264_mp4toannexb -f mpegts input3.tsffmpeg -i "concat:input1.ts|input2.ts|input3.ts" -c copy -bsf:a aac_adtstoasc -movflags +faststart output.mp4
保存 QuickTime/MP4 格式容器的时候,建议加上 -movflags +faststart。这样分享文件给别人的时候可以边下边看。
方法二:FFmpeg concat 分离器(h ok mp4)
这种方法成功率很高,也是最好的,但是需要 FFmpeg 1.1 以上版本。先创建一个文本文件filelist.txt:
file 'input1.mkv'file 'input2.mkv'file 'input3.mkv'
然后:
ffmpeg -f concat -i filelist.txt -c copy output.mkv
注意:使用 FFmpeg concat 分离器时,如果文件名有奇怪的字符,要在 filelist.txt 中转义。
方法三:Mencoder 连接文件并重建索引
这种方法只对很少的视频格式生效。幸运的是,新浪视频使用的 FLV 格式是可以这样连接的。对于没有使用 MPEG 编码器的视频(如 FLV1 编码器),可以尝试这种方法,或许能够成功。
mencoder -forceidx -of lavf -oac copy -ovc copy -o output.flv input1.flv input2.flv input3.flv
方法四:使用 FFmpeg concat 过滤器重新编码(有损)
语法有点复杂,但是其实不难。这个方法可以合并不同编码器的视频片段,也可以作为其他方法失效的后备措施。
ffmpeg -i input1.mp4 -i input2.webm -i input3.avi -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.mkv
如你所见,上面的命令合并了三种不同格式的文件,FFmpeg concat 过滤器会重新编码它们。注意这是有损压缩。
[0:0] [0:1] [1:0] [1:1] [2:0] [2:1] 分别表示第一个输入文件的视频、音频、第二个输入文件的视频、音频、第三个输入文件的视频、音频。concat=n=3:v=1:a=1 表示有三个输入文件,输出一条视频流和一条音频流。[v] [a] 就是得到的视频流和音频流的名字,注意在 bash 等 shell 中需要用引号,防止通配符扩展。
提示
- 以上三种方法,在可能的情况下,最好使用第二种。第一种次之,第三种更次。第四种是后备方案,尽量避免。
- 规格不同的视频合并后可能会有无法预测的结果。
- 有些媒体需要先分离视频和音频,合并完成后再封装回去。
- 对于 Packed B-Frames 的视频,如果封装成 MKV 格式的时候提示 Can't write packet with unknown timestamp,尝试在 FFmpeg 命令的 ffmpeg 后面加上 -fflags +genpts
阅读全文
0 0
- 使用ffmpeg合并视频文件的三种方法
- 使用ffmpeg合并视频文件的三种方法
- 使用ffmpeg合并视频文件的三种方法
- 使用ffmpeg合并视频文件的三种方法
- 使用ffmpeg合并视频文件的三种方法
- 使用ffmpeg合并视频文件的三种方法
- 使用ffmpeg合并视频文件的三种方法
- 使用ffmpeg合并视频文件的三种方法
- ffmpeg 合并 音视频文件
- ffmpeg 合并视频文件
- 使用ffmpeg播放视频文件的过程
- 使用ffmpeg循环推流(循环读取视频文件)推送EasyDSS RTMP流媒体服务器的方法
- 腾讯视频文件的合并
- 使用 ffmpeg 截取视频文件图片
- ffmpeg之多个MP4视频合并一个MP4视频文件(附遇见的bug)
- 三种字符数组合并的方法
- 三种字符数组合并的方法
- FFMpeg无损合并视频的多种方法
- Java 匿名内部类 概述
- nyoj1000&&hdu4549 M斐波那契数列 递推公式+矩阵
- 179. Largest Number
- 萌新开始学安卓啦
- 悲观锁
- 使用ffmpeg合并视频文件的三种方法
- hive查询与优化
- 2017/8/9 离线赛
- 机器学习算法总结--随机森林
- react native Text实现限制行数不显示省略号,尾部直接截断
- JAVA常用日期比较操作说明
- 说一说排序算法,稳定性,复杂度
- vue
- 数字签名与数字证书技术简介(一)