Come rimuovere i flussi audio da un file MKV?


16

Ho cercato di rimuovere i flussi audio non necessari da un file MKV (Matroska). Il motivo per cui voglio fare questo è di evitare di selezionare manualmente il flusso desiderato in Windows Media Player.

Il file di input fornisce le seguenti informazioni su 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

Dal momento che voglio stream 0, 1 e 3 (sub), il mio comando ffmpeg è simile al seguente:

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

che stranamente dà l'errore:

At least one output file must be specified

Rimozione dei sottotitoli:

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

mi dà questo:

Number of stream maps must match number of output streams

Mi sembra di non capire davvero come funziona l'opzione "map". Qualcuno mi aiuterebbe a capirlo?

Risposte:


25

Se tutto ciò che vuoi fare è rimuovere uno stream, non ricodificarlo, probabilmente vorrai farlo con il pacchetto MKVtoolnix (vedi la pagina di videohelp.com ).

Ci sono un paio di GUI che possono aiutarti (controlla il link del videohelp). Non sono sicuro di quale mkvmergepotrebbe essere esattamente la riga di comando, ma penso che qualcosa del genere funzionerebbe:

# 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

Questo dovrebbe fare il trucco (non ho un file a portata di mano per il test, mi dispiace). L' --atracksopzione dice mkvmergedi copiare solo le tracce audio elencate nel nuovo file. Se si desidera mantenere 2 e 3 ma non 4, è possibile utilizzare --atracks 2,3.

mkvmergeha molte altre opzioni per impostare i titoli, aggiungere un ritardo per sincronizzare l'audio, ecc. Quindi controlla la manpage per i dettagli.


5
Sembra che l' --atracksopzione non esista più, invece si dovrebbe usare --audio-trackso --video-tracks.
Malat,

0

Prova -fa forzare il formato specificato:

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

Questo mi dà stranamente l'errore: "È necessario specificare almeno un file di output"
StackedCrooked

prova a utilizzare un percorso completo, ovvero: C: \ path \ to \ output.mkv (suppongo che tu sia su windows dal riferimento del lettore multimediale)
John T

@John T: l'utilizzo del percorso completo (con o senza virgolette) mi dà ancora il messaggio di errore "È necessario specificare almeno un file di output".
StackedCrooked

0

Ci sono davvero due problemi separati qui:

  1. Nella prima riga di comando, l'ordine dei parametri potrebbe essere errato. Penso che l' -newaudiointerruttore debba essere alla fine, dopo il nome del file di output.

  2. La seconda riga di comando, "Rimozione dei sottotitoli", poiché il file di input ha sottotitoli, è necessario utilizzare l' -snopzione per rimuoverli. Altrimenti, sembra che FFmpeg ne voglia almeno uno specificato -mapnell'elenco.


0

Nel tuo primo comando, non hai specificato che test.mkv era il tuo file di output. Sembra che tu abbia bisogno di cambiare quella parte per essere qualcosa di simile ... -c copy test.mkvo specificare il codec simile ... -c:s copy test.mkv.

E non sono sicuro di cosa -newsubtitlestia facendo quella bandiera. Ma se hai un file di sottotitoli che vuoi aggiungere, dovresti essere in grado di fare un altro flag di input -i input.srt. Vedi questo link per quello.

Nel tuo secondo comando, penso che tu stia cercando di mappare il flusso video e di copiarlo. Quindi potresti voler provare a rimuovere l' -vcodec copyistruzione e dovrebbe funzionare. :)


1
Non esiste un l identificatore di flusso .
Llogan,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.