Jak usunąć strumienie audio z pliku MKV?

16

Próbowałem usunąć niepotrzebne strumienie audio z pliku MKV (Matroska). Powodem, dla którego chcę to zrobić, jest uniknięcie konieczności ręcznego wybierania żądanego strumienia w programie Windows Media Player.

Plik wejściowy zawiera następujące informacje o ffmpeg:

Stream #0.0: Video: mpeg4, yuv420p, 704x396 [PAR 1:1 DAR 16:9], 29.98 tbr, 1k tbn, 29.98 tbc
Stream #0.1(eng): Audio: aac, 24000 Hz, 5.1, s16
Stream #0.2(jpn): Audio: aac, 24000 Hz, 5.1, s16
Stream #0.3(eng): Subtitle: 0x0000
Stream #0.4(eng): Subtitle: 0x0000
Stream #0.5: Attachment: 0x0000
Stream #0.6: Attachment: 0x0000

Ponieważ chcę strumieni 0, 1 i 3 (sub), moje polecenie ffmpeg wygląda następująco:

ffmpeg -i input.mkv -map 0:0 -map 0:1 -map 0:3 -vcodec copy -acodec libmp3lame -newsubtitle test.mkv

co dziwnie daje błąd:

At least one output file must be specified

Usuwanie napisów:

ffmpeg -i input.mkv -map 0:0 -map 0:1 -vcodec copy -acodec libmp3lame test.mkv

daje mi to:

Number of stream maps must match number of output streams

Wygląda na to, że tak naprawdę nie rozumiem, jak działa opcja „mapa”. Czy ktoś pomoże mi to rozgryźć?

StackedCrooked
źródło

Odpowiedzi:

25

Jeśli wszystko, co chcesz zrobić, to usunąć strumień, a nie ponownie kodować, prawdopodobnie chcesz to zrobić z pakietem MKVtoolnix (patrz strona videohelp.com ).

Istnieje kilka GUI, które mogą ci pomóc (sprawdź link do pomocy wideo). Nie jestem pewien, jaka mkvmergemoże być dokładna linia poleceń, ale myślę, że coś takiego działałoby:

# first, get audio track info so we know which one to keep
mkvmerge -i input.mkv
File 'input.mkv': container: Matroska
Track ID 1: video (V_MPEG4/ISO/AVC)
Track ID 2: audio (A_AAC)
Track ID 3: audio (A_AAC)        <----------- for example, let's keep this one
Track ID 4: audio (A_AAC)

mkvmerge -o output.mkv --atracks 3 input.mkv

To powinno załatwić sprawę (przepraszam, nie mam pliku przydatnego do testowania). Ta --atracksopcja mówi, mkvmergeaby skopiować tylko wymienione ścieżki audio do nowego pliku. Jeśli chcesz zachować 2 i 3, ale nie 4, możesz użyć --atracks 2,3.

mkvmergema wiele innych opcji ustawiania tytułów, dodawania opóźnienia w synchronizacji dźwięku itp., więc sprawdź stronę podręcznika, aby uzyskać szczegółowe informacje.

quack quixote
źródło
5
Wygląda --atracksopcja już nie istnieje, a nie należy stosować albo --audio-tracksalbo --video-tracks.
Poniedziałek
0

Spróbuj -fwymusić określony format:

ffmpeg -i input.mkv -map 0: 0 -map 0: 1 -map 0: 3 -vcodec copy -acodec libmp3lame -newsubtitle -f mkv test.mkv
John T.
źródło
Dziwnie to daje mi błąd: „Należy podać co najmniej jeden plik wyjściowy”
StackedCrooked
spróbuj użyć pełnej ścieżki, tj .: C: \ path \ to \ output.mkv (zakładam, że jesteś w systemie Windows przez odniesienie do odtwarzacza multimedialnego)
John T
@John T: użycie pełnej ścieżki (z cudzysłowami lub bez) wciąż daje mi komunikat o błędzie „Należy podać co najmniej jeden plik wyjściowy”.
StackedCrooked
0

Są tu naprawdę dwie osobne kwestie:

  1. W pierwszym wierszu poleceń kolejność parametrów może być niepoprawna. Myślę, że -newaudioprzełącznik musi znajdować się na końcu, po nazwie pliku wyjściowego.

  2. Drugi wiersz poleceń, „Usuwanie napisów”, ponieważ plik wejściowy zawiera napisy, musisz użyć -snprzełącznika, aby je usunąć. W przeciwnym razie wydaje się, że FFmpeg chce co najmniej jednego określonego na -mapliście.

użytkownik57355
źródło
0

W pierwszym poleceniu nie określono, że test.mkv jest plikiem wyjściowym. Wygląda na to, że musisz zmienić tę część, aby była podobna ... -c copy test.mkvlub określić kodek ... -c:s copy test.mkv.

I nie jestem pewien, co -newsubtitletam robi ta flaga. Ale jeśli masz plik z napisami, który chcesz dodać, powinieneś być w stanie zrobić kolejną flagę wejściową -i input.srt. Zobacz ten link do tego.

W drugim poleceniu wydaje mi się, że próbujesz zmapować strumień wideo i próbujesz go skopiować. Możesz więc spróbować usunąć -vcodec copyinstrukcję i powinna ona po prostu działać. :)

Szef kuchni faraon
źródło
1
Nie ma l specyfikatora strumienia .
llogan