data-structures شرح - أي شخص على دراية بنية البيانات mp4؟




هياكل بالعربى (9)

مدة الفيلم في رأس الفيلم mvhd. يتم اشتقاق المدة بالثواني من حقلين في mvhd.

  • 4 مقياس الوقت بايت
  • مدة 4 بايت

هذه هي خطوط 380 و 382 في المواصفات التي نشرتهاTom Brito.

لذا ، أعطِ وقتًا قصيرًا ومدة "dur" Duration in seconds = dur / ts

أين في بنية الملف mp4 هي مدة ذلك؟



ميديا ​​بوكس ​​عارض يمكن استخدامها. هو محلل MP4 و Quicktime. عند فتح ملف Quicktime ، يمكنك رؤية بنية الذرة. ابحث عن وصف الفيديو ذرة. واحدة من خصائصه هي المدة. يمكن تنزيل Media Box Viewer من www.jdxsoftware.org .


قد لا يكون هذا هو الحل لمشكلتك ولكن كان لي: http://mediainfo.sourceforge.net/

(لديها مكتبة ومفتوحة المصدر حتى تتمكن من التحقق فقط من الجزء (الأجزاء) التي تحتاجها)



أساسا هيكل MP4 هو شجرة. مناطق الماكرو هي:

  • نوع ftyp - نوع الملف
  • moov - يحتوي على بيانات تعريفية (عنوان الأغنية ، و autors ، و url ، و معلومات أخرى)
  • خالية - منطقة فارغة لفصل الرأس والبيانات
  • مدات - يحتوي على إطارات الصوت

يمكنك تجربة هذه الأداة المجانية MP4 Analyzer

http://www.thinmultimedia.co.kr/products/MP4Reader_download.html


بالنسبة إلى قارئ Red5 MP4 ، استخدمت ذرة "mvhd" ، نظرًا لاحتوائها على نطاق النطاق الزمني والمدة الزمنية. سيختلف الحصول على المدة من الذرة استنادًا إلى الإصدار المستخدم ، أدناه يمكنك مشاهدة مثال:

public long create_full_atom(MP4DataStream bitstream) throws IOException {
    long value = bitstream.readBytes(4);
    version = (int)value >> 24;
    flags = (int)value & 0xffffff;
    readed += 4;
    return readed;
}

public long create_movie_header_atom(MP4DataStream bitstream) throws IOException { create_full_atom(bitstream); if (version == 1) { creationTime = createDate(bitstream.readBytes(8)); modificationTime = createDate(bitstream.readBytes(8)); timeScale = (int)bitstream.readBytes(4); duration = bitstream.readBytes(8); readed += 28; } else { creationTime = createDate(bitstream.readBytes(4)); modificationTime = createDate(bitstream.readBytes(4)); timeScale = (int)bitstream.readBytes(4); duration = bitstream.readBytes(4); readed += 16; } int qt_preferredRate = (int)bitstream.readBytes(4); int qt_preferredVolume = (int)bitstream.readBytes(2); bitstream.skipBytes(10); long qt_matrixA = bitstream.readBytes(4); long qt_matrixB = bitstream.readBytes(4); long qt_matrixU = bitstream.readBytes(4); long qt_matrixC = bitstream.readBytes(4); long qt_matrixD = bitstream.readBytes(4); long qt_matrixV = bitstream.readBytes(4); long qt_matrixX = bitstream.readBytes(4); long qt_matrixY = bitstream.readBytes(4); long qt_matrixW = bitstream.readBytes(4); long qt_previewTime = bitstream.readBytes(4); long qt_previewDuration = bitstream.readBytes(4); long qt_posterTime = bitstream.readBytes(4); long qt_selectionTime = bitstream.readBytes(4); long qt_selectionDuration = bitstream.readBytes(4); long qt_currentTime = bitstream.readBytes(4); long nextTrackID = bitstream.readBytes(4); readed += 80;
return readed;
}


في ملاحظة جانبية ، استخدمت القيم لحساب وقت التشغيل و fps مثل:
    double fps = (videoSampleCount * timeScale) / (double) duration;
    double videoTime = ((double) duration / (double) timeScale);
يأتي متغير videoSampleCount من ذرة "stsz".


بقدر ما أعرف - مشتق حاوية "mp4" من بنية ذرة QuickTime. يمكنك قراءة وصف QuickTime File Format.

تحليل ذرات كويك تايم ليست صفقة كبيرة (انظر إلى مشروع atomicParsley ). لست متأكدًا من MP4 ، ولكن بالنسبة إلى ملفات MOV - هناك حقل "المدة" في "mvhd" (رأس فيلم) atom وكذلك في "tkhd" (رأس المسار) atom. وعادة ما تكون هذه المدة عبارة عن عدد من الإطارات مضروبة في سمة "المقياس الزمني". يمكن العثور على المقياس الزمني في نفس الذرات.


إذا افترضنا أن قاموسًا كبيرًا ومجموعة أحرف تحتوي على أقل من 10 أو 11 عضوًا (مثل المثال المعطى) ، فإن أسرع طريقة هي إنشاء شجرة تحتوي على الكلمات المحتملة التي يمكن أن تصنعها الأحرف ، ثم تتطابق مع قائمة الكلمات في مقابل الشجرة. بمعنى آخر ، يحتوي جذر شجرة الرسائل على سبعة مقاطع فرعية: {a، e، f، g، i، r، q}. يحتوي فرع "a" على ستة أفرع فرعية {e، f، g، i، r، q} ، إلخ. وبالتالي ، تحتوي الشجرة على كل كلمة يمكن إجراؤها باستخدام هذه الأحرف.

انتقل من خلال كل كلمة في القائمة ومطابقتها مع الشجرة. إذا كانت المطابقة هي الحد الأقصى للطول (يستخدم كل الحروف) ، فستنتهي. إذا كانت الكلمة أقل من الحد الأقصى ، ولكن أطول من أي كلمة تمت مطابقتها سابقًا ، تذكرها ، هذه هي "أطول كلمة حتى الآن" (LWSF). تجاهل أي كلمات لها طول يساوي أقل من LWSF. أيضا ، تجاهل أي كلمات أطول من طول قائمة الحروف.

هذه خوارزمية وقت خطي بمجرد إنشاء شجرة الحروف ، طالما أن قائمة الكلمات أكبر بشكل ملحوظ من شجرة الحروف ، فهي أسرع طريقة.





data-structures video mp4