พจนานุกรม

NB Frames หมายถึงอะไร

NB Frames จะบอกคุณว่ามีเฟรมอยู่กี่เฟรมในสตรีมวิดีโอหรือเสียงหนึ่งสตรีม FFmpeg จะไม่รายงานตัวเลขนี้สำหรับทุกรูปแบบไฟล์ ดังนั้นค่านี้อาจไม่ทราบได้

nb-frames

NB Frames หมายถึงจำนวนเฟรมในสตรีมเดียวของไฟล์วิดีโอหรือไฟล์เสียง ตัวอักษร NB ย่อมาจาก "number" FFmpeg และโปรแกรม ffprobe จะเรียกช่องข้อมูลนี้ว่า nb_frames

ไฟล์หนึ่งไฟล์สามารถมีได้หลายสตรีม และแต่ละสตรีมจะมีค่า NB Frames ของตัวเอง ไฟล์ที่มีวิดีโอสตรีมหนึ่งสตรีมและออดิโอสตรีมหนึ่งสตรีมจึงมีตัวนับแยกกัน 2 ค่า NB Streams เป็นค่าคนละอย่างกัน โดยจะนับจำนวนสตรีมในไฟล์ ไม่ใช่นับจำนวนเฟรมในหนึ่งสตรีม

เฟรมคืออะไร

ในวิดีโอสตรีม เฟรมคือภาพนิ่งหนึ่งภาพของวิดีโอ ในออดิโอสตรีม ความหมายจะขึ้นอยู่กับฟอร์แมต

ใน AIFF sample frame หนึ่งชุดจะเก็บ sample หนึ่งตัวสำหรับแต่ละช่องสัญญาณเสียง ส่วนใน MP3 เฟรมจะเป็นบล็อกที่ใหญ่กว่า และ FFmpeg จะนำจำนวนเฟรมมาคูณกับจำนวน samples ต่อเฟรมเพื่อคำนวณความยาว ดังนั้นคุณจึงไม่สามารถเปรียบเทียบตัวนับของไฟล์เสียงจากคนละฟอร์แมตกันได้โดยตรง

ลักษณะของค่าเป็นอย่างไร

ค่าจะเป็นจำนวนเต็มเมื่อทราบค่าแน่นอน ค่าต่อไปนี้ปรากฏในโค้ด เอกสาร และผลการทดสอบของ FFmpeg:

  • 708: ตัวนับของวิดีโอสตรีมในไฟล์ทดสอบไฟล์หนึ่งของ FFmpeg
  • 1: ตัวนับของภาพนิ่งหนึ่งภาพในไฟล์ HEIC
  • 0: ค่าที่อินเทอร์เฟซโปรแกรมของ 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 เฟรมต่อวินาที

ตัวนับยังช่วยให้คุณตรวจสอบไฟล์วิดีโอได้ หากจำนวนที่วัดได้ต่ำกว่าค่าที่เก็บไว้อย่างมาก แสดงว่าอาจมีข้อมูลวิดีโอหายไปบางส่วน

คีย์เมตา