Cxw1234a 2023-06-15 18:35 采纳率: 42.9%
浏览 254
已结题

ffmpeg avcodec_receive_packet一直返回-11

软解码和软编码时都没问题,换成硬解码之后,程序一直卡在avcodec_receive_frame这里,一直返回-11

    std::cout << output <<std::endl;
    while (av_read_frame(fmt_ctx, &avpkt) >= 0) {
        if (avpkt.stream_index == stream_index) {
            // 8 发送等待解码帧
            int re = avcodec_send_packet(codeCtx, &avpkt);
            if (re < 0) {
                continue;
            }
            std::cout << 1 << std::endl;
            // 9 接收解码后frame数据
            std::cout << avcodec_receive_frame(codeCtx, frame) << std::endl;
            while (avcodec_receive_frame(codeCtx, frame) == 0) {
                // 拼接图片路径、名称,测试输出用
                snprintf(buf, sizeof(buf), "%s/Demo-%d.jpg", output, frame_count++);
                std::cout << 2 << std::endl;
                width = frame->width;
                height = frame->height;
                Encode2Jpg(frame); //保存为jpg图片
            }

            // 测试从内存读数据到文件里是否正常  
            FILE *fp = fopen(buf,"wb");
            fwrite(bd_out.ptr, sizeof(char), bd_out.size, fp);
            fclose(fp);
        }
        av_packet_unref(&avpkt);
    }

  • 写回答

4条回答 默认 最新

  • BG5 2023-06-15 18:59
    关注

    这个问题可能是由于在硬解码模式下,解码器需要更多的时间来处理数据,因此在调用avcodec_receive_frame时可能会返回EAGAIN(-11)错误,表示解码器需要更多的输入数据才能产生输出帧。

    你可以尝试修改你的代码,当avcodec_receive_frame返回-11时,再次发送数据到解码器,直到avcodec_receive_frame返回0,表示成功接收到解码后的帧。你可以尝试以下修改后的代码:

    while (av_read_frame(fmt_ctx, &avpkt) >= 0) {
        if (avpkt.stream_index == stream_index) {
            // 8 发送等待解码帧
            int re = avcodec_send_packet(codeCtx, &avpkt);
            if (re < 0) {
                continue;
            }
            std::cout << 1 << std::endl;
            // 9 接收解码后frame数据
            int ret;
            while ((ret = avcodec_receive_frame(codeCtx, frame)) == 0) {
                // 拼接图片路径、名称,测试输出用
                snprintf(buf, sizeof(buf), "%s/Demo-%d.jpg", output, frame_count++);
                std::cout << 2 << std::endl;
                width = frame->width;
                height = frame->height;
                Encode2Jpg(frame); //保存为jpg图片
            }
            if (ret == AVERROR(EAGAIN)) {
                // 解码器需要更多数据,继续发送数据
                continue;
            } else if (ret < 0) {
                // 其他错误
                break;
            }
            // 测试从内存读数据到文件里是否正常
            FILE *fp = fopen(buf,"wb");
            fwrite(bd_out.ptr, sizeof(char), bd_out.size, fp);
            fclose(fp);
        }
        av_packet_unref(&avpkt);
    }
    

    这样修改后,当解码器需要更多的输入数据时,会继续发送数据,直到成功接收到解码后的帧。

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 6月16日
  • 赞助了问题酬金15元 6月15日
  • 创建了问题 6月15日

悬赏问题

  • ¥15 网站设计与开发职业技能大赛试题
  • ¥20 在使用CESM2.2.0模型进行case.submit过程中出现如下错误(关键词-Map)
  • ¥15 有办法改变通过wifi进入的网站的设置吗
  • ¥15 所以到底怎么算!算到凌晨五点都算不出来!
  • ¥15 label_studio
  • ¥15 请教如何phython发邮件
  • ¥15 linux系统安装问题
  • ¥15 路径规划如何采用矢量法让他们尽量在一个方向
  • ¥15 crypto 一道rsa解密题
  • ¥15 survIDINRI已将生存时间转为数值变量,仍错误 Time variable is not numeric。