c++ - 如何使用ffmpeg实现像get_next_frame一样的功能?

标签 c++ ffmpeg

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

int ret = decoder.get_next_frame(mat);
ret = decoder.get_next_frame(mat);
ret = decoder.get_next_frame(mat); // error 

ffmpeg avcodec_send_packet 返回err,msg为 [h264 @ 0x8bd2780] NAL 单元大小无效 (10848 > 766)。 [h264 @ 0x8bd2780] 将输入拆分为 NAL 单元时出错。 前缀为'_'的变量都是成员变量

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;
}

那么问题是什么?

最佳答案

我重新检查代码,终于发现内存错误,视频数据在其他地方意外释放,所以上面的代码似乎没问题

关于c++ - 如何使用ffmpeg实现像get_next_frame一样的功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55295618/

相关文章:

C++ 通用类链接错误

c++ - 使用 "multiply"混合模式和 alpha 的 Direct3D 渲染 2D 图像

c++ - win32 API编程问题

c++ - 坚韧 : Dealing with deeply nested pointers in C++

c++ - 有没有一种简单的方法来检查 cin 输入是否有空格?

javascript - 使用 ffmpeg 将动画 WebP 转换为 Mp4

ffmpeg - 查询 ffmpeg 的 DASH 多路复用器并在 MPEG-DASH 媒体演示描述 (MPD) 文件中设置 timeShiftBufferDepth 值

android - C 编译器 "clang.exe"无法编译简单的测试程序

ffmpeg hstack png 并用白色替换透明颜色

c# - 使用 TTS 将 MemoryStream 的音频输出到 Discord Bot