使用 FFMPEG 合并和连接多个音频和视频文件
Merge and Concat Multiple Audio and Video files using FFMPEG
我目前有一个脚本可以生成几个纯音频和纯视频文件。
我的目标是获取这些,然后在合并音频剪辑的同时连接每个视频剪辑。
我认为这很容易,但我一直无法找到一个好的例子。
FFMPEG.org 建议 movie/amovie
输入语法可能是最好的选择.. 但我渴望更多的 doco。 FFMPEG的题目资料是@
https://www.ffmpeg.org/ffmpeg-filters.html#Examples-124。它建议“......连接两个部分,分别处理音频和视频”我们应该能够使用“(a)电影来源”并包括这个例子:
movie=part1.mp4, scale=512:288 [v1] ; amovie=part1.mp4 [a1] ;
movie=part2.mp4, scale=512:288 [v2] ; amovie=part2.mp4 [a2] ;
[v1] [v2] concat [outv] ; [a1] [a2] concat=v=0:a=1 [outa]
我自己尝试过,但没有成功:
-f lavfi
-i amovie=/clips/1-0.mp3 [a0];
movie=/clips/1-1-overlayed.mp4 [v1];
amovie=/clips/1-2.mp3 [a2];
movie=/clips/1-3-overlayed.mp4 [v3];
amovie=/clips/1-4.mp3 [a4];
movie=/clips/1-5-overlayed.mp4 [v5];
[v1] [v3] [v5] concat=n=3 "[outv]" ; [a0] [a2] [a4] concat=n=3:v=0:a=1 "[outa]"
-map "[outv]"
-map "[outa]"
output.mp4
给出:
"[outa]": Invalid argument
关于如何让它工作有什么想法吗? (不必使用相同的 movie/amovie 结构,我的主要要求是我有一组项目并需要从中生成视频,即每个视频的连接和每个音频的合并.
...
当我使用常规 concat 时,出现此错误:
[mp3 @ 0x7fd200003a00] Estimating duration from bitrate, this may be inaccurate
Input #0, mp3, from '/clips/1-0.mp3':
Duration: 00:00:04.27, start: 0.000000, bitrate: 32 kb/s
Stream #0:0: Audio: mp3, 24000 Hz, mono, fltp, 32 kb/s
Input #1, mov,mp4,m4a,3gp,3g2,mj2, from '/clips/1-1-overlayed.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf58.20.100
Duration: 00:00:04.28, start: 0.000000, bitrate: 28 kb/s
Stream #1:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1920x1080 [SAR 3:4 DAR 4:3], 24 kb/s, 25 fps, 25 tbr, 12800 tbn, 50 tbc (default)
Metadata:
handler_name : VideoHandler
[mp3 @ 0x7fd20080ac00] Estimating duration from bitrate, this may be inaccurate
Input #2, mp3, from '/clips/1-2.mp3':
Duration: 00:00:14.38, start: 0.000000, bitrate: 32 kb/s
Stream #2:0: Audio: mp3, 24000 Hz, mono, fltp, 32 kb/s
Input #3, mov,mp4,m4a,3gp,3g2,mj2, from '/clips/1-3-overlayed.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf58.20.100
Duration: 00:00:14.36, start: 0.000000, bitrate: 530 kb/s
Stream #3:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1920x1080, 528 kb/s, 25 fps, 25 tbr, 12800 tbn, 50 tbc (default)
Metadata:
handler_name : VideoHandler
[mp3 @ 0x7fd20100d200] Estimating duration from bitrate, this may be inaccurate
Input #4, mp3, from '/clips/1-4.mp3':
Duration: 00:00:02.78, start: 0.000000, bitrate: 32 kb/s
Stream #4:0: Audio: mp3, 24000 Hz, mono, fltp, 32 kb/s
Input #5, mov,mp4,m4a,3gp,3g2,mj2, from '/clips/1-5-overlayed.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf58.20.100
Duration: 00:00:02.80, start: 0.000000, bitrate: 34 kb/s
Stream #5:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1920x1080 [SAR 3:4 DAR 4:3], 29 kb/s, 25 fps, 25 tbr, 12800 tbn, 50 tbc (default)
Metadata:
handler_name : VideoHandler
Stream specifier ':a' in filtergraph description [0:a][1:v][2:a][3:v][4:a][5:v]concat=n=3:v=1:a=1[v][a] matches no streams.
输入(通过 NodeJS 包装器)如下所示:
FFmpeg {
options:
[ '-hide_banner',
'-y',
'-i',
'/clips/1-0.mp3',
'-i',
'/clips/1-1-overlayed.mp4',
'-i',
'/clips/1-2.mp3',
'-i',
'/clips/1-3-overlayed.mp4',
'-i',
'/clips/1-4.mp3',
'-i',
'/clips/1-5-overlayed.mp4',
'-filter_complex',
'[0:a][1:v][2:a][3:v][4:a][5:v]concat=n=3:v=1:a=1[v][a]',
'-map',
'[v]',
'-map',
'[a]',
'/projects/1.mp4' ],
outputFilename: '' }
不需要 (a)movie
或两个 concat
。只需正常列出每个输入:
ffmpeg -i input-a.mp4 -i input-a.mp3 -i input-b.mp4 -i input-b.mp3 -filter_complex "[0:v][1:a][2:v][3:a]concat=n=2:v=1:a=1[v][a]" -map "[v]" -map "[a]" output.mp4
我目前有一个脚本可以生成几个纯音频和纯视频文件。
我的目标是获取这些,然后在合并音频剪辑的同时连接每个视频剪辑。
我认为这很容易,但我一直无法找到一个好的例子。
FFMPEG.org 建议 movie/amovie
输入语法可能是最好的选择.. 但我渴望更多的 doco。 FFMPEG的题目资料是@
https://www.ffmpeg.org/ffmpeg-filters.html#Examples-124。它建议“......连接两个部分,分别处理音频和视频”我们应该能够使用“(a)电影来源”并包括这个例子:
movie=part1.mp4, scale=512:288 [v1] ; amovie=part1.mp4 [a1] ;
movie=part2.mp4, scale=512:288 [v2] ; amovie=part2.mp4 [a2] ;
[v1] [v2] concat [outv] ; [a1] [a2] concat=v=0:a=1 [outa]
我自己尝试过,但没有成功:
-f lavfi
-i amovie=/clips/1-0.mp3 [a0];
movie=/clips/1-1-overlayed.mp4 [v1];
amovie=/clips/1-2.mp3 [a2];
movie=/clips/1-3-overlayed.mp4 [v3];
amovie=/clips/1-4.mp3 [a4];
movie=/clips/1-5-overlayed.mp4 [v5];
[v1] [v3] [v5] concat=n=3 "[outv]" ; [a0] [a2] [a4] concat=n=3:v=0:a=1 "[outa]"
-map "[outv]"
-map "[outa]"
output.mp4
给出:
"[outa]": Invalid argument
关于如何让它工作有什么想法吗? (不必使用相同的 movie/amovie 结构,我的主要要求是我有一组项目并需要从中生成视频,即每个视频的连接和每个音频的合并.
...
当我使用常规 concat 时,出现此错误:
[mp3 @ 0x7fd200003a00] Estimating duration from bitrate, this may be inaccurate
Input #0, mp3, from '/clips/1-0.mp3':
Duration: 00:00:04.27, start: 0.000000, bitrate: 32 kb/s
Stream #0:0: Audio: mp3, 24000 Hz, mono, fltp, 32 kb/s
Input #1, mov,mp4,m4a,3gp,3g2,mj2, from '/clips/1-1-overlayed.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf58.20.100
Duration: 00:00:04.28, start: 0.000000, bitrate: 28 kb/s
Stream #1:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1920x1080 [SAR 3:4 DAR 4:3], 24 kb/s, 25 fps, 25 tbr, 12800 tbn, 50 tbc (default)
Metadata:
handler_name : VideoHandler
[mp3 @ 0x7fd20080ac00] Estimating duration from bitrate, this may be inaccurate
Input #2, mp3, from '/clips/1-2.mp3':
Duration: 00:00:14.38, start: 0.000000, bitrate: 32 kb/s
Stream #2:0: Audio: mp3, 24000 Hz, mono, fltp, 32 kb/s
Input #3, mov,mp4,m4a,3gp,3g2,mj2, from '/clips/1-3-overlayed.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf58.20.100
Duration: 00:00:14.36, start: 0.000000, bitrate: 530 kb/s
Stream #3:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1920x1080, 528 kb/s, 25 fps, 25 tbr, 12800 tbn, 50 tbc (default)
Metadata:
handler_name : VideoHandler
[mp3 @ 0x7fd20100d200] Estimating duration from bitrate, this may be inaccurate
Input #4, mp3, from '/clips/1-4.mp3':
Duration: 00:00:02.78, start: 0.000000, bitrate: 32 kb/s
Stream #4:0: Audio: mp3, 24000 Hz, mono, fltp, 32 kb/s
Input #5, mov,mp4,m4a,3gp,3g2,mj2, from '/clips/1-5-overlayed.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf58.20.100
Duration: 00:00:02.80, start: 0.000000, bitrate: 34 kb/s
Stream #5:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1920x1080 [SAR 3:4 DAR 4:3], 29 kb/s, 25 fps, 25 tbr, 12800 tbn, 50 tbc (default)
Metadata:
handler_name : VideoHandler
Stream specifier ':a' in filtergraph description [0:a][1:v][2:a][3:v][4:a][5:v]concat=n=3:v=1:a=1[v][a] matches no streams.
输入(通过 NodeJS 包装器)如下所示:
FFmpeg {
options:
[ '-hide_banner',
'-y',
'-i',
'/clips/1-0.mp3',
'-i',
'/clips/1-1-overlayed.mp4',
'-i',
'/clips/1-2.mp3',
'-i',
'/clips/1-3-overlayed.mp4',
'-i',
'/clips/1-4.mp3',
'-i',
'/clips/1-5-overlayed.mp4',
'-filter_complex',
'[0:a][1:v][2:a][3:v][4:a][5:v]concat=n=3:v=1:a=1[v][a]',
'-map',
'[v]',
'-map',
'[a]',
'/projects/1.mp4' ],
outputFilename: '' }
不需要 (a)movie
或两个 concat
。只需正常列出每个输入:
ffmpeg -i input-a.mp4 -i input-a.mp3 -i input-b.mp4 -i input-b.mp3 -filter_complex "[0:v][1:a][2:v][3:a]concat=n=2:v=1:a=1[v][a]" -map "[v]" -map "[a]" output.mp4