หน้าเว็บ

วันอังคารที่ 19 พฤษภาคม พ.ศ. 2569

ffmpeg กับ เรื่อง วิดีโอบิตเรต

คำสั่ง -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  มันจะช่วยดึงความคมชัดให้ยังคงอยู่ใกล้เคียงต้นฉบับมากที่สุด

ไม่มีความคิดเห็น:

แสดงความคิดเห็น