يكسر av_seek_frame avcodec_decode_video2 عندما يستخدم برنامج الترميز إطارات p

StackOverflow https://stackoverflow.com/questions/6084921

  •  09-09-2020
  •  | 
  •  

سؤال

أحاول أن أفهم كيفية البحث عن مقاطع الفيديو المشفرة بإطارات p (على سبيل المثال.H.264)-- في الوقت الحالي، أعرف فقط كيفية البحث عن مقاطع الفيديو المشفرة باستخدام برامج الترميز التي يكون كل إطار فيها إطارًا رئيسيًا (على سبيل المثال.مجبيغ).

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

ret = av_seek_frame(pFormatCtx, videoStream, avTime, 0); 
avcodec_flush_buffers(pCodecCtx);

ثم بعض التعليمات البرمجية المتداخلة، بما في ذلك av_read_frame.ثم--

ret = avcodec_decode_video2(pCodecCtx, captureFrame, &gotPicture, &packet); 

الملاحظات:

  • بالنسبة لبعض مقاطع الفيديو، يعمل هذا.للاخرين، avcodec_decode_video2 إرجاع خطأ (رقم سالب).مثال لفيديو العمل: هنا.مثال لفيديو لا يعمل: هنا.

  • بالنسبة لفيديوهات MJPEG، يعمل هذا.

  • إذا قمت بإخراج av_seek_frame, ، بحيث يتم تشغيله من خلال الإطارات بالتسلسل، ويعمل.

هل كانت مفيدة؟

المحلول

استبدل هذا--

ret = av_seek_frame(pFormatCtx, videoStream, avTime, isPlayingBackward ? AVSEEK_FLAG_BACKWARD : 0); 
avcodec_flush_buffers(pCodecCtx);

مع هذا--

ret = avformat_seek_file(pFormatCtx, videoStream, 0, avTime, avTime, 0); 

(تنبيه قضائي:المستندات ل avformat_seek_file يقول:"هذا جزء من واجهة برمجة تطبيقات البحث الجديدة التي لا تزال قيد الإنشاء.وبالتالي لا تستخدم هذا بعد.قد يتغير في أي وقت، لا تتوقع توافق ABI بعد!")

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top