我有一个 3500 帧的 HEVC 序列,我正在编写一个解码器来读取它(逐帧读取并转储到 yuv)。在我的 main() 中,我有一个 for 循环,它调用解码器() 3500 次(我假设在这个阶段 main() 知道有多少帧)。
因此,对于每次调用解码器(),我都需要返回一个完整的帧。这就是解码器()的样子..
bool decode(pFormatCtx, pCodecCtx)
{
int gotaFrame=0;
while (gotaFrame==0) {
printf("1\t");
if ( !av_read_frame(pFormatCtx, &packet) ) {
if(packet.stream_index==videoStreamIndex) {
// try decoding
avcodec_decode_video2(pCodecCtx, pFrame, &gotaFrame, &packet);
if (gotaFrame) { // decode success.
printf("2\t");
// dump to yuv ... not shown here.
// cleanup
av_frame_unref(pFrame);
av_frame_free(&pFrame);
av_free_packet(&packet);
return true;
}
}
}
}
}
行为是这样的: 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 2 1 2 ......看起来它在解码一帧之前读取了几帧?第一帧是 I 帧,所以不应该立即解码吗?
使用这段代码,我最终丢失了几帧(由一系列 1 表示)。有人可以帮我吗?我的代码中是否做错了什么?
更新:测试剪辑仅限视频。没有音频。
您所看到的是正确的行为。解码器缓冲一些帧以提高多线程效率。可能需要几个帧才能“启动泵”。基本上,为了保持程序响应,avcodec_decode_video2 将帧排队进行解码,然后返回。这可以防止你的程序长时间阻塞。在B帧的情况下,解码顺序可能与显示顺序不同,也绝对需要延迟解码。
那么,如何不丢失这些帧呢? av_read_frame 停止返回新帧后,您必须通过使用空数据包调用 avcodec_decode_video2 来刷新解码器,直到不再重新调整帧。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)