FFmpeg - 连接不知道格式的视频

Posted

技术标签:

【中文标题】FFmpeg - 连接不知道格式的视频【英文标题】:FFmpeg - Concatenate videos with not know format 【发布时间】:2017-08-09 14:53:32 【问题描述】:

我正在开发一个应用程序。 人们从他们的手机或其他地方上传视频。

php 中使用 CMS(这是开发应用程序所使用的语言)我需要通过这些部分上传生成一个独特的视频。

通过 FFmpeg,我正在从命令行进行测试:

ffmpeg -i concat:IMG_1916.mp4\|IMG_1917.mp4 -c copy videoLoop.mp4

我运行这段代码时说:

ffmpeg 版本 3.2.4 版权所有 (c) 2000-2017 FFmpeg 开发者 使用 Apple LLVM 版本 8.0.0 (clang-800.0.42.1) 构建 配置: --prefix=/usr/local/Cellar/ffmpeg/3.2.4 --enable-shared --enable-pthreads --enable-gpl --enable-version3 --enable-hardcoded-tables --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-libmp3lame --enable-libx264 --enable-libxvid --enable-opencl --disable-lzma --enable-vda libavutil 55. 34.101 / 55. 34.101 libavcodec 57. 64.101 / 57. 64.101 libavformat 57. 56.101 / 57. 56.101 libav 设备 57. 1.100 / 57. 1.100 libavfilter 6. 65.100 / 6. 65.100 libavresample 3. 1. 0 / 3. 1. 0 libswscale 4. 2.100 / 4. 2.100 libswresample 2. 3.100 / 2. 3.100 libpostproc 54. 1.100 / 54. 1.100 [mov,mp4,m4a,3gp,3g2,mj2 @ 0x7f8515000000] 发现重复的 MOOV Atom。跳过它输入 #0, mov,mp4,m4a,3gp,3g2,mj2, from 'concat:IMG_1916.mp4|IMG_1917.mp4': 元数据: 编码器:Lavf57.66.102 主要品牌:isom 次要版本:512 compatible_brands:isomiso2avc1mp41 时长:00:00:04.27,开始:0.000000,比特率:26792 kb/s 流 #0:0(und):视频:h264(约束基线)(avc1 / 0x31637661)、yuv420p、1920x1080、11978 kb/s、29.97 fps、29.97 tbr、30k tbn、59.94 tbc(默认) 元数据: handler_name : 视频处理程序 流 #0:1(und):音频:aac (LC) (mp4a / 0x6134706D),44100 Hz,单声道,fltp,120 kb/s(默认) 元数据: handler_name : SoundHandler 输出#0,mp4,到“videoLoop.mp4”: 元数据: compatible_brands:isomiso2avc1mp41 主要品牌:isom 次要版本:512 编码器:Lavf57.56.101 流 #0:0(und):视频:h264(约束基线)([33][0][0][0] / 0x0021),yuv420p,1920x1080,q=2-31,11978 kb/s,29.97 fps , 29.97 tbr, 30k tbn, 30k tbc (默认) 元数据: handler_name : 视频处理程序 流 #0:1(und):音频:aac (LC) ([64][0][0][0] / 0x0040),44100 Hz,单声道,120 kb/s(默认) 元数据: handler_name : SoundHandler 流映射: 流 #0:0 -> #0:0(复制) 流 #0:1 -> #0:1(复制) 按 [q] 停止,按 [?] 寻求帮助 帧= 127 fps=0.0 q=-1.0 Lsize= 6264kB 时间=00:00:04.22 比特率=12142.8kbits/s 速度= 376x 视频:6196kB 音频:63kB 字幕:0kB 其他流:0kB 全局标题:0kB 复用开销:0.076698%

此执行生成一个视频,但不与指定的 2 个连接,仅与第一个连接。

为什么不加入2?

要上传的视频格式不同,所以我无法定义编解码器。

【问题讨论】:

您从哪里获得指示该语法的文档(带有文字管道)?我没有看到trac.ffmpeg.org/wiki/Concatenate#differentcodec 中指出的任何内容 ...我的意思是,是的,有 concat 协议,但它明确记录在案,仅在您的编解码器匹配时使用;你不能在这里使用它。 @LordNeckbeard, ...鉴于那里接受的答案取决于编解码器匹配,这与此处的给定要求明显相反,我不确定当前标记的重复项 (@987654322 @) 是理想的。 【参考方案1】:

您必须在连接之前使所有输入相似,然后使用concat filter。一个粗略的示例(您当然必须根据自己的需要对其进行自定义):

ffmpeg -i input0 -i input1 -filter_complex \
"[0:v]fps=25,scale=1280:720,format=yuv420p,setsar=1,setpts=PTS-STARTPTS[v0]; \
 [1:v]fps=25,scale=1280:720,format=yuv420p,setsar=1,setpts=PTS-STARTPTS[v1]; \
 [0:a]aformat=channel_layouts=stereo:sample_rates=44100,asetpts=PTS-STARTPTS[a0]; \
 [1:a]aformat=channel_layouts=stereo:sample_rates=44100,asetpts=PTS-STARTPTS[a1]; \
 [v0][a0][v1][a1]concat=n=2:v=1:a=1[v][a]" \
-map "[v]" -map "[a]" -c:v libx264 -c:a aac -movflags +faststart output.mp4

【讨论】:

【参考方案2】:

使用这种代码改编,我可以生成具有两个来源的视频。

ffmpeg -i IMG_1916.mp4 -i IMG_1917.mp4 \
-filter_complex \
"[0:v:0] [0:a:0] \
[1:v:0] [1:a:0] \
concat=n=2:v=1:a=1 [v] [a]" \
-map "[v]" -map "[a]" videoLoop.mp4

我不确定是否可以使用此代码连接来自任何源/格式的任何设备的任何视频格式。

【讨论】:

如果输入的宽度、高度和纵横比不匹配,这将失败。此外,由于 concat 过滤器会自动选择一些“常用”参数,例如音频采样率,根据输入的“常用”参数,您可能会得到意想不到的结果。换句话说,如果你想要一个立体声输出,并且你的输入是单声道,那么 concat 将产生一个单声道输出,除非你告诉它不要这样做(例如在我的回答中)。 好的,我使用你的答案,适应我的设置并且工作正常!!!谢谢!!!

以上是关于FFmpeg - 连接不知道格式的视频的主要内容,如果未能解决你的问题,请参考以下文章

当从单个图像生成一个视频时,ffmpeg视频连接不起作用

python [Python + FFMPEG]在不影响音高和/或连接多个剪辑的情况下改变视频速度

FFmpeg concat 视频和音频不同步

FFmpeg:连接多个视频,一些有音频,一些没有

ffmpeg:连接图像和视频

如何连接具有不同属性的ffmpeg中的视频?