การตัดวิดีโอที่เฟรมที่แน่นอนด้วย ffmpeg select filter


16

แทนที่จะใช้-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ตัวกรองไม่ทำงานกับไฟล์อินพุตบางไฟล์ที่ฉันได้ลอง มันทำงานได้สำเร็จ (?) แต่ไม่เคยหยุดกระบวนการเข้ารหัสดังนั้นฉันต้องปิดพรอมต์คำสั่งทุกครั้ง


ฉันได้อ่านหน้านั้นแล้วก่อนโพสต์คำถามนี้ หน้านั้นไม่ได้ช่วยฉัน หากอินพุตมีตัวแปร fps เราสามารถคำนวณโดยใช้สมการนั้นได้หรือไม่? ฉันไม่คิดอย่างนั้น นอกจากนี้ฉันยังไม่คิดว่า '-ss' จะให้ตำแหน่งที่ถูกต้องแก่ฉัน การค้นหาแบบเฟรมต่อเฟรมจะดีกว่าฉันเดา
destor

โปรดทราบว่า-ssมีความแม่นยำของเฟรม (ดูที่นี่ ) คุณมีอินพุต -fps แบบแปรผันจริงหรือไม่ คำตอบของฉันจะเชื่อมโยงไปยังเธรดรายการจดหมายซึ่งกล่าวถึงโดยใช้selectตัวกรองซึ่งคุณสามารถระบุหมายเลขเฟรมได้ คุณเคยลองไหม
slhck

ฉันลองใช้selectและaselectกรองสำหรับวิดีโอและสตรีมเสียง Selectมีความแม่นยำของเฟรมสำหรับวิดีโอ แต่aselectไม่แม่นยำตัวอย่าง จริงๆแล้วมันอยู่ไกลจากความถูกต้อง มันให้ผลลัพธ์ที่แย่กว่าการใช้-ss -toพารามิเตอร์แบบง่าย ๆ ด้วยเหตุนี้ในตอนนี้ฉันจึงใช้selectตัวกรองและ-ss -toพารามิเตอร์ร่วมกันเพื่อให้ได้การตัดที่แม่นยำที่สุด แต่มันเป็นวิธีที่สกปรกที่จะทำ โปรดดูที่โพสต์แรกของฉันฉันได้เพิ่ม commandline และผลลัพธ์ของพวกเขา
destor

รุ่น ffmpeg?
เห็บ

ทำไมคุณพยายามที่จะตัดโดยหมายเลขเฟรมอย่างใดอย่างหนึ่ง หากต้องการความแม่นยำประเภทนั้นทำไมไม่ใช้ avidemux? บางทีปัญหาดั้งเดิมของคุณอาจเป็นเพราะมันเลือกเฟรมหลักที่ใกล้เคียงที่สุด?
เห็บ

คำตอบ:


3

เสียงมาจากวินาทีไม่เฟรมดังนั้นหากคุณต้องการตัดวิดีโอคุณต้องคำนวณวิดีโอ fps × 20 วินาทีเช่นนี้: 20 วินาที 23.97 fps = 479.4

การตัดเฟรมไม่ถูกต้องเนื่องจากคุณไม่สามารถรับ fps เต็มในวินาทีสุดท้ายดังนั้นเสียงจะได้รับเพิ่มเติมวินาทีหรือเพียงครึ่งวินาทีหรือมากกว่าหรือน้อยกว่า! บางทีคุณควรใช้วินาทีแทนเฟรมเพื่อให้ได้คัตที่แน่นอนคุณบอก ffmpeg ให้ทำเพื่อคุณ และถ้าคุณได้รับ 1 เฟรมเพิ่มจะเปลี่ยน 250 และ 750 เฟรมเป็น 250 และ 749 เฟรมได้ยังไง! ใช้ลบ 1 ตรงนั้นเพื่อให้ได้จำนวนเฟรมที่คุณต้องการ!


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