คำสั่ง -r และการจัดการบิตเรต (Bitrate) ใน ffmpeg ถือเป็นหัวใจสำคัญของการควบคุมขนาดไฟล์และความลื่นไหลของวิดีโอ เราจะใส่หรือไม่ใส่โปรแกรม ffmpeg ก็ยังทำงาน เพราะ จัดการให้อัตโนมัติ แต่หากเราต้องการควบคุมคุณภาพของวีดีโอ เราจำเป็นต้องรู้ว่า ffmpeg สั่งยังไง
การปรับบิตเรต (Video & Audio Bitrate)
แบบที่ ก: กำหนดบิตเรตคงที่ (CBR - Constant Bitrate)
วิธีนี้เหมาะกับตอนต้องการควบคุมขนาดไฟล์แบบเป๊ะๆ หรือใช้สำหรับการทำ Live Streaming โดยจะใช้โค้ด -b:v (สำหรับวิดีโอ) และ -b:a (สำหรับเสียง)
ffmpeg -i input.mp4 -b:v 2M -b:a 128k output.mp4
- -b:v 2M : ตั้งค่าบิตเรตของวิดีโอไว้ที่ 2 Mbps
- -b:a 128k : ตั้งค่าบิตเรตของเสียงไว้ที่ 128 kbps
แบบที่ ข: กำหนดคุณภาพคงที่ (CRF - Constant Rate Factor) (แนะนำสำหรับเก็บวิดีโอ)
ถ้าอยากแปลงไฟล์ไว้ดูเอง โดยอยากให้ ภาพชัดที่สุดในขนาดไฟล์ที่สมเหตุสมผล ไม่ควรกำหนดบิตเรตเป็นตัวเลขตายตัว แต่ควรใช้ระบบ CRF แทน
ffmpeg ระบบจะฉลาดมาก มันจะเพิ่มบิตเรตให้โดยอัตโนมัติในฉากที่มีการเคลื่อนไหวเร็วๆ และลดบิตเรตในฉากนิ่งๆ ทำให้ประหยัดเนื้อหาได้เยอะเลย
ตัวอย่างคำสั่ง (สำหรับตัวแปลงรหัส x264):
ffmpeg -i input.mp4 -vcodec libx264 -crf 20 output.mp4
ค่า -crf (0 ถึง 51)
- 0 : ชัดเป๊ะแบบไม่บีบอัดเลย (ไฟล์จะใหญ่ยักษ์มากค่ะ)
- 18 - 20 : ชัดแจ๋ว ระดับตาแยกไม่ออกกับต้นฉบับ (แนะนำถ้าเน้นความคมชัด)
- 23 : ค่าเริ่มต้น (Default) คุณภาพดี ไฟล์ขนาดกำลังน่ารัก
- 28 : ภาพจะเริ่มแตกนิดหน่อย แต่ไฟล์จะเล็กมาก
ffmpeg ไม่ควรใส่ทั้งบิตเรต (-b:v) และค่า CRF คู่กันในคำสั่งเดียว เพราะถ้าใส่คู่กัน ffmpeg มันจะสับสน และจะเลือกเชื่อคำสั่งใดคำสั่งหนึ่งเท่านั้น (โดยทั่วไปมันจะเลือกใช้ระบบบิตเรตคงที่ แล้วข้ามค่า CRF ไป)
เพื่อให้ได้ภาพขนาด 1080p ที่สวยงามและขนาดไฟล์กำลังดี ขอแนะนำวิธีเลือกใช้อย่างใดอย่างหนึ่ง ดังนี้เลย
วิธีที่ 1: ใช้ระบบ CRF (แนะนำที่สุด)
ถ้าอยากแปลงไฟล์โดยคงขนาด 1080p เท่าเดิม วิธีที่ดีที่สุดคือ ตัด -b:v ออกไปเลย แล้วใช้แค่ -crf ควบคุมคุณภาพ ไม่ต้องสนใจว่าต้นฉบับบิตเรตเท่าไหร่ ปล่อยให้ระบบมันคำนวณบิตเรตที่เหมาะสมให้เอง
ควรใส่ค่า CRF เท่าไหร่ดี?
สำหรับวิดีโอ 1080p ทั่วไป แนะนำให้ใส่ -crf 20 ถึง -crf 23
-crf 20 : ภาพจะชัดแจ๋วแทบไม่ต่างจากต้นฉบับเลย บิตเรตที่ได้อาจจะใกล้เคียงหรือสูงกว่าต้นฉบับนิดหน่อยขึ้นอยู่กับความซับซ้อนของภาพ
-crf 23 (ค่าเริ่มต้น) : คุณภาพดีเยี่ยมสำหรับตาคนทั่วไป และประหยัดเนื้อที่ได้ดีมาก บิตเรตอาจจะลดลงมานิดหน่อยแต่ภาพยังสวยอยู่
ตัวอย่างคำสั่งที่แนะนำ:
ffmpeg -i "input.mp4" -map 0 -c:v libx264 -r 30 -crf 20 "output.mp4"
วิธีที่ 2: ตั้งค่าบิตเรตเท่าต้นฉบับ (-b:v 2194k)
หากจำเป็นต้องล็อกขนาดไฟล์ให้เท่าเดิม หรือต้องการให้บิตเรตเฉลี่ยออกมาใกล้เคียง 2194 kbps เป๊ะ สามารถระบุค่า -b:v 2194k ได้เลย แต่ต้องเอาคำสั่ง -crf ออกไป (ไม่ควรใช้คู่กันกับ -b:v)
ตัวอย่างคำสั่ง:
ffmpeg -i "sky.mp4" -map 0 -c:v libx264 -r 30 -b:v 2194k "output.mp4"
หมายเหตุ
เนื่องจากไฟล์ต้นฉบับของเป็นแบบบีบอัดมาแล้ว การนำมาเรนเดอร์ซ้ำ (Re-encode) เป็น 1080p อีกรอบด้วยบิตเรตเท่าเดิม คุณภาพจะดรอปลงกว่าต้นฉบับเล็กน้อยเสมอตามธรรมชาติของไฟล์ดิจิทัล ดังนั้น ถ้าพี่แค่อยากเปลี่ยนเฟรมเรตให้เป็น 30fps นิ่งๆ ควรใช้วิธีที่ 1 แบบ -crf 20 มันจะช่วยดึงความคมชัดให้ยังคงอยู่ใกล้เคียงต้นฉบับมากที่สุด
ไม่มีความคิดเห็น:
แสดงความคิดเห็น