Tambahkan audio ke video menggunakan FFmpeg

26

Saya mencoba untuk menambahkan suara ke video menggunakan FFmpeg, tetapi untuk beberapa alasan, ketika saya memutar file yang dihasilkan, tidak ada suara. Saya juga mencoba melakukannya dengan file audio aac, serta meninggalkan -acodec copydan memberikannya file wav.

Ini adalah hasil lengkapnya:

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
%
Arlen Beiler
sumber
Perhatikan bahwa perintah dalam pertanyaan ini benar-benar memadai dalam hal menggabungkan file mp4 video saja tanpa track audio tertanam dengan file mp4 audio khusus saja.
Vadzim

Jawaban:

50

Secara default, FFmpeg hanya akan mengambil satu audio dan satu aliran video. Dalam kasus Anda itu hanya diambil dari file pertama.

Anda perlu memetakan aliran dengan benar:

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

Beberapa catatan:

  • Opsi pemetaan pesanan menentukan aliran mana dari input yang dipetakan ke output.
  • 0:v:0adalah aliran video pertama dari file pertama dan 1:a:0merupakan streaming audio pertama dari file kedua. The v/ atidak sepenuhnya diperlukan, tetapi jika file input Anda berisi beberapa aliran, yang membantu untuk ambigu. Informasi lebih lanjut tentang pemetaan dapat ditemukan di FFmpeg Wiki .
  • Jika aliran audio Anda lebih panjang dari file video, atau sebaliknya, Anda dapat menggunakan -shortestopsi untuk menghentikan konversi ketika ffmpeg lebih pendek dari kedua ujungnya.
  • -c copymenyalin aliran audio dan video. Ini berarti bahwa prosesnya akan cepat dan kualitasnya akan sama. Tetapi ketika menambahkan, katakanlah, audio WAV ke file video yang ada, akan lebih baik untuk mengompres audio itu terlebih dahulu. Sebagai contoh:

    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
    

    Di sini, kami hanya menyalin stream video ( -c:v copy), dan menyandikan ulang stream audio dengan ffmpeg AAC encoder ( -c:a aac) yang terpasang di 192 kBit / s.

  • Jika format output Anda tidak mendukung codec tertentu (misalnya, saat menambahkan WAV ke MP4, atau AAC ke AVI, dll.), Pengkodean ulang juga diperlukan.
slhck
sumber
1
Terima kasih banyak, itu bekerja dengan sempurna. Apa -c copy? Apakah itu singkatan -acodec copy -vcodec copy?
Arlen Beiler
1
Ya, pada dasarnya ia memerintahkannya untuk menyalin semua jenis aliran - ini juga termasuk terjemahan.
slhck
1
karena penasaran bagaimana jika panjang audio atau video tidak sama! apakah video tetap sama dan panjang audio secara otomatis sesuai dengan ukuran video!
Akash Dubey
1
@Akash ffmpeg akan selalu menggunakan yang lebih lama dari dua streaming dan menambahkan video hitam atau audio diam di akhir. Kecuali Anda menentukan -shortestopsi, dalam hal ini aliran terpendek mengakhiri proses pengodean.
slhck
1
@AkashDubey Begitulah cara Anda menggunakannya, ya. Di mana saja antara -i <input>dan file output.
slhck