根据avcodec.h文件中的文本,有一些解码器可能在一个AVPacket中支持多个帧,但是avcodec_decode_video2方法仅解码第一帧...我必须全部将它们解码。

在libavcodec的源代码中,参数AVPacket标记为const AVPacket *avpacket,因此在解码此数据包解码器时无法更改AVPacket的字段,我是否可以更改数据包数据的偏移量或删除已获取的数据以使解码器循环读取数据包中的所有帧? ?

最佳答案

我认为这种情况不再可能发生,但是基本上您会这样做:

while(packet->size > 0)
{
     int ret = avcodec_decode_video2(..., packet);
     if(ret < -1)
        throw std::exception("error");

     packet->size -= ret;
     packet->data += ret;
}

// NOTE! You have to restore original packet->size and packet->data, or modify a copy, before calling av_packet_free.

07-27 13:39