เพิ่มเสียงไปยังวิดีโอโดยใช้ FFmpeg


26

ฉันกำลังพยายามเพิ่มเสียงลงในวิดีโอโดยใช้ 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
%

โปรดทราบว่าคำสั่งในคำถามนั้นมีความสมบูรณ์เพียงพอในกรณีที่รวมไฟล์วิดีโอ mp4 อย่างเดียวโดยไม่มีแทร็กเสียงฝังอยู่กับไฟล์เสียงแยก mp4 อย่างเดียว
Vadzim

คำตอบ:


50

โดยค่าเริ่มต้น 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 ฯลฯ ) จำเป็นต้องเข้ารหัสซ้ำอีกครั้ง

1
ขอบคุณมากมันใช้งานได้ดี อะไร-c copy? การจดชวเลขนั้น-acodec copy -vcodec copyใช่หรือไม่
Arlen Beiler

1
ใช่โดยทั่วไปจะบอกให้คัดลอกสตรีมทุกชนิดรวมถึงคำบรรยายด้วย
slhck

1
จากความอยากรู้อยากเห็นจะเกิดอะไรขึ้นถ้าความยาวของเสียงหรือวิดีโอไม่เท่ากัน! วิดีโอยังคงเหมือนเดิมและความยาวของเสียงจะตรงกับขนาดวิดีโอโดยอัตโนมัติ!
Akash Dubey

1
@Akash ffmpeg จะใช้ความยาวของสตรีมที่ยาวกว่าเสมอและเพิ่มวิดีโอสีดำหรือเสียงเงียบที่ส่วนท้าย เว้นแต่คุณจะระบุ-shortestตัวเลือกซึ่งในกรณีนี้สตรีมที่สั้นที่สุดจะยุติกระบวนการเข้ารหัส
slhck

1
@AkashDubey นั่นเป็นวิธีที่คุณใช้ใช่ ทุกที่ระหว่าง-i <input>และไฟล์ที่ส่งออก
slhck
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.