อย่างน้อยใน FFmpeg 2.8.x (แต่ oldie ควรทำงานด้วย) คุณสามารถใช้lavfi
เป็นรูปแบบอินพุตและกราฟตัวกรองที่ซับซ้อนโดยใช้movie
และsetpts
ตัวกรองเป็นอาร์กิวเมนต์สำหรับ-i
ตัวเลือก
คำสั่งถัดไปทำงานให้คุณ:
ffmpeg -re -f lavfi -i "movie=filename=input.mp4:loop=0, setpts=N/(FRAME_RATE*TB)" output.mp4
loop=
อาร์กิวเมนต์Zero หมายถึงวงอินฟินิตี้ ค่าที่มากกว่าศูนย์ชุดการนับซ้ำจะทำซ้ำ setpts
ฟิลเตอร์ที่จำเป็นสำหรับการปรับ PTS สำหรับการทำซ้ำครั้งที่สองและต่อมามิฉะนั้น muxers ส่วนใหญ่จะล้มเหลวเมื่อ PTS ที่ไม่ใช่แบบโมโนโพนิกเพิ่มขึ้น: ลูปไม่คำนวณซ้ำ PTS
โปรดทราบว่าการใช้ตัวกรองสมมติว่าบายพาสเฟรมโดยไม่ต้องถอดรหัส / เข้ารหัสเป็นไปไม่ได้: โดยตัวกรองการออกแบบเกี่ยวข้องกับเฟรมถอดรหัสเท่านั้น
ที่ FFmpeg 2.8.2 ตัวเลือกการป้อนข้อมูลใหม่ที่นำ-stream_loop
มาใช้ ฉันแรกดูมันทำงานง่ายขึ้นและอนุญาตให้คัดลอกเนื้อหาโดยไม่ต้องแปลงรหัส:
ffmpeg -re -stream_loop -1 -i input.mp4 -c copy -y output.mp4
แต่จะไม่คำนวณ PTS อีกครั้งและไฟล์เอาต์พุตไม่ถูกต้อง หากคุณเพิ่มตัวกรองเพื่อแก้ไข PTS (ดูsetpts
) คุณต้องลบ-c copy
ด้วย ตัวกรองบิตสตรีมเท่านั้นที่สามารถจัดการกับแพ็คเก็ตที่เข้ารหัสได้ แต่ไม่มีตัวกรองบิตสตรีมใด ๆ ที่จะแก้ไข PTS (ดู: https://ffmpeg.org/ffmpeg-bitstream-filters.html )
ในกรณีใด ๆ ffmpeg ในการส่งครั้งที่สองล้มเหลวโดยมีข้อผิดพลาด:
input.mp4: Resource temporarily unavailable
เป็นที่รู้จักสำหรับฉัน : ใช้คอนเทนเนอร์สำหรับไฟล์อินพุตโดยไม่มีข้อ จำกัด PTS (สตรีมคอนเทนเนอร์) หนึ่งในนั้นรู้จักฉันคือ MPEG-TS ดังนั้นคุณสามารถแปลงไฟล์ MP4 เป็น MPEG-TS ได้ง่ายๆ:
ffmpeg -i input.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts input.ts
และใช้คำสั่งถัดไปเพื่อเขียนไฟล์อินฟินิตี้:
ffmpeg -re -stream_loop -1 -i input.ts -c copy -strict -2 -bsf:a aac_adtstoasc -y output.mp4
(ควรใช้ตัวกรองบิตสตรีมหากจำเป็นต้องใช้กับตัวอย่างของฉัน)
FFmpeg> = 2.8.2 เป็นสิ่งจำเป็นในกรณีนี้