FFmpeg를 사용하여 비디오에 오디오 추가


26

FFmpeg를 사용하여 비디오에 사운드를 추가하려고하는데 어떤 이유로 결과 파일을 재생할 때 사운드가 없습니다. 또한 aac 오디오 파일로 작업을 수행하고 -acodec copywav 파일 을 남기지 않고 시도했습니다 .

다음은 완전한 출력입니다.

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 파일은 제 1 파일의 제 1 비디오 스트림이고 1:a:0제 2 파일의 제 1 오디오 스트림이다. (가) v/ a반드시 필요한 것은 아니지만 경우에 대비하여 입력 파일은 다중 스트림을 포함, 그것은 명확하게하는 데 도움이됩니다. 매핑에 대한 자세한 정보는 FFmpeg Wiki 에서 찾을 수 있습니다 .
  • 오디오 스트림이 비디오 파일보다 길거나 그 반대 -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.