NB Frames سے مراد ویڈیو یا آڈیو فائل کی ایک stream میں فریموں کی تعداد ہے۔ حروف NB کا مطلب "number" ہے۔ FFmpeg اور اس کا ffprobe پروگرام اس فیلڈ کو nb_frames کہتے ہیں۔
ایک فائل میں کئی streams ہو سکتی ہیں، اور ہر stream کا اپنا NB Frames ویلیو ہوتا ہے۔ ایک فائل جس میں ایک ویڈیو stream اور ایک آڈیو stream ہو، اس میں اس طرح 2 الگ الگ گنتیاں ہوں گی۔ NB Streams ایک الگ ویلیو ہے: یہ فائل میں streams کی تعداد گنتا ہے، نہ کہ ایک stream کے اندر فریموں کی تعداد۔
فریم کیا ہوتا ہے
ویڈیو stream میں، فریم ویڈیو کی ایک جامد تصویر ہوتا ہے۔ آڈیو stream میں، مطلب فارمیٹ پر منحصر ہوتا ہے۔
AIFF میں، ایک sample frame ہر آڈیو چینل کے لیے ایک sample رکھتا ہے۔ MP3 میں، فریم ایک بڑا بلاک ہوتا ہے، اور FFmpeg لمبائی نکالنے کے لیے فریموں کی تعداد کو samples per frame سے ضرب دیتا ہے۔ اسی لیے آپ ایک فارمیٹ کے آڈیو کاؤنٹ کا براہِ راست موازنہ دوسرے فارمیٹ کے کاؤنٹ سے نہیں کر سکتے۔
قدریں کیسی نظر آتی ہیں
جب ویلیو معلوم ہو تو وہ پورا عدد ہوتی ہے۔ یہ ویلیوز FFmpeg کے code، دستاویزات، اور test results میں نظر آتی ہیں:
708: FFmpeg کی ایک test فائل میں ویڈیو stream کا کاؤنٹ۔1: HEIC فائل میں ایک واحد جامد تصویر کا کاؤنٹ۔0: وہ ویلیو جو FFmpeg کا programming interface اس وقت استعمال کرتا ہے جب تعداد معلوم نہ ہو۔N/A: وہ متن جو ffprobe کے ڈیفالٹ آؤٹ پٹ میں اس وقت چھپتا ہے جب ویلیو 0 ہو۔ اس کا JSON اور XML آؤٹ پٹ اس فیلڈ کو شامل ہی نہیں کرتا۔
0 یا N/A کی ویلیو، یا فیلڈ کا غائب ہونا، یہ ثابت نہیں کرتا کہ stream خالی ہے۔ یہ ویلیو صرف یہ بتاتی ہے کہ FFmpeg نے اس فیلڈ میں کوئی کاؤنٹ سیٹ نہیں کیا۔
قدر کہاں سے آتی ہے
NB Frames عموماً فائل کے اپنے ڈھانچے سے آتا ہے، اس لیے FFmpeg کو فریم نہیں گننے پڑتے۔ ذریعہ فارمیٹ پر منحصر ہوتا ہے:
- MP4 اور MOV: FFmpeg time-to-sample ٹیبل میں sample counts کو جمع کرتا ہے، جو
sttsatom ہے۔ - AVI: FFmpeg stream header سے 32-bit نمبر پڑھتا ہے، جو
strhchunk ہے۔ - AIFF: FFmpeg Common Chunk سے
numSampleFramesفیلڈ پڑھتا ہے۔ - WAV، MP3، FLAC، اور MKV: ان فارمیٹس کے لیے FFmpeg کے readers یہ ویلیو سیٹ نہیں کرتے، اس لیے ffprobe کا ڈیفالٹ آؤٹ پٹ
N/Aچھپتا ہے۔
ایک MKV فائل پھر بھی کسی اور نام کے تحت کاؤنٹ رکھ سکتی ہے۔ mkvmerge پروگرام ہر ٹریک کے لیے NUMBER_OF_FRAMES نام کا tag لکھتا ہے۔
فریم کیسے گنیں
NB Frames صرف فائل کے ڈھانچے میں موجود نمبر کو دہراتا ہے۔ یہ نمبر ثابت نہیں کرتا کہ سارے فریم واقعی فائل میں موجود ہیں۔ FFmpeg کی ایک MOV test فائل میں 708 کا کاؤنٹ محفوظ ہے، لیکن ffprobe اس فائل سے صرف 66 packets اور 65 frames پڑھتا ہے۔
کاؤنٹ ناپنے کے لیے ffprobe کو -show_streams اور -count_frames آپشنز کے ساتھ چلائیں۔ پھر ffprobe stream کو decode کرتا ہے اور نتیجہ الگ فیلڈ nb_read_frames میں بتاتا ہے۔ اس میں زیادہ وقت لگتا ہے، کیونکہ ffprobe کو ہر فریم decode کرنا پڑتا ہے۔
یہ چیک ویڈیو streams کے لیے استعمال کریں۔ AIFF فائل میں، ffprobe decoded blocks گنتا ہے جو ہر ایک میں کئی sample frames رکھتے ہیں، اس لیے دونوں نمبرز مختلف ہوتے ہیں، چاہے فائل مکمل ہی کیوں نہ ہو۔
-count_packets آپشن، جسے -show_streams کے ساتھ ہی استعمال کیا جاتا ہے، packets کو decode کیے بغیر گنتا ہے اور نتیجہ nb_read_packets میں بتاتا ہے۔ ویڈیو packet عام طور پر ایک compressed frame رکھتا ہے، لیکن ایک آڈیو packet میں کئی فریم ہو سکتے ہیں۔
یہ کیوں اہم ہے
ویڈیو stream کے لیے، فریم کاؤنٹ اور دورانیہ مل کر اوسط frame rate دیتے ہیں۔ FFmpeg کا MP4 اور MOV reader یہی rate فریم کاؤنٹ اور دورانیہ سے نکالتا ہے۔ اسی test فائل میں، 708 فریم 23.613333 سیکنڈ پر تقریباً 29.98 فریم فی سیکنڈ بنتے ہیں۔
کاؤنٹ آپ کو ویڈیو فائل چیک کرنے میں بھی مدد دیتا ہے۔ اگر ناپا گیا کاؤنٹ محفوظ کاؤنٹ سے بہت کم ہو، تو ہو سکتا ہے ویڈیو ڈیٹا کا کچھ حصہ غائب ہو۔