จะลบแทร็กเสียงออกจากไฟล์วิดีโอ mp4 ได้อย่างไร


95

ฉันมีไฟล์วิดีโอ mp4 ที่มีแทร็กเสียงหลายแทร็ก ฉันต้องการตัดแทร็กที่เหลือออกไปและเก็บไว้เพียงอันเดียว ฉันจะทำสิ่งนี้ได้อย่างไร


คำตอบ:


110

ก่อนอื่นffmpeg -i file.mp4ให้เรียกใช้เพื่อดูสตรีมที่มีอยู่ในไฟล์ของคุณ คุณควรเห็นสิ่งนี้:

Stream #0.0: Video: mpeg4, yuv420p, 720x304 [PAR 1:1 DAR 45:19], 23.98 tbr, 23.98 tbn, 23.98 tbc
Stream #0.1: Audio: ac3, 48000 Hz, 5.1, s16, 384 kb/s
Stream #0.2: Audio: ac3, 48000 Hz, 5.1, s16, 384 kb/s

จากนั้นเรียกใช้เพื่อคัดลอกสตรีมวิดีโอและสตรีมเสียงที่ffmpeg -i file.mp4 -map 0:0 -map 0:2 -acodec copy -vcodec copy new_file.mp4 2new_file.mp4


3
บน Windows คำสั่งนี้ให้ข้อผิดพลาดOption map (set input stream mapping) cannot be applied to input file file.mp4 new_file.mp4 -- you are trying to apply an input option to an output file or vice versa. Move this option before the file it belongs to.: เพื่อแก้ไขเพียงแค่เปลี่ยนลำดับของข้อโต้แย้งดังนี้:ffmpeg -i file.mp4 -map 0:0 -map 0:2 -acodec copy -vcodec copy new_file.mp4
MrLore

ข้อผิดพลาดเดียวกับ @MrLore บน OS X.
Oskar Persson

1
มันเหมือนกันบน Ubuntu!
ทอมมาโซ

ใช้งานได้กับรูปแบบ MKV ด้วย
user3405291

1
คุณสามารถใช้ตัวเลือกทั่วไปมากขึ้น-c copyที่จะมีกระแสเหมือนกันสำหรับเสียง, วิดีโอ ffmpeg -i input.mp4 -map 0:0 -map 0:2 -c copy output.mp4แต่ยังคำบรรยาย:
Futal

97

ปัญหาที่เกี่ยวข้อง - การลบแทร็กเสียงทั้งหมดออกจากไฟล์ mp4 สามารถทำได้ดังนี้:

ffmpeg -i input_file.mp4 -vcodec copy -an output_file.mp4

1
สิ่งนี้ทำให้ฉันมีข้อผิดพลาดThe encoder 'aac' is experimental but experimental codecs are not enabled, add '-strict -2' if you want to use it.แต่ฉันเพิ่มธงเหล่านั้นและมันก็ยังเหมือนเดิม ... ?
poshaughnessy


ความคิดเห็นของ poshaughnessy อีกครั้ง: มีข้อมูลบางส่วนอยู่ที่นี่: stackoverflow.com/questions/32931685/ การสนทนาแสดงให้เห็นว่า ffmpeg รุ่นล่าสุดไม่พบปัญหา "aac รุ่นทดลอง" ตามกฎทั่วไปจะช่วยในการวินิจฉัยปัญหาของคุณหากคุณระบุเวอร์ชันของซอฟต์แวร์ที่คุณใช้และไวยากรณ์ที่แน่นอนของคำสั่ง (หลังจากที่คุณเพิ่มแฟล็ก) ที่ให้ข้อผิดพลาด (loc loc คำตอบของ cf. freeseek ) ในกรณีเฉพาะนี้ข้อมูลวิดีโอจากไฟล์อินพุตอาจมีประโยชน์เช่นกัน
Greg Marks

8

ระบุหมายเลขสตรีม:

$ ffmpeg -i in.mp4
   ...
   Stream #0:0: Video: ...
   Stream #0:1: Audio: ...
   Stream #0:2: Audio: ...

ใช้-map _file_:_stream_เพื่อเลือกสตรีมที่จะประมวลผลและส่งออก

$ ffmpeg -i in.mp4 -map 0:0 -map 0:2 -vcodec copy -acodec copy out.mp4

ดู: https://ffmpeg.org/ffmpeg.html#Advanced-options


4

คุณสามารถลองใช้avidemuxซึ่งจัดการไฟล์เสียงเพียงไฟล์เดียวภายใน (และบังคับให้คุณเลือกหนึ่งแทร็กเฉพาะ) ฉันไม่เคยลองด้วย. mp4 แต่ใช้งานได้กับฟอร์แมตอื่น


ทำงานได้ไม่ดีนัก อาจเป็นข้อผิดพลาด แต่เสียงกลับมายุ่งเหยิงแม้ว่ามันจะทำงานได้ดี (ลบแทร็กเสียงที่เหลือ)
tshepang

3

ฉันใช้Avidemux (GUI) หลายครั้งและffmpeg (คอนโซล)

ใน Avidemux คุณเลือก "เสียง" -> "เลือกแทร็ก" ในเมนูหลัก จากนั้นให้คุณบันทึกวิดีโอเป็นไฟล์ใหม่

ที่น่าสนใจในบางกรณี Avidemux ให้ผลลัพธ์ที่ "ดีกว่า" กว่า ffmpeg

ในกรณีที่ Avidemux และ ffmpeg อยู่ในแหล่งเก็บข้อมูลมาตรฐานของ Fedora Linux (ฉันแน่ใจว่ามันเป็นมาตรฐานในรสชาติ Linux อื่น ๆ ด้วย)


1

-vnหรือ-anจะลบแทร็กวิดีโอหรือเสียงทั้งหมด การจัดหา-vn -acodec copyจะลบวิดีโอ -an -vcodec copyจะลบเสียงทั้งหมด

-vcodec copyระบุว่า ffmpeg ควรทำสำเนาตรงแทร็กวิดีโอที่มีอยู่ (และไม่ทำการประมวลผล / เข้ารหัสของมัน) หากคุณไม่ได้ระบุจะยังคงใช้งานได้ แต่ ffmpeg อาจเข้ารหัสวิดีโอแทร็กที่มีอยู่อีกครั้งและการดำเนินการจะใช้ CPU มากขึ้นและอาจใช้เวลานานกว่านั้นมาก


0

ใช้ avidemux ในบรรทัดคำสั่ง

(ใน Avidemux GUI ตามที่อธิบายไว้ในhttps://unix.stackexchange.com/a/85834/4319ด้านบนคุณเพียงแค่เลือก / ยกเลิกการเลือกแทร็กเสียงและบันทึกไฟล์ (ทุกอย่างจะถูกคัดลอกไปยัง AVI ใหม่))

ฉันได้ดูว่าโปรเจ็กต์ประเภทใดที่ถูกบันทึกเป็น SpiderMonkey หรือ TinyPy projetcs สำหรับการกระทำของฉันและปรากฎว่าโปรเจ็กต์ SpiderMonkey (JavaScript) ขาดการเลือกแทร็กเสียงที่ฉันต้องการ แต่โครงการ TinyPy (Python) มี พวกเขา

ฉันลบทุกอย่างที่ไม่เกี่ยวข้อง (โหลของบรรทัดที่ไม่จำเป็น) และนี่คือสิ่งที่ฉันได้รับในsome_series.py:

#PY  <- Needed to identify #
#--automatically built--

adm = Avidemux()

adm.audioClearTracks()
adm.audioAddTrack(1)

มันออกจากแทร็ก 1 แต่ลดลงแทร็ก 0

จากนั้นฉันรันชุดการแปลงไฟล์หลายไฟล์ด้วยคำสั่งเช่นนี้:

for f in *.avi; do avidemux3_cli --nogui --load "$f" --run ../some_series.py --save ../some_series/"${f%%.rus.eng.avi}".eng.avi --quit; done

มันคัดลอกทุกอย่าง แต่ลดลงทั้งหมด แต่แทร็กเสียงที่จำเป็น

วิธีการรัน avidemux จาก command-line นั้นฉันเรียนรู้จากhttps://www.avidemux.org/admWiki/doku.php?id=tutorial:batch_processingถึงแม้ว่าพวกเขาจะไม่พูดถึงสคริปต์ Python แต่เป็นคน JS เท่านั้น ( ซึ่งไม่ได้ผลสำหรับฉัน)


-1

หากคุณไม่สนใจโปรแกรมที่เป็น GUI ด้วยโปรแกรมตัดต่อวิดีโอของBlenderคุณสามารถทำได้และอื่น ๆ อีกมากมาย


-2

โปรแกรมได้ถูกแทนที่ด้วยffmpeg มีการใช้งานที่คล้ายกันมากดังนั้นคำสั่งทั้งหมดในโพสต์นี้อาจเป็นดังนี้:avconvavconvffmpeg

avconv <old ffpmeg command line options>

ทำตามลิงค์นี้ในการติดตั้งavconvถ้าคุณอยู่ในอูบุนตู


-3

FFMPEG อาจเป็นคำตอบที่เป็นประโยชน์สำหรับคุณ

$ man ffmpeg

ฉันดูสั้น ๆ และมันค่อนข้างหนาแน่น ฉันค้นหาคำว่า "audio" และ "audio track" และดูเหมือนไม่มีอะไรชัดเจน
tshepang

@Tshepang "track" นั้นคลุมเครือซึ่งอาจเป็นสาเหตุที่ FFmpeg ต้องการคำศัพท์ที่แม่นยำยิ่งขึ้น FFmpeg พิจารณาว่าเสียงมาใน "สตรีม" โดยแต่ละอันประกอบไปด้วย "ช่อง" หนึ่งช่องหรือมากกว่า AFAICT แต่ละช่องเป็นแบบโมโนพร้อมกับสตรีมที่อธิบายว่าควรส่งออกไปอย่างไร (แพน) เป็นค่าเริ่มต้น เช่นสตรีมสเตอริโอประกอบด้วยสองช่องสัญญาณหนึ่งส่งไปยังเอาต์พุตด้านซ้ายของการ์ดเสียงโดยค่าเริ่มต้นและอีกช่องหนึ่งส่งไปยังเอาต์พุตเสียงด้านขวาของการ์ดเสียงโดยค่าเริ่มต้น
sampablokuper
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.