Bagaimana cara menghapus stream audio dari file MKV?

16

Saya sudah mencoba untuk menghapus stream audio yang tidak diperlukan dari file MKV (Matroska). Alasan mengapa saya ingin melakukan ini adalah untuk menghindari keharusan memilih secara manual aliran yang diinginkan di Windows Media Player.

File input memberikan info ffmpeg berikut:

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

Karena saya ingin stream 0, 1 dan 3 (sub), perintah ffmpeg saya terlihat seperti ini:

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

yang anehnya memberikan kesalahan:

At least one output file must be specified

Menghapus subtitle:

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

berikan saya ini:

Number of stream maps must match number of output streams

Sepertinya saya tidak begitu mengerti cara kerja opsi "peta". Apakah seseorang akan membantu saya mencari tahu?

StackedCrooked
sumber

Jawaban:

25

Jika semua yang ingin Anda lakukan adalah menghapus aliran, bukan menyandikan ulang, Anda mungkin ingin melakukan ini dengan paket MKVtoolnix (lihat halaman videohelp.com ).

Ada beberapa GUI yang dapat membantu Anda (lihat di tautan videohelp). Saya tidak yakin apa sebenarnya baris mkvmergeperintahnya, tetapi saya pikir sesuatu seperti ini akan berhasil:

# 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

Itu harus melakukan trik (saya tidak punya file berguna untuk pengujian, maaf). The --atrackspilihan memberitahu mkvmergeuntuk menyalin hanya terdaftar track audio ke file baru. Jika Anda ingin menyimpan 2 & 3 tetapi bukan 4, Anda bisa menggunakannya --atracks 2,3.

mkvmergememiliki banyak opsi lain untuk mengatur judul, menambahkan penundaan untuk menyinkronkan audio, dll, jadi periksalah halaman manual untuk detailnya.

quack quixote
sumber
5
Sepertinya --atracksopsi tidak ada lagi, sebagai gantinya orang harus menggunakan salah satu --audio-tracksatau --video-tracks.
malat
0

Cobalah -funtuk memaksa format yang ditentukan:

ffmpeg -i input.mkv -map 0: 0 -map 0: 1 -map 0: 3 -vcodec copy -acodec libmp3lame -newsubtitle -f mkv test.mkv
John T
sumber
Anehnya ini memberi saya kesalahan: "Setidaknya satu file output harus ditentukan"
StackedCrooked
coba gunakan path lengkap, yaitu: C: \ path \ to \ output.mkv (saya berasumsi Anda berada di windows dengan referensi media player)
John T
@ John T: menggunakan path lengkap (dengan atau tanpa tanda kutip) masih memberi saya pesan kesalahan "Setidaknya satu file output harus ditentukan".
StackedCrooked
0

Sebenarnya ada dua masalah terpisah di sini:

  1. Di baris perintah pertama, urutan parameter mungkin salah. Saya pikir -newaudioswitch harus di akhir, setelah nama file output.

  2. Baris perintah kedua, "Menghapus subtitle", karena file input memiliki subtitle, Anda perlu menggunakan -snsakelar untuk menghapusnya. Kalau tidak, tampaknya FFmpeg ingin setidaknya satu yang ditentukan dalam -mapdaftar.

pengguna57355
sumber
0

Dalam perintah pertama Anda, Anda tidak menentukan bahwa test.mkv adalah file output Anda. Sepertinya Anda perlu mengubah bagian itu menjadi sesuatu seperti ... -c copy test.mkvatau menentukan seperti codec ... -c:s copy test.mkv.

Dan tidak yakin apa yang dilakukan -newsubtitlebendera itu di sana. Tetapi jika Anda memiliki file subtitle yang ingin Anda tambahkan, Anda harus dapat melakukan flag input lain -i input.srt. Lihat tautan ini untuk itu.

Dalam perintah kedua Anda, saya pikir sepertinya Anda mencoba memetakan aliran video dan mencoba menyalinnya. Jadi, Anda mungkin ingin mencoba menghapus -vcodec copyinstruksi dan itu hanya akan berhasil. :)

Chef Firaun
sumber
1
Tidak ada l penentu aliran .
Logan