วิธีเข้ารหัสวิดีโอที่ 30 FPS จากภาพที่ถ่ายที่ 7 FPS


21

ฉันไม่มีความรู้ใด ๆ เกี่ยวกับการเข้ารหัสวิดีโอฉันมีแอปพลิเคชันที่เขียนใน OpenGL และฉันบันทึกเฟรมที่สร้างเป็นpngรูปภาพ เฟรมจากแอพของฉันอยู่ที่ 7 FPS และฉันพยายามสร้างวิดีโอจากเฟรมเหล่านั้น

เพื่อจุดประสงค์นั้นฉันใช้ ffmpeg เช่นนี้

ffmpeg -framerate 30 -i img%03d.png -c:v libx264 -r 30 -pix_fmt yuv420p out.mp4

สิ่งที่นำมาจากเว็บไซต์นี้แต่ฉันสงสัยว่าเป็นไปได้หรือไม่ที่จะมีวิดีโอที่แสดงภาพเคลื่อนไหวที่ 30 FPS



เพียงแค่ปรับ-framerateพารามิเตอร์เพื่อให้ได้ผลลัพธ์ที่ต้องการ
nullptr

คำตอบ:


21

ฉันใช้รหัสด้านล่างเพื่อทำสิ่งเดียวกัน

ffmpeg -framerate 30 -i img%03d.png -c:v libx264 -pix_fmt yuv420p -crf 23 output.mp4

ทำลายคำสั่ง:

ffmpeg             <- call ffmpeg
  -framerate 30    <- set the input framerate to 30
  -i img%03d.png   <- read PNG images with filename img001, img002, img003, etc..
                     img can be changed to another prefix
                     %03d can be changed to %04d for 0001, %05d for 00001 formats, etc...
  -c:v libx264     <- Set the codec to libx264
  -pix_fmt yuv420p <- Set the pixel format to planar YUV 4:2:0, 12bpp
  -crf 23          <- set the Constant Rate Factor to 23 (default value)
  -output.mp4      <- the output filename

ค่านี้อ่านค่าที่ 30 fps ( -framerate 30ตัวเลือก) และเข้ารหัสโดยใช้libx264ตัวแปลงสัญญาณที่มีอัตราคงที่ 23 ( -crf 23ตัวเลือก)


26

มีสองอัตราเฟรมที่ต้องพิจารณาคืออินพุตและเอาต์พุต

โดยค่าเริ่มต้นอัตราเฟรมอินพุตคือ 25 และเอาต์พุตจะใช้อัตราเฟรมเดียวกันกับอินพุตเว้นแต่คุณจะแจ้งเป็นอย่างอื่น

อัตราเฟรมเดียวกันสำหรับอินพุตและเอาต์พุต

หากคุณต้องการอินพุตและเอาต์พุตมีอัตราเฟรมเท่ากันให้ระบุอัตราเฟรมอินพุต ตัวอย่างนี้จะกำหนดอัตราเฟรมที่ 30000/1001 (วิดีโอ NTSC):

ffmpeg -framerate 30000/1001 -i input output.mp4
  • ในตัวอย่างนี้คุณสามารถใช้ntscแทน30000/1001แต่อย่าใช้29.97เพราะนั่นไม่ถูกต้องหรือถูกต้อง ดูอื่น ๆนามแฝงอัตราเฟรม

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

อัตราเฟรมที่แตกต่างกันสำหรับอินพุตและเอาต์พุต

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

ffmpeg -framerate 10 -i input -r 25 output.mp4
  • ในตัวอย่างนี้เฟรมจะถูกทำซ้ำเพื่อไปจาก 10 ถึง 25 เอาต์พุตของคอนโซลจะบอกคุณว่าเฟรมกำลังถูกดร็อปหรือทำซ้ำ

  • ไฟล์ภาพ demuxerใช้ในขณะที่อัตราเฟรมที่ส่งออกจะถูกตั้งค่าการใช้-framerate-r

  • คุณอาจต้องเพิ่ม-pix_fmt yuv420pตัวเลือกในบางกรณีหากคุณกำลังส่งสัญญาณวิดีโอ H.264 ( ffmpegเอาต์พุตคอนโซลจะเตือนคุณหากคุณต้องการ) วิธีนี้จะใช้รูปแบบการสุ่มสีที่เข้ากันได้กับผู้เล่นทุกคน


2
ffmpeg เวอร์ชั่น 3.2.2 บอกฉัน: Option framerate not found.:-(
erik

ใช่คุณถูก. แต่อย่างไรก็ตามยัง-framerateไม่มีตัวเลือกอีกต่อไป ฉันจะลบความคิดเห็นของฉันเนื่องจากไม่มีส่วนเกี่ยวข้องกับการแปลงชุดรูปภาพเป็นวิดีโอด้วยอัตราเฟรมที่แน่นอน
erik

4
@erik -framerateไม่มีอยู่จริง มันถูกใช้โดยอิมเมจและ rawvideo demuxers และอุปกรณ์อินพุตบางอย่างเช่น x11grab และ v4l2
4174 llogan

1
-framerateเอกสารทางเลือกอยู่ที่ไหน ฉันอ่านman ffmpegหน้านี้แล้ว แต่หาไม่เจอ ตัวชี้ใด ๆ อาจ?
Atcold

1
ตกลงพบว่ามัน FFMPEG-DEVICES(1)...
Atcold

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