แทนที่จะใช้-ss
และ-to
ค้นหาพารามิเตอร์ซึ่งดูเหมือนไม่แม่นยำมากฉันสามารถตัดวิดีโอสำหรับหมายเลขเฟรมที่กำหนดได้หรือไม่ ตัวอย่างเช่น;
ffmpeg -i video.webm -startingframe 80 -endingframe 560 output.webm
[กรอบที่ 80 และกรอบที่ 560 รวมอยู่ ดังนั้นโดยรวมแล้วทำให้ (560 - 80 +1) เฟรม]
หลังจากคำตอบและค้นหาบิตฉันได้ลองคำสั่งบางอย่าง แต่จนถึงตอนนี้ฉันไม่สามารถหาวิธีที่ยอมรับได้
หากมีคนต้องการตัดวิดีโอสตรีมระหว่างเฟรมที่ 250 และ 750 นี่เป็นวิธีที่จะไป มันจะให้ 501 เฟรมเป็นผลลัพธ์:
หมายเหตุ: movie.mp4 มี 25 fps และอัตราตัวอย่างเสียง 48k
ffmpeg -i movie.mp4 -an -vf "select=between(n\,250\,750),setpts=PTS-STARTPTS" v_stream.webm
ตามที่คาดหวังเอาท์พุทคือ 20 วินาทียาวแน่นอน
ใช้วิธีการเดียวกันสำหรับเสียง:
ffmpeg -i movie.mp4 -vn -af "aselect=between(n\,480\,1440),setpts=PTS-STARTPTS" a_stream.webm
โดยไม่คาดคิดอันนี้มีความแม่นยำต่ำมาก มันควรจะให้ตัวอย่าง 960001 (960k + 1) ซึ่งเสียงเท่ากับ 20 วินาที แต่ผลลัพธ์มีความยาว 20.505 วินาทีและมีตัวอย่าง 984240 นอกจากนี้หากฉันเพิ่มระยะเวลาข้อผิดพลาดก็จะเพิ่มขึ้นเช่นกัน
จากนั้นฉันพยายามใช้ -ss -to พารามิเตอร์สำหรับตัดกระแสข้อมูลเสียง:
ffmpeg -i movie.mp4 -vn -ss 10.000 -to 30.000 a_stream.webm
วิธีคลาสสิกเก่าทำงานได้ดีขึ้นมาก เอาต์พุตมีความยาว 20.003 วินาทีและมี 960144 ตัวอย่าง นอกจากนี้การเพิ่มระยะเวลาไม่เพิ่มข้อผิดพลาดข้อผิดพลาดคงที่มี 144 ตัวอย่างเสมอกับไฟล์อินพุตนั้น
ข้อสรุป:
select
ตัวกรองทำงานได้ดีเกือบตลอดเวลา แต่ตัวเลือกไม่ใช่ -ss
พารามิเตอร์แบบคลาสสิกทำงานได้ดีกว่าสำหรับเสียง แต่ไม่ได้ตัวอย่างที่แม่นยำ นอกจากนี้มันเป็นไปไม่ได้ที่จะใช้-vf select
และ-ss
พารามิเตอร์ร่วมกันเพราะ-ss
จะส่งผลกระทบต่อทั้งกระแสข้อมูลเสียงและวิดีโอในขณะที่เราต้องการให้มีผลกับเสียงเท่านั้น
ดังนั้นเพื่อตัดไฟล์สื่ออย่างแม่นยำฉันต้องทำ 3 ขั้นตอนเหล่านี้:
ffmpeg -i movie.mp4 -an -vf "select=between(n\,250\,750),setpts=PTS-STARTPTS" v_stream.webm
ffmpeg -i movie.mp4 -vn -ss 10.000 -to 30.000 a_stream.webm
ffmpeg -i v_stream.webm -i a_stream.webm -c:v copy -c:a copy movie-between_10th_and 20th_seconds.webm
สิ่งนี้ให้ผลลัพธ์ที่แม่นยำที่สุด วิดีโอมีความยาว 20.000 วินาทีและเสียงแบบเฟรมมีความยาว 20.003 วินาทีและมีตัวอย่าง 960144 ไม่ตรงกับวิดีโอสตรีม แต่ก็โอเค มีส่วนเกิน 144 ตัวอย่างเท่านั้น ข้อเสียที่ใหญ่ที่สุดคือเมื่อใดก็ตามที่ฉันต้องการตัดไฟล์ฉันต้องส่ง 3 คำสั่งสำหรับงานง่ายๆและสร้างไฟล์ที่ไม่จำเป็นสองไฟล์: a_stream.webm และ v_stream.webm และselect
ตัวกรองไม่ทำงานกับไฟล์อินพุตบางไฟล์ที่ฉันได้ลอง มันทำงานได้สำเร็จ (?) แต่ไม่เคยหยุดกระบวนการเข้ารหัสดังนั้นฉันต้องปิดพรอมต์คำสั่งทุกครั้ง
select
และaselect
กรองสำหรับวิดีโอและสตรีมเสียง Select
มีความแม่นยำของเฟรมสำหรับวิดีโอ แต่aselect
ไม่แม่นยำตัวอย่าง จริงๆแล้วมันอยู่ไกลจากความถูกต้อง มันให้ผลลัพธ์ที่แย่กว่าการใช้-ss
-to
พารามิเตอร์แบบง่าย ๆ ด้วยเหตุนี้ในตอนนี้ฉันจึงใช้select
ตัวกรองและ-ss
-to
พารามิเตอร์ร่วมกันเพื่อให้ได้การตัดที่แม่นยำที่สุด แต่มันเป็นวิธีที่สกปรกที่จะทำ โปรดดูที่โพสต์แรกของฉันฉันได้เพิ่ม commandline และผลลัพธ์ของพวกเขา