NB Frames หมายถึงจำนวนเฟรมในสตรีมเดียวของไฟล์วิดีโอหรือไฟล์เสียง ตัวอักษร NB ย่อมาจาก "number" FFmpeg และโปรแกรม ffprobe จะเรียกช่องข้อมูลนี้ว่า nb_frames
ไฟล์หนึ่งไฟล์สามารถมีได้หลายสตรีม และแต่ละสตรีมจะมีค่า NB Frames ของตัวเอง ไฟล์ที่มีวิดีโอสตรีมหนึ่งสตรีมและออดิโอสตรีมหนึ่งสตรีมจึงมีตัวนับแยกกัน 2 ค่า NB Streams เป็นค่าคนละอย่างกัน โดยจะนับจำนวนสตรีมในไฟล์ ไม่ใช่นับจำนวนเฟรมในหนึ่งสตรีม
เฟรมคืออะไร
ในวิดีโอสตรีม เฟรมคือภาพนิ่งหนึ่งภาพของวิดีโอ ในออดิโอสตรีม ความหมายจะขึ้นอยู่กับฟอร์แมต
ใน AIFF sample frame หนึ่งชุดจะเก็บ sample หนึ่งตัวสำหรับแต่ละช่องสัญญาณเสียง ส่วนใน MP3 เฟรมจะเป็นบล็อกที่ใหญ่กว่า และ FFmpeg จะนำจำนวนเฟรมมาคูณกับจำนวน samples ต่อเฟรมเพื่อคำนวณความยาว ดังนั้นคุณจึงไม่สามารถเปรียบเทียบตัวนับของไฟล์เสียงจากคนละฟอร์แมตกันได้โดยตรง
ลักษณะของค่าเป็นอย่างไร
ค่าจะเป็นจำนวนเต็มเมื่อทราบค่าแน่นอน ค่าต่อไปนี้ปรากฏในโค้ด เอกสาร และผลการทดสอบของ FFmpeg:
708: ตัวนับของวิดีโอสตรีมในไฟล์ทดสอบไฟล์หนึ่งของ FFmpeg1: ตัวนับของภาพนิ่งหนึ่งภาพในไฟล์ HEIC0: ค่าที่อินเทอร์เฟซโปรแกรมของ FFmpeg ใช้เมื่อไม่ทราบตัวเลขN/A: ข้อความที่เอาต์พุตค่าเริ่มต้นของ ffprobe แสดงเมื่อค่าคือ 0 ส่วนเอาต์พุตแบบ JSON และ XML จะละช่องข้อมูลนี้ไว้ไม่แสดง
ค่าที่เป็น 0 หรือ N/A หรือช่องข้อมูลที่หายไป ไม่ได้บอกว่าสตรีมว่างเปล่า ค่านี้เพียงบอกว่า FFmpeg ไม่ได้กำหนดตัวนับไว้ในช่องนี้
แหล่งที่มาของค่า
โดยทั่วไป NB Frames จะมาจากโครงสร้างของไฟล์เอง จึงไม่จำเป็นต้องให้ FFmpeg นับเฟรม แหล่งที่มาจะขึ้นอยู่กับฟอร์แมต:
- MP4 และ MOV: FFmpeg จะรวมจำนวน sample ในตาราง time-to-sample ซึ่งคือ atom
stts - AVI: FFmpeg อ่านตัวเลข 32 บิตจากส่วนหัวของสตรีม ซึ่งคือ chunk
strh - AIFF: FFmpeg อ่านช่องข้อมูล
numSampleFramesจาก Common Chunk - WAV, MP3, FLAC และ MKV: ตัวอ่านไฟล์ของ FFmpeg สำหรับฟอร์แมตเหล่านี้จะไม่ตั้งค่า ทำให้เอาต์พุตค่าเริ่มต้นของ ffprobe แสดง
N/A
ไฟล์ MKV ยังสามารถเก็บตัวนับภายใต้ชื่ออื่นได้ โปรแกรม mkvmerge จะเขียนแท็กชื่อ NUMBER_OF_FRAMES ให้กับแต่ละแทร็ก
วิธีนับจำนวนเฟรม
NB Frames เป็นเพียงการทำซ้ำตัวเลขที่อยู่ในโครงสร้างไฟล์ ตัวเลขนี้ไม่ได้ยืนยันว่ามีเฟรมทั้งหมดอยู่ในไฟล์จริง ไฟล์ MOV ที่ใช้ทดสอบไฟล์หนึ่งใน FFmpeg เก็บค่าตัวนับเป็น 708 แต่ ffprobe อ่านได้เพียง 66 แพ็กเก็ตและ 65 เฟรมจากไฟล์นั้น
หากต้องการวัดค่าตัวนับ ให้รัน ffprobe พร้อมตัวเลือก -show_streams และ -count_frames โปรแกรม ffprobe จะดีโค้ดสตรีมและรายงานผลในช่องข้อมูลแยกต่างหาก nb_read_frames วิธีนี้ใช้เวลามากขึ้นเพราะ ffprobe ต้องดีโค้ดทุกเฟรม
ให้ใช้การตรวจสอบนี้กับวิดีโอสตรีม สำหรับไฟล์ AIFF ffprobe จะนับบล็อกที่ดีโค้ดแล้ว ซึ่งแต่ละบล็อกมี sample frame จำนวนมาก ดังนั้นตัวเลขทั้งสองค่าจึงต่างกันได้แม้ไฟล์จะสมบูรณ์
ตัวเลือก -count_packets เมื่อใช้ร่วมกับ -show_streams จะนับแพ็กเก็ตโดยไม่ดีโค้ด และรายงานผลใน nb_read_packets วิดีโอแพ็กเก็ตมักจะมีเฟรมที่บีบอัดหนึ่งเฟรม แต่แพ็กเก็ตเสียงอาจมีได้หลายเฟรม
ทำไมมันจึงสำคัญ
สำหรับวิดีโอสตรีม จำนวนเฟรมร่วมกับความยาวเวลาจะใช้คำนวณอัตราเฟรมเฉลี่ย ตัวอ่านไฟล์ MP4 และ MOV ของ FFmpeg จะคำนวณอัตรานี้จากจำนวนเฟรมและความยาวเวลาเดียวกัน ในไฟล์ทดสอบเดียวกัน 708 เฟรมในเวลา 23.613333 วินาทีจะได้ประมาณ 29.98 เฟรมต่อวินาที
ตัวนับยังช่วยให้คุณตรวจสอบไฟล์วิดีโอได้ หากจำนวนที่วัดได้ต่ำกว่าค่าที่เก็บไว้อย่างมาก แสดงว่าอาจมีข้อมูลวิดีโอหายไปบางส่วน