Thêm âm thanh vào video bằng FFmpeg


25

Tôi đang cố gắng thêm âm thanh vào video bằng FFmpeg, nhưng vì một số lý do, khi tôi phát tệp kết quả, nó không có bất kỳ âm thanh nào. Tôi cũng đã thử làm nó với một tệp âm thanh aac, cũng như bỏ đi -acodec copyvà cho nó một tệp wav.

Đây là đầu ra hoàn chỉnh:

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
%

Lưu ý rằng lệnh trong câu hỏi là hoàn toàn đủ trong trường hợp hợp nhất tệp chỉ có video mp4 mà không có bản âm thanh được nhúng với tệp chỉ có âm thanh mp4 riêng.
Vadzim

Câu trả lời:


49

Theo mặc định, FFmpeg sẽ chỉ lấy một âm thanh và một luồng video. Trong trường hợp của bạn, đó chỉ được lấy từ tệp đầu tiên.

Bạn cần ánh xạ các luồng chính xác:

ffmpeg -i input.mp4 -i input.mp3 -c copy -map 0:v:0 -map 1:a:0 output.mp4

Một số lưu ý:

  • Các tùy chọn ánh xạ thứ tự xác định luồng nào từ đầu vào được ánh xạ tới đầu ra.
  • 0:v:0là luồng video đầu tiên của tệp đầu tiên và 1:a:0là luồng âm thanh đầu tiên của tệp thứ hai. Các v/ akhông thực sự cần thiết, nhưng trong trường hợp tập tin đầu vào của bạn chứa nhiều suối, giúp để disambiguate. Thông tin thêm về ánh xạ có thể được tìm thấy trên FFmpeg Wiki .
  • Nếu luồng âm thanh của bạn dài hơn tệp video hoặc ngược lại, bạn có thể sử dụng -shortesttùy chọn để ffmpeg dừng chuyển đổi khi ngắn hơn hai đầu.
  • -c copysao chép các luồng âm thanh và video. Điều này có nghĩa là quá trình sẽ nhanh chóng và chất lượng sẽ như nhau. Nhưng khi thêm, giả sử, âm thanh WAV vào một tệp video hiện có, tốt hơn hết là nén âm thanh đó trước. Ví dụ:

    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
    

    Ở đây, chúng tôi chỉ sao chép luồng video ( -c:v copy) và mã hóa lại luồng âm thanh bằng bộ mã hóa AAC tích hợp ffmpeg ( -c:a aac) với tốc độ 192 kBit / s.

  • Nếu định dạng đầu ra của bạn không hỗ trợ một codec cụ thể (ví dụ: khi thêm WAV vào MP4 hoặc AAC vào AVI, v.v.), cũng cần phải mã hóa lại.

1
Cảm ơn bạn rất nhiều, hoạt động hoàn hảo. Là gì -c copy? Đó là tốc ký cho -acodec copy -vcodec copy?
Arlen Beiler

1
Vâng, về cơ bản, nó bảo nó sao chép tất cả các loại luồng - điều này cũng bao gồm phụ đề.
slhck

1
Vì tò mò điều gì nếu độ dài âm thanh hoặc video không giống nhau! video vẫn giữ nguyên và độ dài âm thanh tự động khớp với kích thước video!
Akash Dubey

1
@Akash ffmpeg sẽ luôn sử dụng thời lượng dài hơn của hai luồng và thêm video đen hoặc âm thanh im lặng ở cuối. Trừ khi bạn chỉ định -shortesttùy chọn, trong trường hợp đó, luồng ngắn nhất chấm dứt quá trình mã hóa.
slhck

1
@AkashDubey Đó là cách bạn sử dụng nó, vâng. Bất cứ nơi nào giữa -i <input>và các tập tin đầu ra.
slhck
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.