ฉันมีไฟล์วิดีโอ mp4 ที่มีแทร็กเสียงหลายแทร็ก ฉันต้องการตัดแทร็กที่เหลือออกไปและเก็บไว้เพียงอันเดียว ฉันจะทำสิ่งนี้ได้อย่างไร
ฉันมีไฟล์วิดีโอ mp4 ที่มีแทร็กเสียงหลายแทร็ก ฉันต้องการตัดแทร็กที่เหลือออกไปและเก็บไว้เพียงอันเดียว ฉันจะทำสิ่งนี้ได้อย่างไร
คำตอบ:
ก่อนอื่น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
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
-c copy
ที่จะมีกระแสเหมือนกันสำหรับเสียง, วิดีโอ ffmpeg -i input.mp4 -map 0:0 -map 0:2 -c copy output.mp4
แต่ยังคำบรรยาย:
ปัญหาที่เกี่ยวข้อง - การลบแทร็กเสียงทั้งหมดออกจากไฟล์ mp4 สามารถทำได้ดังนี้:
ffmpeg -i input_file.mp4 -vcodec copy -an output_file.mp4
The encoder 'aac' is experimental but experimental codecs are not enabled, add '-strict -2' if you want to use it.
แต่ฉันเพิ่มธงเหล่านั้นและมันก็ยังเหมือนเดิม ... ?
ระบุหมายเลขสตรีม:
$ 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
ฉันใช้Avidemux (GUI) หลายครั้งและffmpeg (คอนโซล)
ใน Avidemux คุณเลือก "เสียง" -> "เลือกแทร็ก" ในเมนูหลัก จากนั้นให้คุณบันทึกวิดีโอเป็นไฟล์ใหม่
ที่น่าสนใจในบางกรณี Avidemux ให้ผลลัพธ์ที่ "ดีกว่า" กว่า ffmpeg
ในกรณีที่ Avidemux และ ffmpeg อยู่ในแหล่งเก็บข้อมูลมาตรฐานของ Fedora Linux (ฉันแน่ใจว่ามันเป็นมาตรฐานในรสชาติ Linux อื่น ๆ ด้วย)
-vn
หรือ-an
จะลบแทร็กวิดีโอหรือเสียงทั้งหมด การจัดหา-vn -acodec copy
จะลบวิดีโอ -an -vcodec copy
จะลบเสียงทั้งหมด
-vcodec copy
ระบุว่า ffmpeg ควรทำสำเนาตรงแทร็กวิดีโอที่มีอยู่ (และไม่ทำการประมวลผล / เข้ารหัสของมัน) หากคุณไม่ได้ระบุจะยังคงใช้งานได้ แต่ ffmpeg อาจเข้ารหัสวิดีโอแทร็กที่มีอยู่อีกครั้งและการดำเนินการจะใช้ CPU มากขึ้นและอาจใช้เวลานานกว่านั้นมาก
ใช้ 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 เท่านั้น ( ซึ่งไม่ได้ผลสำหรับฉัน)
หากคุณไม่สนใจโปรแกรมที่เป็น GUI ด้วยโปรแกรมตัดต่อวิดีโอของBlenderคุณสามารถทำได้และอื่น ๆ อีกมากมาย
โปรแกรมได้ถูกแทนที่ด้วยffmpeg
มีการใช้งานที่คล้ายกันมากดังนั้นคำสั่งทั้งหมดในโพสต์นี้อาจเป็นดังนี้:avconv
avconv
ffmpeg
avconv <old ffpmeg command line options>
ทำตามลิงค์นี้ในการติดตั้งavconv
ถ้าคุณอยู่ในอูบุนตู
FFMPEG อาจเป็นคำตอบที่เป็นประโยชน์สำหรับคุณ
$ man ffmpeg