C++ 如何使用ffmpeg实现像获取下一帧这样的功能?

C++ 如何使用ffmpeg实现像获取下一帧这样的功能?,c++,ffmpeg,C++,Ffmpeg,我正在尝试实现一个可以获取下一帧的函数, 但是当我第三次调用此函数时 int ret = decoder.get_next_frame(mat); ret = decoder.get_next_frame(mat); ret = decoder.get_next_frame(mat); // error ffmpeg avcodec\u发送\u数据包返回错误,消息为 [h264@0x8bd2780]无效的NAL单元大小(10848>766)。 [h264@0x8bd2780]将输入拆分为NA

我正在尝试实现一个可以获取下一帧的函数, 但是当我第三次调用此函数时

int ret = decoder.get_next_frame(mat);
ret = decoder.get_next_frame(mat);
ret = decoder.get_next_frame(mat); // error 
ffmpeg avcodec\u发送\u数据包返回错误,消息为 [h264@0x8bd2780]无效的NAL单元大小(10848>766)。 [h264@0x8bd2780]将输入拆分为NAL单位时出错。 前缀为“\u”的变量均为成员变量

int VideoDecoder::get_next_frame(cv::Mat& mat) {
int ret = 0;
bool got_frame = false;

while (!got_frame && av_read_frame(_p_fmt_ctx, _p_packet) >= 0) {
    if (_p_packet->stream_index == _video_stream_index) {

        ret = avcodec_send_packet(_p_dec_ctx, _p_packet);

        if (ret < 0 || ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) {
            break;
        }   

        while (ret >= 0) {
            ret = avcodec_receive_frame(_p_dec_ctx, _p_frame);
            if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) {
                break;
            }   

            sws_scale(_p_img_convert_ctx, _p_frame->data, _p_frame->linesize,
                    0, _p_dec_ctx->height, _p_frame_rgb->data, _p_frame_rgb->linesize);
            mat = cv::Mat(_p_frame->height, _p_frame->width, CV_8UC3, _p_frame_rgb->data[0]);
            got_frame = true;
        }   
    }   
    av_packet_unref(_p_packet);
}   

if (got_frame) {
    return _p_dec_ctx->frame_number;
}   

return 0;
}
int视频解码器::获取下一帧(cv::Mat和Mat){
int-ret=0;
bool got_frame=false;
而(!got_frame&&av_read_frame(_p_fmt_ctx,_p_packet)>=0){
如果(\u p\u数据包->流\u索引==\u视频\u流\u索引){
ret=avcodec_发送_数据包(_p_dec_ctx,_p_数据包);
如果(ret<0 | | ret==AVERROR(EAGAIN)| | ret==AVERROR_EOF){
打破
}   
而(ret>=0){
ret=avcodec_接收_帧(_p_dec_ctx,_p_帧);
如果(ret==AVERROR(EAGAIN)| | ret==AVERROR_EOF){
打破
}   
sws_比例(_p_img_convert_ctx,_p_frame->data,_p_frame->linesize,
0、\u p\u dec\u ctx->高度、\u帧\u rgb->数据、\u帧\u rgb->线条尺寸);
mat=cv::mat(\u p\u frame->height,\u p\u frame->width,cv\u 8UC3,\u p\u frame\u rgb->data[0]);
got_frame=true;
}   
}   
av_数据包_unref(_p_数据包);
}   
如果(得到了框架){
返回_p_dec_ctx->帧号;
}   
返回0;
}

那么问题出在哪里?

我重新检查了代码,最后发现内存错误,视频数据意外地在其他地方释放,所以上面的代码似乎正常

您好,堆栈溢出(so)。我们SO非常愿意帮助您,但请遵守我们的规则,让我们的工作更轻松。考虑阅读和接受。特别是考虑阅读和。你可以尝试另一个视频,以确保问题不是被解码的文件吗?视频文件是可以的,因为如果我把代码从“(G.GoTyGrand & AvAdReGyFrand(Apple FMTJCTX,PyPask)>=0”改为“”(AV-Read帧(Apple FMTJCTX,YPB包)>=0)所有框架都可以是cv::imwrite正确。请不要垃圾邮件无关的语言。你自己知道你在写C++。无用的代码被删除了。