هل يمكن لـ ffmpeg av libs إعادة PTS دقيقة؟

أعمل مع تيار mpeg يستخدم تسلسل IBBP ... GOP. قيم (DTS، PTS) التي تم إرجاعها لأول 4 AVPackets كالتالي: I = (0،3) B = (1،1) B = (2،2) P = (3،6)

تبدو PTS على الإطار I وكأنها شرعية ، ولكن بعد ذلك لا يمكن أن تكون PTS على الأرتال B سليمة ، حيث لا يجب عرض إطارات B قبل الإطار I كما تشير إلى ذلك قيم PTS الخاصة بهم. لقد حاولت أيضًا فك تشفير الحزم واستخدام قيمة نقطة في AVFrame الناتجة ، وضع أن PTS يتم تعيينه دائمًا على صفر.

هل هناك أي طريقة للحصول على PTS دقيق من ffmpeg؟ إذا لم يكن الأمر كذلك ، فما أفضل طريقة لمزامنة الصوت بعد ذلك؟

0
وأضاف
الآراء: 1

2 إجابة

أعتقد أنني توصلت أخيراً إلى ما يحدث بناءً على تعليق تم إرساله في http: //www.dranger. كوم/فمبيج/tutorial05.html :

ffmpeg يقوم بإعادة ترتيب الحزم بحيث تكون DTS الخاصة بالحزمة التي تتم معالجتها بواسطة avcodec_decode_video() هي نفسها دائمًا مثل PTS للإطار الذي تقوم بإرجاعه

الترجمة: إذا أتغذى حزمة إلى avcodec_decode_video() الذي يحتوي على PTS 12، avcodec_decode_video() لن يعود إطار فك الواردة في تلك الحزمة حتى أتغذى عليه <�م> بعد </م> الحزمة التي لديها DTS من 12. إذا كانت PTS في الرزمة هي نفس DTS الخاصة بها ، فإن الرزمة المعطاة هي نفس الرزمة التي يتم إرجاعها. إذا PTS الحزمة هو في وقت لاحق 2 إطارات من DTS لها، ثم avcodec_decode_video() سيؤخر الإطار وليس إعادته حتى أقدمها 2 أكثر الحزم.

استنادًا إلى هذا السلوك ، أظن أن av_read_frame() ربما يعيد ترتيب الحزم من IPBB إلى IBBP بحيث لا يحتاج avcodec_decode_video() إلا إلى تخزين إطارات P لـ 3 إطارات بدلاً من 5. على سبيل المثال ، الفرق بين المدخلات و ناتج إطار P مع هذا الطلب هو 3 (6 - 3):

|                  I B B P B B P
|             DTS: 0 1 2 3 4 5 6
| decode() result:       I B B P

مقابل فرق من 5 مع الترتيب القياسي (6 - 1):

|                  I P B B P B B
|             DTS: 0 1 2 3 4 5 6
| decode() result:       I B B P

but that is pure conjecture.

0
وأضاف

أنا متأكد من أنك تحصل على قيم دقيقة. قد يكون من المفيد لك أن تقوم بشيء من تيار MPEG على أنه تيار. في هذه الحالة ، قبل IBBBBB الذي تراه ، سيكون هناك عادةً حزب جمهوري آخر. ربما شيء من هذا القبيل (باستخدام نفس التدوين والسؤال الأصلي):

P(-3,-2)  B(-2,-1)  B(-1,0)

بشكل أساسي ، تستند إطارات B بعد الإطارات I إلى الإطار I والإطار P الأخير من .

في حين أنه من المنطقي أن يبدأ الفيديو باستخدام هذا:

Start GOP: IPBBPBBPBB...

في وقت لاحق يجب أن يكون

Start GOP: IBBPBBPBBPBB
Start GOP: IBBPBBPBBPBB
Start GOP: IBB... 

تذكر أن فك شفرة أي إطار B يتطلب إطارًا كاملاً قبله وبعده. لذا ، يجب عرض كل زوج من إطارات B قبل إطار I أو P قبله مباشرة في الملف.

قد يكون FFMPEG قد نسي "الحالة الخاصة" للحزب الجمهوري الأول.

نظرًا لأن أول إطارين B لا يحتويان على إطار مسبق للتلاعب ، يجب أن تكون قادرًا على التخلص منها بأمان. ما عليك سوى إعادة تمهيد الطوابع الزمنية من إطار I الأول وتعديل تدفق الصوت بنفس المقدار.

إذا كان هذا سيؤدي في الواقع إلى فقدان الإطارات يعتمد على تنفيذ FFMPEG ، ولكن السيناريو الأسوأ هو أن تخسر 83 مللي ثانية (إطارين في 24 إطار/ثانية).

0
وأضاف
هذه الأنواع من الاختراقات (قبول فقدان 2 إطار) هي ... hacky hapy :) إن كتابة الوثائق الشحيحة مملة لدرجة أن لا أحد يزعجها.
وأضاف المؤلف Roman Starkov, مصدر