我正在尝试使用 FFmpeg 为视频添加声音,但出于某种原因,当我播放生成的文件时,它没有任何声音。我还尝试使用 aac 音频文件执行此操作,以及省略-acodec copy
并为其提供 wav 文件。
完整的输出如下:
C:\Users\SM-Audio\Desktop>ffmpeg -i PrintingCDs.mp4 -i AudioPrintCDs.mp3 -acodec
copy -vcodec copy PrintCDs1.mp4
ffmpeg version N-48886-g5ce023b Copyright (c) 2000-2013 the FFmpeg developers
built on Jan 14 2013 19:16:33 with gcc 4.7.2 (GCC)
configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-av
isynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enab
le-libass --enable-libbluray --enable-libcaca --enable-libfreetype --enable-libg
sm --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --e
nable-libopenjpeg --enable-libopus --enable-librtmp --enable-libschroedinger --e
nable-libspeex --enable-libtheora --enable-libtwolame --enable-libvo-aacenc --en
able-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libx264 --enable
-libxavs --enable-libxvid --enable-zlib --enable-filter=frei0r
libavutil 52. 14.100 / 52. 14.100
libavcodec 54. 89.100 / 54. 89.100
libavformat 54. 59.107 / 54. 59.107
libavdevice 54. 3.102 / 54. 3.102
libavfilter 3. 32.100 / 3. 32.100
libswscale 2. 1.103 / 2. 1.103
libswresample 0. 17.102 / 0. 17.102
libpostproc 52. 2.100 / 52. 2.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'PrintingCDs.mp4':
Metadata:
major_brand : mp42
minor_version : 0
compatible_brands: isommp42
creation_time : 2013-05-01 13:35:52
Duration: 00:02:35.57, start: 0.000000, bitrate: 585 kb/s
Stream #0:0(eng): Video: h264 (Baseline) (avc1 / 0x31637661), yuv420p, 1024x
768 [SAR 1:1 DAR 4:3], 457 kb/s, 10 fps, 10 tbr, 30k tbn, 30 tbc
Metadata:
creation_time : 2013-05-01 13:35:53
handler_name : Mainconcept MP4 Video Media Handler
Stream #0:1(eng): Audio: aac (mp4a / 0x6134706D), 22050 Hz, mono, fltp, 126
kb/s
Metadata:
creation_time : 2013-05-01 13:35:53
handler_name : Mainconcept MP4 Sound Media Handler
[mp3 @ 003dd6c0] max_analyze_duration 5000000 reached at 5015510 microseconds
Input #1, mp3, from 'AudioPrintCDs.mp3':
Metadata:
encoder : Lavf54.59.107
Duration: 00:02:36.21, start: 0.000000, bitrate: 64 kb/s
Stream #1:0: Audio: mp3, 44100 Hz, mono, s16p, 64 kb/s
File 'PrintCDs1.mp4' already exists. Overwrite ? [y/N] y
Output #0, mp4, to 'PrintCDs1.mp4':
Metadata:
major_brand : mp42
minor_version : 0
compatible_brands: isommp42
encoder : Lavf54.59.107
Stream #0:0(eng): Video: h264 ([33][0][0][0] / 0x0021), yuv420p, 1024x768 [S
AR 1:1 DAR 4:3], q=2-31, 457 kb/s, 10 fps, 30k tbn, 30k tbc
Metadata:
creation_time : 2013-05-01 13:35:53
handler_name : Mainconcept MP4 Video Media Handler
Stream #0:1(eng): Audio: aac ([64][0][0][0] / 0x0040), 22050 Hz, mono, 126 k
b/s
Metadata:
creation_time : 2013-05-01 13:35:53
handler_name : Mainconcept MP4 Sound Media Handler
Stream mapping:
Stream #0:0 -> #0:0 (copy)
Stream #0:1 -> #0:1 (copy)
Press [q] to stop, [?] for help
frame= 1555 fps=0.0 q=-1.0 Lsize= 11133kB time=00:02:35.57 bitrate= 586.2kbits
/s
video:8674kB audio:2408kB subtitle:0 global headers:0kB muxing overhead 0.459569
%
答案1
默认情况下,FFmpeg 仅接收一个音频流和一个视频流。在您的情况下,仅从第一个文件接收。
您需要正确映射流:
ffmpeg -i input.mp4 -i input.mp3 -c copy -map 0:v:0 -map 1:a:0 output.mp4
一些说明:
- 顺序映射选项决定将输入中的哪些流映射到输出。
0:v:0
是第一个文件的第一个视频流,1:a:0
是第二个文件的第一个音频流。/v
不是a
必需的,但如果您的输入文件包含多个流,这有助于消除歧义。有关映射的更多信息,请参阅FFmpeg 维基。- 如果您的音频流比视频文件长,或反之亦然,您可以使用该
-shortest
选项让 ffmpeg 在两端较短时停止转换。 -c copy
复制音频和视频流。这意味着该过程将很快,并且质量将保持不变。但是,当将 WAV 音频添加到现有视频文件时,最好先压缩该音频。例如:ffmpeg -i input.mp4 -i input.wav -c:v copy -map 0:v:0 -map 1:a:0 -c:a aac -b:a 192k output.mp4
这里我们只复制视频流(
-c:v copy
),并使用 ffmpeg 内置 AAC 编码器(-c:a aac
)以 192 kBit/s 的速度重新编码音频流。- 如果您的输出格式不支持特定的编解码器(例如,将 WAV 添加到 MP4,或将 AAC 添加到 AVI 等),则也需要重新编码。