将 2 个视频文件及其音频并排合并到一个文件中
Posted
技术标签:
【中文标题】将 2 个视频文件及其音频并排合并到一个文件中【英文标题】:Merge 2 video files with their audio in a single file side by side 【发布时间】:2015-05-19 11:50:41 【问题描述】:我需要。
我可以将 2 个视频文件合并到一个文件中,但它只使用第一个视频文件中的音频,而我还需要合并第二个文件的音频。
这是我的尝试:
ffmpeg.exe -i input1.webm -vf "[in] scale=iw/2:ih/2, pad=2*iw:ih [left]; movie=input2.webm, scale=iw/2:ih/2 [right]; [left][right] overlay=main_w/2:0 [out]" -b:v 768k ouput.webm
我用amerge
尝试了各种方法,但没有成功。由于我是 FFMpeg 的新手,我不确定如何实现这一点。
编辑
下面是我按照@occvtech 的建议用于合并两个文件的 FFMpeg 命令,但它仍然没有合并第二个音频流。
ffmpeg.exe -i 3.mp4 -i 4.mp4 -filter_complex "[0:v] scale=iw/2:ih/2,pad=2*iw:ih[left];[1:v]scale=iw/2:ih/2[right];[left][right]overlay=main_w/2:0 [out]" -map [out] -map 0:a -map 1:a -b:v 768k o5.mp4
下面是控制台输出:
ffmpeg version N-72276-gf99fed7 Copyright (c) 2000-2015 the FFmpeg developers
built with gcc 4.9.2 (GCC)
configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-av
isynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enab
le-iconv --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --
enable-libdcadec --enable-libfreetype --enable-libgme --enable-libgsm --enable-l
ibilbc --enable-libmodplug --enable-libmp3lame --enable-libopencore-amrnb --enab
le-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-librtmp --en
able-libschroedinger --enable-libsoxr --enable-libspeex --enable-libtheora --ena
ble-libtwolame --enable-libvidstab --enable-libvo-aacenc --enable-libvo-amrwbenc
--enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enabl
e-libx264 --enable-libx265 --enable-libxavs --enable-libxvid --enable-lzma --ena
ble-decklink --enable-zlib
libavutil 54. 23.101 / 54. 23.101
libavcodec 56. 39.101 / 56. 39.101
libavformat 56. 33.101 / 56. 33.101
libavdevice 56. 4.100 / 56. 4.100
libavfilter 5. 16.101 / 5. 16.101
libswscale 3. 1.101 / 3. 1.101
libswresample 1. 1.100 / 1. 1.100
libpostproc 53. 3.100 / 53. 3.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '3.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf56.23.106
Duration: 00:00:13.52, start: 0.023220, bitrate: 968 kb/s
Stream #0:0(und): Video: h264 (Constrained Baseline) (avc1 / 0x31637661), yu
v420p, 640x480, 889 kb/s, 10 fps, 10 tbr, 10240 tbn, 20 tbc (default)
Metadata:
handler_name : VideoHandler
Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, mono, fltp,
76 kb/s (default)
Metadata:
handler_name : SoundHandler
Input #1, mov,mp4,m4a,3gp,3g2,mj2, from '4.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf56.23.106
Duration: 00:00:14.92, start: 0.023220, bitrate: 1049 kb/s
Stream #1:0(und): Video: h264 (Constrained Baseline) (avc1 / 0x31637661), yu
v420p, 640x480, 971 kb/s, 10 fps, 10 tbr, 10240 tbn, 20 tbc (default)
Metadata:
handler_name : VideoHandler
Stream #1:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, mono, fltp,
75 kb/s (default)
Metadata:
handler_name : SoundHandler
[libx264 @ 040d20e0] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX
[libx264 @ 040d20e0] profile High, level 2.1
[libx264 @ 040d20e0] 264 - core 146 r2538 121396c - H.264/MPEG-4 AVC codec - Cop
yleft 2003-2015 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deb
lock=1:0:0 analyse=0x3:0x113 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 m
e_range=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chro
ma_qp_offset=-2 threads=6 lookahead_threads=1 sliced_threads=0 nr=0 decimate=1 i
nterlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1
b_bias=0 direct=1 weightb=1 open_gop=0 weightp=2 keyint=250 keyint_min=10 scenec
ut=40 intra_refresh=0 rc_lookahead=40 rc=abr mbtree=1 bitrate=768 ratetol=1.0 qc
omp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00
Output #0, mp4, to 'o5.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf56.33.101
Stream #0:0: Video: h264 (libx264) ([33][0][0][0] / 0x0021), yuv420p, 640x24
0, q=-1--1, 768 kb/s, 10 fps, 10240 tbn, 10 tbc (default)
Metadata:
encoder : Lavc56.39.101 libx264
Stream #0:1(und): Audio: aac (libvo_aacenc) ([64][0][0][0] / 0x0040), 44100
Hz, mono, s16, 128 kb/s (default)
Metadata:
handler_name : SoundHandler
encoder : Lavc56.39.101 libvo_aacenc
Stream mapping:
Stream #0:0 (h264) -> scale (graph 0)
Stream #1:0 (h264) -> scale (graph 0)
overlay (graph 0) -> Stream #0:0 (libx264)
Stream #1:1 -> #0:1 (aac (native) -> aac (libvo_aacenc))
Press [q] to stop, [?] for help
frame= 27 fps= 26 q=0.0 size= 0kB time=00:00:03.00 bitrate= 0.1kbits/s
frame= 46 fps= 28 q=0.0 size= 0kB time=00:00:04.90 bitrate= 0.1kbits/s
frame= 80 fps= 37 q=16.0 size= 303kB time=00:00:08.29 bitrate= 298.8kbits/
frame= 117 fps= 43 q=15.0 size= 717kB time=00:00:11.99 bitrate= 489.9kbits/
Past duration 0.767570 too large
frame= 137 fps= 39 q=-1.0 Lsize= 1488kB time=00:00:14.94 bitrate= 815.8kbits
/s dup=0 drop=12
video:1247kB audio:234kB subtitle:0kB other streams:0kB global headers:0kB muxin
g overhead: 0.504372%
[libx264 @ 040d20e0] frame I:1 Avg QP:10.60 size: 30577
[libx264 @ 040d20e0] frame P:36 Avg QP:10.78 size: 20384
[libx264 @ 040d20e0] frame B:100 Avg QP:15.41 size: 5116
[libx264 @ 040d20e0] consecutive B-frames: 0.7% 0.0% 17.5% 81.8%
[libx264 @ 040d20e0] mb I I16..4: 13.2% 49.8% 37.0%
[libx264 @ 040d20e0] mb P I16..4: 0.8% 10.7% 1.9% P16..4: 17.7% 30.4% 29.0%
0.0% 0.0% skip: 9.6%
[libx264 @ 040d20e0] mb B I16..4: 0.0% 1.1% 0.0% B16..8: 27.0% 20.2% 10.1%
direct:15.3% skip:26.3% L0:35.6% L1:31.1% BI:33.3%
[libx264 @ 040d20e0] final ratefactor: 13.38
[libx264 @ 040d20e0] 8x8 transform intra:77.9% inter:38.4%
[libx264 @ 040d20e0] coded y,uvDC,uvAC intra: 96.3% 97.8% 97.5% inter: 46.4% 68.
0% 41.1%
[libx264 @ 040d20e0] i16 v,h,dc,p: 44% 4% 7% 44%
[libx264 @ 040d20e0] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 41% 10% 19% 3% 6% 5% 5%
6% 5%
[libx264 @ 040d20e0] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 25% 16% 9% 5% 12% 10% 9%
7% 6%
[libx264 @ 040d20e0] i8c dc,h,v,p: 66% 12% 12% 10%
[libx264 @ 040d20e0] Weighted P-Frames: Y:0.0% UV:0.0%
[libx264 @ 040d20e0] ref P L0: 46.3% 12.0% 28.7% 13.0%
[libx264 @ 040d20e0] ref B L0: 81.1% 16.0% 2.9%
[libx264 @ 040d20e0] ref B L1: 93.2% 6.8%
[libx264 @ 040d20e0] kb/s:745.10
【问题讨论】:
【参考方案1】:您需要添加amerge
audio filter 以将两个音频流合并为一个:
ffmpeg -i input0.mp4 -i input1.mp4 -filter_complex \
"[0:v]scale=iw/2:-1,setpts=PTS-STARTPTS[left]; \
[1:v]scale=iw/2:-1,setpts=PTS-STARTPTS[right]; \
[left][right]hstack[v]; \
[0:a][1:a]amerge=inputs=2[a]" \
-map "[v]" -map "[a]" output
这将在左声道中使用来自input0.mp4
的音频和在右声道中来自input1.mp4
的音频进行立体声输出。您没有指定结果通道的排列方式,但如果您更喜欢单声道输出,请在输出文件名前添加-ac 1
。
hstack
可以替换 pad
+ overlay
。 hstack
更简单,可能更快。
【讨论】:
【参考方案2】:在我开始之前 - 要知道在 FFmpeg 中有很多方法可以做同样的事情。
也就是说,在您的情况下,我个人更喜欢使用-filter_complex
参数而不是-vf
,并且我会使用-i
标志指定我的所有输入文件。我发现以后映射它们更容易。
要回答您的问题,请尝试以下命令:
ffmpeg.exe -i input1.webm -i input2.webm -filter_complex "[0:v]scale=iw/2:ih/2,pad=2*iw:ih[left];[1:v]scale=iw/2:ih/2[right];[left][right]overlay=main_2/2:0[out]" -map [out] -map 0:a -map 1:a -b:v 768k output.webm
我个人也会在此处特别引用我想要的音频和视频编解码器,并带有 -c:v
和 -c:a
标志。我不喜欢让 FFmpeg 替我做决定。
注意:我没有测试过上面的命令。我习惯使用overlay=shortest=1:x=...:y=...
进行叠加。但同样,在 FFmpeg 中做大多数事情的方法不止一种
【讨论】:
感谢@occvtech。我会尽快回复你:) 我已经尝试过你给定的命令,但它也没有合并第二个视频的音频。以下是我供您参考的命令。ffmpeg.exe -i input1.mp4 -i input2.mp4 -filter_complex "[0:v]scale=iw/2:ih/2,pad=2*iw:ih[left];[1:v]scale=iw/2:ih/2[right];[left][right]overlay=main_w/2:0[out]" -map [out] -map 0:a -map 1:a -b:v 768k output.mp4
你能帮我吗?
您能否编辑您的原始帖子以包含控制台输出?
FFmpeg 似乎没有为流 0:1 映射您的音频。我强烈建议选择要使用的音频编解码器(和视频编解码器),而不是让 FFmpeg 为您决定。现在尝试使用未压缩的音频编解码器进行测试 - 如果文件大小对您来说太大,您可以随时将音频压缩为另一种格式。尝试在上面使用的命令中的 -map 1:a
之后添加 -c:a pcm_s16le
。以上是关于将 2 个视频文件及其音频并排合并到一个文件中的主要内容,如果未能解决你的问题,请参考以下文章
android代码并排合并两个视频并使其成为一个视频(只想要一个音频)
如何使用 c# 将两个音频文件和一个视频文件合并到一个视频文件中?
iOS 视频编辑 - 是不是可以使用 iOS 4 AVFoundation 类将两个视频文件合并(并排而不是一个接一个)为一个?