使用ffmpeg连接音视频
众所周知,从某些视频网站下载的视频是分段的。比如新浪视频每隔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.ts
ffmpeg -i input2.flv -c copy -bsf:v h264_mp4toannexb -f mpegts input2.ts
ffmpeg -i input3.flv -c copy -bsf:v h264_mp4toannexb -f mpegts input3.ts
ffmpeg -i "concat:input1.ts|input2.ts|input3.ts" -c copy -bsf:a aac_adtstoasc -movflags +faststart output.mp4
保存 QuickTime/MP4 格式容器的时候,建议加上 -movflags +faststart
。这样分享文件给别人的时候可以边下边看。
- 方法二:
FFmpeg concat
分离器
这种方法成功率很高,也是最好的,但是需要 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
官网地址
ffmpeg -i tmp/1.wav -i tmp/3.wav -filter_complex '[0:0] [1:0]
concat=n=2:v=0:a=1[out]' -map '[out]' tmp/concat_1.wav
使用ffmpeg连接音视频相关推荐
- 基于ffmpeg的音视频转码、压制、录屏、裁切、合并、提取
ffmpeg转码.压制.录屏.裁切.合并.提取 1.ffmpeg介绍 2.转换格式 3.音频转码 4.视频转码 5.码率控制模式 6.合并.提取音视频 7.截取.连接音视频 8.截图.水印.动图 9. ...
- 【FFmpeg】使用 FFmpeg 处理音视频格式转换流程 ( 解复用 | 解码 | 帧处理 | 编码 | 复用 )
FFmpeg 系列文章目录 [FFmpeg]Windows 搭建 FFmpeg 命令行运行环境 [FFmpeg]FFmpeg 相关术语简介 [FFmpeg]FFmpeg 相关术语简介 二 [FFmpe ...
- 使用ffmpeg打印音视频的详细信息
使用ffmpeg打印音视频的详细参数非常简单,仅仅需要三个函数接口实现: /*所有进行操作前,先执行以下,否则需要自己制定类型*/av_register_all/*Open an input stre ...
- FFmpeg Android 学习(一):Android 如何调用 FFMPEG 编辑音视频
一.概述 在Android开发中,我们对一些音视频的处理比较无力,特别是编辑音视频这部分.而且在Android上对视频编辑方面,几乎没有任何API做支持,MediaCodec(硬编码)也没有做支持.那 ...
- FFMPEG开源音视频项目学习汇总
~非常感谢雷霄骅老师的无私帮助,本文转载自:http://blog.csdn.net/leixiaohua1020/article/details/42658139~ 本文汇总一下自己视音 ...
- C# 调用FFmpeg处理音视频的示例
FFmpeg 开源.跨平台.体积小.功能强大,提供了录制.转换以及流化音视频的完整解决方案. 官网:https://www.ffmpeg.org/ 百科:https://baike.baidu.com ...
- javaCV入门指南:调用FFmpeg原生API和JavaCV是如何封装了FFmpeg的音视频操作?
JavaCV入门指南系列: JavaCV入门指南:序章(看完本章后,不想看原理的小伙伴可直接跳转到<快速上手篇>) JavaCV入门指南:调用FFmpeg原生API和JavaCV是如何封装 ...
- linux下ffmpeg采集音视频设备
Linux下查看音视频设备 1.视频输入设备: 命令查看:ls /sys/class/video4linux/ 执行结果如下: 如果系统存在video4linux文件夹说明已安装过视频驱动,video ...
- ffmepg:使用ffmpeg转换音视频格式
收藏一下大神的作品:https://blog.csdn.net/ETalien_/article/details/102917887 使用ffmpeg转换音视频格式 转换音频格式 ffmpeg -i ...
最新文章
- Spring应用架构
- null或空值的判断处理-java
- 【论文笔记】From Facial Parts Responses to Face Detection: A Deep Learning Approach
- Jenkins+Spring Boot构建部署
- win10下怎么运行java,如何在Windows 10中运行Java程序
- android 性能测试 简介,android性能测试工具traceview简介[转载]
- webex java插件_Linux安装Java和Webex
- python 图片文字转换成word_如何把图片文字转换成word文字?
- 使用函数求余弦函数的近似值
- 人脸识别门禁系统设计(一)
- 9步搞定:用迅雷等工具下载百度网盘资源
- 精选1000个机械原理动图
- oracle执行计划px,【Oracle】并行等待之PX Deq: Execution Msg
- C++封装dll供C#调用获取U盘/磁盘序列号信息
- 通俗易懂的YOLO系列(从V1到V5)模型解读!
- win10计算机管理没有蓝牙,win10系统中缺少打开或关闭蓝牙选项的解决方法
- 2018最新廖雪峰全套Java完整版
- 思维导图怎么画?思维导图快速绘制教程
- linux 大牛博客,大牛
- 嵌入式开发板更换开机LOGO