การแปลงเฟรม PNG เป็นวิดีโอที่ 1 FPS


21

ฉันมีเฟรมวิดีโอในรูปแบบ PNG ที่ 1 FPS และฉันพยายามแปลงให้เป็นวิดีโอโดยใช้ ffmpeg

ถ้าฉันทำสิ่งนี้:

ffmpeg -i data/input-%4d.png data/output.mp4

ฉันได้รับวิดีโอที่ 25FPS ซึ่งโดยทั่วไปแล้วจะเป็นไปข้างหน้าอย่างรวดเร็วของอินพุต (ซึ่งถ่ายที่ 1FPS)

ถ้าฉันลอง:

ffmpeg -i data/input-%4d.png -r 1 data/output.mp4

ฉันได้รับสิ่งที่ VLC ไม่ต้องการเล่น :)

ตอนนี้ถ้าฉันใช้วิดีโอแรก (FF หนึ่ง) และใช้ตัวกรองเพื่อทำให้ช้าลง (เช่น-filter:v 'setpts=24.0*PTS') ฉันสามารถทำให้มันเล่นได้เหมือนวิดีโอ 1 FPS แต่แน่นอนว่าราคาคือขนาดไฟล์ มันสร้างเฟรมซ้ำหลายอันที่ฉันเดา

ดังนั้นคำถามคือฉันจะสร้างวิดีโอที่มี 1 FPS ที่แน่นอนและเล่นที่ความเร็วนั้นได้อย่างไร รูปแบบผลลัพธ์ btw ไม่สำคัญสำหรับฉัน


ผมไม่แน่ใจว่าจะฉลาดพอที่จะคิดออกตัวแปลงสัญญาณวิดีโอที่มาจากการขยายภาชนะรูปแบบไฟล์ffmpeg .mp4ลองเพิ่ม-vcodec libx264 -vpre hqในบรรทัดคำสั่งเพื่อบอกให้ตัวแปลงสัญญาณและพารามิเตอร์การเข้ารหัส
Warren Young

จริง ๆ แล้วคิดว่ามันโอเคและฉันก็บอกว่ามันใช้งานได้ดีและให้ผลลัพธ์ที่แปลกเมื่อฉันเพิ่ม-r 1เท่านั้น
Assaf Lavie

ฉันคิดว่าคุณอาจมีโชคดีที่คำตอบ ffmpeg ในstackoverflow.comหรือsuperuser.com
ดาเมียน

คำตอบ:


19

หากคุณต้องการหนึ่งซับในสำหรับ FFMPEG ที่สร้างวิดีโอที่เล่นที่ 1 เฟรมต่อวินาทีสิ่งที่คุณต้องการทำคือระบุ framerates สำหรับอินพุตและเอาต์พุตเช่นนี้:

ffmpeg -r 1 -i data / input-% 4d.png -pix_fmt yuv420p -r 10 data / output.mp4

-r 1วิธีการวิดีโอจะเล่นวันที่ 1 ของภาพต้นฉบับต่อวินาที วิธีการวิดีโอจะเล่นอยู่ที่ 10 เฟรมต่อวินาที
-r 10

( -pix_fmt yuv420pเพียงแค่นั้นเพื่อให้แน่ใจว่าเข้ากันได้กับโปรแกรมการเล่นที่หลากหลายมันเป็นสิ่งจำเป็นที่นี่ตัวอย่างเช่นเพื่อให้วิดีโอสามารถเล่นได้โดย Windows Media Player)

ฉันทดสอบหลายเฟรมเวอร์เอาท์พุทที่แตกต่างกันและ 10 ดูเหมือนจะเป็นจำนวนต่ำสุดที่คุณสามารถใช้ที่จะยังคงผลิตวิดีโอที่ VLC จะเล่น

แน่นอนคำสั่งข้างต้นหมายถึงภาพต้นฉบับแต่ละภาพจะถูกคูณ แต่เป็นวิธีที่ง่ายกว่า "ช้าลง" ที่คุณพูดถึงและขึ้นอยู่กับตัวแปลงสัญญาณที่อาจไม่สร้างวิดีโอที่มีขนาดใหญ่กว่า 1-FPS จริงมาก วีดีโอ

เพื่อทดสอบสิ่งนี้ฉันเพิ่งสร้างวิดีโอ 1-FPS จริงซึ่งออกมาเป็น 2.24 kiB จากนั้นฉันก็สร้างวิดีโอที่มีภาพอินพุตเดียวกัน แต่ส่งออกที่ 24 FPS และออกมาที่ 5.76 kiB นั่นเป็นเพียงสองเท่าของขนาดและไม่มีที่ไหนเลยใกล้กับขนาด 24 เท่า :)


+1 ใน -pix_fmt ง่ายต่อการลืมบางคนยืนยันในการใช้ WMP :-)
Smalltown2k

ทำไมคุณต้องการรูปแบบผลลัพธ์เป็น 10 fps ในขณะที่อินพุตเพียง 1 มันจะไม่สร้างเฟรมซ้ำซ้อน 90% ที่เหมือนกันหมดหรือไม่
เฮอร์เบิร์ต

@ เฮอร์เบิร์ตมันสร้างเฟรมที่ซ้ำซ้อนเพื่อให้คุณสามารถรับอัตราเฟรมสูงถึง 10 ซึ่งทำได้เพียงเพื่อ VLC ไม่บ่นและมันจะไม่เปลี่ยนวิดีโอด้วยสายตา ตัวเข้ารหัสนั้นฉลาดพอที่จะเห็นว่าเฟรมเหมือนกันทั้งหมดดังนั้นคุณจึงไม่ได้ไฟล์ที่ใหญ่กว่านี้
chiliNUT

@ chiliNUT ชัดเจนสิ่งที่สำคัญซึ่งไม่ใช่ทุกรูปแบบ แต่รูปแบบที่มีสติส่วนใหญ่จะทำ ขอบคุณ!
เฮอร์เบิร์

5

ใช้ทั้ง-framerateและ-r

เช่นการมีวิดีโอขั้นสุดท้ายที่ดูเหมือน 1FPS:

ffmpeg -framerate 1 -pattern_type glob -i '*.png' \
    -c:v libx264 -r 30 -pix_fmt yuv420p out.mp4

สิ่งนี้คล้ายกับการแปลง PNG เฟรมเป็นวิดีโอที่ 1 FPS | Unix & Linux Stack Exchangeกล่าว แต่ฉันต้องการ-framerateแทนที่จะ-rให้มันทำงาน

สิ่งนี้ถูกกล่าวถึงในวิกิที่: http://trac.ffmpeg.org/wiki/Slideshow#Framerates

มันตั้งค่าอัตราเฟรมเอาท์พุทเป็น30ซึ่ง VLC สามารถจัดการและคัดลอกแต่ละภาพ 30 ครั้งเพื่อให้วิดีโอเอาต์พุตดูเหมือนว่าจะอยู่ที่ 1 FPS ดูเพิ่มเติม: ปัญหาการเล่นใน VLC ที่มีวิดีโอ fps ต่ำจากภาพโดยใช้ ffmpeg | กองล้นมากเกินไป

VLC สามารถเล่นวิดีโอได้ตามปกติ

ทดสอบบน Ubuntu 16.10, VLC 2.2.4, ffmpeg3.0.5 ในไดเรกทอรีที่มี 10 PNG

ดูเพิ่มเติมที่: /programming/19267443/vlc-freezes-for-low-1-fps-video-created-from-images-with-ffmpeg


ความแตกต่างระหว่าง-rและ-framerateคืออะไร
Royi

@Royi ฉันไม่รู้จริงๆยกเว้นว่ามันเป็นสิ่งเดียวที่ใช้ได้กับฉัน :-) แต่ถ้าคุณจัดการแยกมันออกมาจากmanหน้าเว็บให้ฉันรู้ ;-) คำพูดที่มีความหมายคือ "-r ในฐานะที่เป็น ตัวเลือกการป้อนข้อมูลละเว้นการประทับเวลาใด ๆ ที่เก็บไว้ในไฟล์และแทนที่จะสร้างการประทับเวลาสมมติว่าอัตราเฟรมคงที่เฟรมต่อวินาทีนี้ไม่เหมือนกับตัวเลือก -framerate ที่ใช้สำหรับรูปแบบอินพุตบางอย่างเช่น image2 หรือ v4l2 (เคยเป็นรุ่นเดียวกัน FFmpeg) หากมีข้อสงสัยให้ใช้ -framerate แทนตัวเลือกอินพุต -r "
Ciro Santilli 新疆改造中心法轮功六四事件

3

ถ้าคุณเพิ่มตัวอย่างที่สองของคุณเล็กน้อยดังนี้:

$ ffmpeg -r 1 -i data/input-%4d.png -c:v libx264 out.mp4

-r 1ความต้องการที่จะมาก่อนที่ไฟล์ .png ไม่ได้หลังจาก

จากเอกสาร FFmpeg :

ตามกฎทั่วไปแล้วตัวเลือกจะถูกนำไปใช้กับไฟล์ที่ระบุถัดไป ดังนั้นลำดับจึงมีความสำคัญและคุณสามารถมีตัวเลือกเดียวกันในบรรทัดคำสั่งได้หลายครั้ง แต่ละเหตุการณ์จะถูกนำไปใช้กับไฟล์อินพุตหรือเอาต์พุตถัดไป


น่าเสียดายที่นี่ใช้งานไม่ได้ อย่างไรก็ตามการเอ่ยถึงว่าคำสั่งซื้อนั้นสำคัญช่วยให้ฉันประหยัดเวลาได้มาก ขอบคุณ
Mohammed Noureldin

0

นี่เป็นข้อบกพร่องใน VLC (ซึ่งยังคงมีอยู่ในรุ่น 3.0.6) หลังจากการทดลองบางอย่างที่ฉันตระหนักว่าVLC เกิดปัญหาสำหรับวิดีโอที่มี FPS น้อยกว่า 10 วิดีโอทั้งหมดที่มี 10 FPS ขึ้นไปไม่น่าจะมีปัญหา ดังนั้นในปัจจุบันจึงไม่มีวิธีที่สะอาดในการรับวิดีโอที่มี 1 FPS ซึ่งสามารถเล่นได้ใน VLC ( อย่ายอมแพ้ให้อ่านต่อไป )

วิธีแก้ปัญหาหนึ่งคือ - แสดงไว้ในคำตอบข้างต้น - เพื่อปลอมเอฟเฟกต์ของ 1 FPS โดยการทำซ้ำภาพ (เมื่อเรามี FPS จริงเท่ากับ 10 หรือมากกว่านั้นซึ่งใช้ได้สำหรับ VLC)

ตัวอย่าง:หากคุณมีโฟลเดอร์ที่มี 12 ภาพและคุณต้องการสร้างวิดีโอที่มี 1 FPS (ซึ่งสามารถเล่นได้ใน VLC) คุณต้องทำซ้ำแต่ละภาพหลายครั้ง (สมมติว่า 10 ครั้ง) แล้วบอก FFMPEG เพื่อสร้างวิดีโอ 10 FPS ด้วยวิธีนี้เราจะได้วิดีโอที่มีเฟรมรวม 120 ภาพแต่ละภาพจะเล่นเป็นเวลา 1 วินาที (เนื่องจากมีการทำซ้ำ 10 ครั้ง) ซึ่งเป็นของปลอมเพียง 1 เฟรมต่อวินาที

ฉันชอบที่จะใช้fpsพารามิเตอร์มากกว่า-r (ซึ่งแสดงในคำตอบอื่น) ซึ่งในบางกรณีอาจมีปัญหา (ตามเอกสารประกอบอย่างเป็นทางการ )

ffmpeg -framerate 1 -i "img (%d).jpg" -c:v libvpx-vp9 -vf "fps=10,format=yuv420p" out.mkv

เนื่องจากอินพุต-framerateต่ำกว่าเอาต์พุตfpsFFMPEG จะทำซ้ำเฟรมเพื่อให้ได้อัตราเฟรมเอาต์พุตที่คุณต้องการ (ซึ่งเท่ากับ 10 ตามคำสั่งด้านบน)

นอกจากนี้ยังเป็นสิ่งสำคัญที่จะแจ้งให้ทราบว่าคำสั่งของ-framerateและ-vf fpsเป็นสิ่งที่สำคัญเช่นการกำหนดค่านี้จะถูกนำไปใช้กับวิดีโอดังกล่าวต่อไป (in-หรือเอาท์พุท) เป็นไปตามเอกสารอย่างเป็นทางการ :

ตัวเลือกจะนำไปใช้กับไฟล์ที่ระบุต่อไป ดังนั้นคำสั่งซื้อจึงมีความสำคัญ ...

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