FFMPEG mux video i audio (z innego wideo) - problem z mapowaniem

84

Chciałbym umieścić dźwięk z wideo na innym wideo bez dźwięku (w jednym poleceniu):

ffmpeg.exe -i video1_noAudio.mov -i video2_wAudio.mov -vcodec copy -acodec copy video1_audioFromVideo2.mov

Wydaje mi się, że „-mapa” to właściwy sposób, ale pomyliłem się z tym.

Czy możesz zasugerować, jak to rozwiązać?

znak
źródło

Odpowiedzi:

225

Przegląd wejść

input_0.mp4ma żądany strumień wideo i input_1.mp4ma żądany strumień audio:

diagram mapowania

W ffmpegstrumieniach wyglądają tak:

$ ffmpeg -i input_0.mp4 -i input_1.mp4

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'input_0.mp4':
  Duration: 00:01:48.50, start: 0.000000, bitrate: 4144 kb/s
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1280x720, 4014 kb/s, SAR 115:87 DAR 1840:783, 23.98 fps, 23.98 tbr, 16k tbn, 47.95 tbc (default)
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 124 kb/s (default)

Input #1, mov,mp4,m4a,3gp,3g2,mj2, from 'input_1.mp4':
  Duration: 00:00:30.05, start: 0.000000, bitrate: 1754 kb/s
    Stream #1:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 720x480 [SAR 8:9 DAR 4:3], 1687 kb/s, 59.94 fps, 59.94 tbr, 60k tbn, 119.88 tbc (default)
    Stream #1:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 55 kb/s (default)

Numery identyfikacyjne

ffmpegodnosi się do plików wejściowych i strumieni z numerami indeksu. Format to input_file_id:input_stream_id. Ponieważ ffmpegzaczyna się od 0, strumień 1:1odnosi się do audio z input_1.mp4.

Specyfikatory strumienia

Można to ulepszyć za pomocą specyfikatorów strumieni . Na przykład możesz powiedzieć ffmpeg, że chcesz, aby pierwszy strumień wideo był z pierwszego wejścia ( 0:v:0), a pierwszy strumień audio z drugiego wejścia ( 1:a:0). Wolę tę metodę, ponieważ jest bardziej wydajna. Ponadto jest mniej podatny na przypadkowe mapowanie, ponieważ 1:1może odnosić się do dowolnego typu strumienia, podczas gdy 2:v:3odnosi się tylko do czwartego strumienia wideo trzeciego pliku wejściowego.

Przykłady

Ta -mapopcja instruuje, ffmpegjakie strumienie chcesz. Aby skopiować wideo input_0.mp4i audio z input_1.mp4:

$ ffmpeg -i input_0.mp4 -i input_1.mp4 -c copy -map 0:0 -map 1:1 -shortest out.mp4

Ten następny przykład zrobi to samo:

$ ffmpeg -i input_0.mp4 -i input_1.mp4 -c copy -map 0:v:0 -map 1:a:0 -shortest out.mp4
  • -map 0:v:0można przetłumaczyć jako: z pierwszego wejścia ( 0) wybierz typ strumienia wideo ( v), pierwszy strumień wideo ( 0)

  • -map 1:a:0można przetłumaczyć jako: z drugiego wejścia ( 1) wybierz typ strumienia audio ( a), pierwszy strumień audio ( 0)

Dodatkowe uwagi

  • Dzięki -c copystrumieniom zostaną skopiowane , a nie ponownie zakodowane, więc nie będzie utraty jakości. Jeśli chcesz ponownie zakodować, zobacz FFmpeg Wiki: Przewodnik po kodowaniu H.264 .

  • Ta -shortestopcja spowoduje, że czas trwania wyjścia będzie zgodny z czasem trwania najkrótszego strumienia wejściowego.

  • Zobacz -mapdokumentację opcji, aby uzyskać więcej informacji.

llogan
źródło
17
Głos za mną, ponieważ to najlepszy opis + przykład, jaki znalazłem, próbując to zrobić godzinami.
Mark Ping
4
Dziękuję za nie tylko rozwiązanie, ale także wyjaśnienie!
Mathias,
1
To wyjaśnienie jest idealne dla początkujących
-map
2
@FernandoEspinosa Edycja jest faktycznie niepoprawna. -map 1:0odsyłałby wideo input_1.mp4, a nie dźwięk. Przykład powinien uzyskać dźwięk, więc musi być -map 1:1lub -map 1:a:0co w tym przypadku skutkuje uzyskaniem żądanego strumienia audio. Odnieś się do obrazu w odpowiedzi, aby uzyskać wizualną reprezentację.
llogan
1

Mam nowe polecenie do łączenia dźwięku z wideo

ffmpeg -i video.mp4 -i audio.mp4 -map 0.0 -map 1.0 -acodec copy -qscale 4 -vcodec mpeg4 outvideo.mp4

-qscale to opcja ustawiania jakości na wideo z ffmpeg

-acodec copy to opcja kopiowania domyślnej jakości dźwięku do wyjścia wideo

-vcodec mpeg4 to opcja kopiowania domyślnej jakości wideo do wyjścia wideo

HoangHieu
źródło
1
-vcodecistnieje od zawsze. Jest taki sam, jak nowsze aliasy -codec:vi -c:v.
llogan
@HoangHieu czy mogę dodać dźwięk wav do wideo mp4? Próbowałem ffmpeg -i 1.mp4 -i 0.wav -map 0 -map 1 -codec copy -shortest new.mp4polecenia, ale nie działa
Allan
?? Twoje polecenie. 0.0 nie 0 , 1.0 nie 1 - 1.0 to znaczy: indeks [1] kanał [0] ... - kopiowanie acodeka nie kopiowanie kodeka , to znaczy kopiowanie kodeka audio
HoangHieu
Prawdopodobnie chcesz -vcodec copyuniknąć ponownego kodowania wideo
wolfd
0

Jako odpowiedź uzupełniająca specyficzna dla MKV:

MKVToolnix może to zrobić. Wolę GUI.

Po dodaniu pierwszego wideo dodaj drugie („Dodaj pliki źródłowe”), następnie zachowaj wybrane tylko wybrane strumienie i naciśnij „Rozpocznij multipleksowanie”.

wprowadź opis obrazu tutaj

cypricus
źródło