m0_61770108 2024-07-10 15:11 采纳率: 13.5%
浏览 20
已结题

FFmpeg7.0中用什么代替了avcodec_decode_video2()接口函数

FFmpeg7.0中用什么代替了avcodec_decode_video2()接口函数
在FFmpeg7中怎么修改下面这一段代码,代替avcodec_decode_video2()


while (m_statue) {
        if (av_read_frame(pFormatCtx, packet) < 0)
        {
            return; //这里认为视频读取完了
        }
        if (packet->stream_index == videoStream) {
            ret = avcodec_decode_video2(pCodecCtx, pFrame, &got_picture,packet);
            if (ret < 0) {
                qDebug()<<"decode error";
                return;
            }

            if (got_picture) {
                sws_scale(img_convert_ctx,
                          (uint8_t const * const *) pFrame->data,
                          pFrame->linesize, 0, pCodecCtx->height, pFrameRGB->data,
                          pFrameRGB->linesize);
                //把这个RGB数据 用QImage加载
                // QImage tmpImg((uchar *)out_buffer,pCodecCtx->width,pCodecCtx->height,QImage::Format_RGB32);
                //tmpImg.copy(); //把图像复制一份 传递给界面显示
                //m_Image=tmpImg.copy();
                QImage img =QImage((uchar *)out_buffer,pCodecCtx->width,pCodecCtx->height,QImage::Format_RGB32);
                emit s_SendImage(img);

            }
        }

        av_free_packet(packet); //释放资源,否则内存会一直上升
    }
  • 写回答

5条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-07-10 15:11
    关注

    引自免费微信小程序:皆我百晓生

    在FFmpeg 7.0中,你可以使用 avcodec_receive_frame()avcodec_send_packet() 函数代替 avcodec_decode_video2() 函数。这两个函数更加灵活和适合处理复杂的数据传输和编码过程。以下是对你提供的代码进行修改以适应FFmpeg 7.0的示例:

    首先,你需要确保你的编解码器上下文(pCodecCtx)已经正确设置并开启了对 avcodec_receive_frame()avcodec_send_packet() 的支持。下面是如何修改你的代码片段来适应FFmpeg 7.0的新API:

    while (m_statue) {
        if (av_read_frame(pFormatCtx, packet) < 0) {
            // 这里认为视频读取完了
            break; // 或者执行其他退出逻辑
        }
        if (packet->stream_index == videoStream) {
            // 发送数据包给编解码器进行解码准备
            int ret = avcodec_send_packet(pCodecCtx, packet->data, packet->size);
            if (ret < 0) {
                qDebug() << "Send packet error";
                return; // 处理错误情况
            }
            // 循环接收解码帧直到没有更多帧或发生错误
            while (true) {
                AVFrame *frame = nullptr; // 创建帧来存储解码后的图像数据
                int got_picture = 0; // 是否得到新的图像帧标志
                ret = avcodec_receive_frame(pCodecCtx, frame); // 获取解码后的帧数据
                if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) { // 没有更多帧或已到达文件末尾
                    break; // 结束循环或退出函数(根据逻辑处理)
                } else if (ret < 0) { // 错误处理
                    qDebug() << "Decode error";
                    return; // 返回错误代码或退出函数
                } else { // 正常解码得到一帧图像数据
                    // 执行缩放操作(如果需要的话)和图像显示逻辑(如创建QImage并发送)
                    sws_scale(...); // 使用与之前相同的参数调用缩放函数(确保上下文已正确设置)
                    QImage img(...); // 创建QImage对象并发送图像数据(与之前的逻辑类似)
                    emit s_SendImage(img); // 发送图像数据到界面显示(或其他用途)                                         
                }
            } // 结束循环处理解码帧直到没有更多帧或发生错误的情况。        
        } // 结束条件判断是否为视频流的数据包。    
        av_free_packet(packet); // 释放资源,避免内存泄漏。    
    } // 结束循环读取数据包直到视频结束或遇到错误的情况。 这是在循环过程中动态分配的缓冲区在使用后需要进行清理的一个步骤。不执行这个步骤会导致内存泄漏等问题。按照现代软件开发的规范和实践,开发人员应负责正确释放他们所分配的资源以避免资源浪费和资源耗尽导致的各种问题,这是一个标准的内存管理技巧在编写基于视频处理软件时是必须要掌握的一个技巧,这是因为此类程序往往会涉及大量的资源分配和使用工作来正确渲染或解码流媒体的内容从而可能需要花费很多时间和注意力来保证正确和稳定的资源释放机制从而保证程序在运行过程中的稳定和可靠性以满足预期的工作表现以及预期的性能目标这是基于实际需求的基本资源分配与释放工作包括主动与及时这两个基本要求:一是正确的清理工作流程的要求之一即在处理结束后要能够自动触发清理流程进行资源的释放二是要求能够及时响应相关的资源清理需求从而确保系统的资源不会被占用以及程序的性能得以保障的重要原则对于像视频处理等需求占用大量资源的场景来说是必不可少的保障系统性能的措施。         需要注意的是:如果原来的代码中还有依赖于其他版本的特定行为或者依赖的特定数据结构未被显式地更新,则可能需要进行额外的修改来确保代码的正确性和稳定性。同时,还需要确保所有的缓冲区(如 `out_buffer`)在使用完毕后被适当地清理和释放以避免潜在的内存泄漏问题。此外,对于多线程环境下的使用,还需要考虑线程安全和同步问题以确保数据的完整性和正确性。这些修改可能需要根据具体的代码实现和使用场景进行调整和优化以确保程序的正确运行和性能表现。
    
    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 8月6日
  • 创建了问题 7月10日

悬赏问题

  • ¥15 Opencv(C++)异常
  • ¥15 VScode上配置C语言环境
  • ¥15 汇编语言没有主程序吗?
  • ¥15 这个函数为什么会爆内存
  • ¥15 无法装系统,grub成了顽固拦路虎
  • ¥15 springboot aop 应用启动异常
  • ¥15 matlab有关债券凸性久期的代码
  • ¥15 lvgl v8.2定时器提前到来
  • ¥15 qtcp 发送数据时偶尔会遇到发送数据失败?用的MSVC编译器(标签-qt|关键词-tcp)
  • ¥15 cam_lidar_calibration报错