我需要合并两个视频文件以及它们的音频在一个文件中,并排。
我能够在单个文件中合并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的新手,我不确定如何才能实现这一点。
编辑
下面是FFMpeg命令,我用@occvtech建议合并两个文件,但它仍然没有合并第二个音频流。
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
您需要添加amerge
音频滤波器将两个音频流合并为一个:
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
更简单,可能更快。
在我开始之前-知道有很多方法可以在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