FFmpeg kullanarak videoya ses ekleme


26

FFmpeg kullanarak bir videoya ses eklemeye çalışıyorum, ancak nedense, ortaya çıkan dosyayı oynattığımda herhangi bir ses yok. Ayrıca bir aac ses dosyası ile yapmayı, dışarıda bırakarak -acodec copyve bir wav dosyası vererek denedim .

İşte tam çıktı:

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
%

Bir mp4 salt video dosyasını gömülü ses parçası olmadan ayrı bir mp4 salt ses dosyası ile birleştirmeniz durumunda söz konusu komutun tamamen yeterli olduğunu unutmayın.
Vadzim

Yanıtlar:


50

Varsayılan olarak, FFmpeg yalnızca bir ses ve bir video akışı alır. Sizin durumunuzda bu sadece ilk dosyadan alınır.

Akışları doğru bir şekilde eşlemeniz gerekir:

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

Bazı notlar:

  • Sıra eşleme seçenekleri, girdiden hangi akışların çıktıya eşlendiğini belirler.
  • 0:v:0ilk dosyanın ilk video akışıdır 1:a:0ve ikinci dosyanın ilk ses akışıdır. v/ aKesinlikle gerekli değildir, ancak ihtimaline karşı girdi dosyaları birden akışları içeren, bu belirsizliği giderecek yardımcı olur. Haritalama hakkında daha fazla bilgi FFmpeg Wiki'de bulunabilir .
  • Ses akışınız video dosyasından daha uzunsa veya tersi ise, -shortestffmpeg'in iki uçtan kısa olduğunda dönüşümü durdurmasını sağlamak için bu seçeneği kullanabilirsiniz .
  • -c copyses ve video akışlarını kopyalar. Bu, sürecin hızlı olacağı ve kalitenin aynı olacağı anlamına gelir. Ancak mevcut bir video dosyasına WAV ses eklerken, önce bu sesi sıkıştırmak daha iyi olur. Örneğin:

    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
    

    Burada, yalnızca video akışını ( -c:v copy) kopyalarız ve ses akışını -c:a aac192 kBit / s'de ffmpeg yerleşik AAC kodlayıcı ( ) ile yeniden kodlarız.

  • Çıktı biçiminiz belirli bir codec bileşenini desteklemiyorsa (örneğin, MP4'e WAV eklerken veya AVI'ye AAC vb. Eklerken), yeniden kodlama da gereklidir.

1
Çok teşekkürler, bu mükemmel çalışıyor. Nedir -c copy? Bu kestirme için -acodec copy -vcodec copymi?
Arlen Beiler

1
Evet, temelde her türlü akışı kopyalamasını söyler - bu da altyazıları içerir.
slhck

1
meraktan ne ses veya video uzunluğu aynı değilse! video aynı kalır ve ses uzunluğu otomatik olarak video boyutu ile eşleşir!
Akash Dubey

1
@Akash ffmpeg her zaman iki akıştan daha uzun süre kullanır ve sonunda siyah video veya sessiz ses ekler. -shortestSeçeneği belirtmedikçe, bu durumda en kısa akış kodlama işlemini sonlandırır.
slhck

1
@AkashDubey Bu şekilde kullanıyorsunuz, evet. -i <input>Çıktı dosyası arasında herhangi bir yerde .
slhck
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.