Thursday, May 14, 2015

FFMPEG กับไฟล์หนัง 60fps

ผมได้นำ FFMPEG มาใช้บีบ Playblast จาก Maya ด้วย H.264 มากว่า 2 ปีแล้ว ซึ่งก็ใช้ได้ดีและได้ขนาดไฟล์เล็กถูกใจมาเสมอ

จนกระทั่งโปรเจคล่าสุด มีการใช้เฟรมเรต 60 fps เป็นครั้งแรก ปรากฏว่า FFMPEG ค่อนข้างเอ๋อไปเหมือนกัน Playblast ออกมาแค่ 80 frame แต่มันพยายาม encode เฟรม 81 82 83... ไปถึง 150 บ้าง 160 บ้าง

ปรากฏว่า 1-80 ปกติดีครับ แต่ 81 เป็นต้นไปจะเป็นเฟรมเละ บางทีก็เป็นภาพซ้อน

เฟรมเสีย จาก FFMPEG
อันที่จริงวิธีแก้ ก็แค่ต้องเจาะจงความยาวของไฟล์เป็นจำนวนเฟรม ให้ FFMPEG ด้วยเท่านั้นเอง ด้วย flag -vframes แต่ทีแรกก็เล่นเอางงอยู่พักนึง

ffmpeg -y -i "uncompressed.avi" -vcodec libx264 -vframes 80 -crf 22 -bf 0 "output.mp4"

การหาจำนวนเฟรมจาก Maya ทำได้ไม่ยาก ถ้าต้องการ playback ทั้งแถบ ใช้โค้ด
startframe = pm.playbackOptions(q=1, ast=1)
endframe = pm.playbackOptions(q=1, aet=1)

หรือถ้าต้องการเฟรมเฉพาะส่วนที่ select ไฮไลท์ไว้ ใช้โค้ด
slider = pm.mel.eval('$tmpVar=$gPlayBackSlider')
startframe, endframe = pm.timeControl(slider,q=True,rangeArray=True)

จากนั้นเอาค่าที่ได้มาลบกันก็เป็นอันเสร็จ