จะตัดการสตรีมเสียงจากไฟล์ MKV ได้อย่างไร?


16

ฉันพยายามลบไฟล์เสียงที่ไม่ต้องการออกจากไฟล์ MKV (Matroska) เหตุผลที่ฉันต้องการทำเช่นนี้คือหลีกเลี่ยงการเลือกสตรีมที่ต้องการด้วยตนเองใน Windows Media Player

ไฟล์อินพุตให้ข้อมูล 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

เนื่องจากฉันต้องการกระแสข้อมูล 0, 1 และ 3 (ย่อย) คำสั่ง ffmpeg ของฉันจึงมีลักษณะดังนี้:

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

ซึ่งผิดพลาดอย่างน่าประหลาด:

At least one output file must be specified

การลบคำบรรยาย:

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

ให้ฉันนี้:

Number of stream maps must match number of output streams

ฉันดูเหมือนว่าฉันไม่เข้าใจวิธีการทำงานของตัวเลือก "แผนที่" มีคนช่วยฉันคิดออกไหม

คำตอบ:


25

หากสิ่งที่คุณต้องการทำคือลบกระแสไม่เข้ารหัสอีกครั้งคุณอาจต้องการทำเช่นนี้กับแพ็คเกจ MKVtoolnix (ดูที่หน้าวิดีโอของhelp.com )

มี GUI สองสามตัวที่อาจช่วยคุณได้ (ลองดูที่ลิงค์ videohelp) ฉันไม่แน่ใจว่าmkvmergecommandline ที่แน่นอนอาจเป็นอะไร แต่ฉันคิดว่าสิ่งนี้จะทำงาน:

# 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

นั่นควรทำเคล็ดลับ (ฉันไม่มีไฟล์สำหรับการทดสอบขออภัย) --atracksตัวเลือกที่บอกmkvmergeเพื่อคัดลอกเฉพาะจดทะเบียนแทร็กเสียงไปยังแฟ้มใหม่ หากคุณต้องการที่จะเก็บ 2 และ 3 แต่ไม่ 4 --atracks 2,3คุณสามารถใช้

mkvmergeมีตัวเลือกอื่น ๆ มากมายสำหรับการตั้งชื่อเพิ่มความล่าช้าในการซิงค์เสียง ฯลฯ ดังนั้นตรวจสอบรายละเอียดmanpage


5
ดูเหมือน--atracksตัวเลือกที่ไม่อยู่อีกต่อไปแทนควรใช้อย่างใดอย่างหนึ่งหรือ--audio-tracks --video-tracks
malat

0

ลอง-fบังคับรูปแบบที่ระบุ:

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

ข้อผิดพลาดนี้ทำให้ฉันแปลก: "ต้องระบุไฟล์เอาต์พุตอย่างน้อยหนึ่งไฟล์"
StackedCrooked

ลองใช้เส้นทางแบบเต็มคือ: C: \ เส้นทาง \ to \ output.mkv (ผมถือว่าคุณกำลังอยู่บนหน้าต่างโดยอ้างอิง Media Player)
จอห์นที

@John T: การใช้เส้นทางแบบเต็ม (โดยมีหรือไม่มีเครื่องหมายอัญประกาศ) ยังคงให้ข้อความแสดงข้อผิดพลาด "ต้องระบุไฟล์เอาต์พุตอย่างน้อยหนึ่งไฟล์"
StackedCrooked

0

มีสองประเด็นแยกกันจริงๆที่นี่:

  1. ในบรรทัดคำสั่งแรกลำดับของพารามิเตอร์อาจผิด ฉันคิดว่า-newaudioสวิตช์จะต้องอยู่ท้ายที่สุดหลังจากชื่อไฟล์เอาต์พุต

  2. บรรทัดคำสั่งที่สอง "การลบคำบรรยาย" เนื่องจากไฟล์อินพุตมีคำบรรยายคุณต้องใช้-snสวิตช์เพื่อลบคำบรรยาย มิฉะนั้นดูเหมือนว่า FFmpeg ต้องการอย่างน้อยหนึ่งที่ระบุไว้ใน-mapรายการ


0

ในคำสั่งแรกของคุณคุณไม่ได้ระบุว่า test.mkv เป็นไฟล์เอาต์พุตของคุณ ดูเหมือนว่าคุณจะต้องมีการเปลี่ยนแปลงที่เป็นส่วนหนึ่งที่จะเป็นสิ่งที่ชอบหรือระบุตัวแปลงสัญญาณเช่น... -c copy test.mkv... -c:s copy test.mkv

และไม่แน่ใจว่า-newsubtitleธงนั้นกำลังทำอะไรอยู่ แต่ถ้าคุณมีไฟล์คำบรรยายที่คุณต้องการเพิ่มคุณควรจะสามารถตั้งค่าสถานะอินพุตอื่น-i input.srtได้ ดูลิงค์นี้เพื่อที่

ในคำสั่งที่สองของคุณฉันคิดว่าดูเหมือนว่าคุณกำลังพยายามแมปสตรีมวิดีโอและพยายามที่จะคัดลอก ดังนั้นคุณอาจต้องการลองลบ-vcodec copyคำแนะนำและควรใช้งานได้ :)


1
ไม่มีเป็นตัวระบุกระแสl
llogan
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.