ZBLOG

void RTSP::Loop(){ int ret = RET_OK; decoder_.FlushBuffers(); int yuv_size = src_width_ * src_height_* 3 / 2; uint8_t *yuvj420p_data = new uint8_t[yuv_size]; AVFrame *frame = av_frame_alloc(); while (!request_exit_) { AVPacket *...

要将 AVFrame 中的数据赋值到 yuvj420p_data,需要正确处理 YUV420P 格式的图像数据。假设 frame 是一个包含 YUV 数据的 AVFrame,YUV420P 数据在 AVFrame 中通常存储在 data 数组中。

下面是如何将 frame 中的数据复制到 yuvj420p_data 的示例代码:

void RTSP::Loop(){
    
    int ret = RET_OK;
    decoder_.FlushBuffers();

    int yuv_size = src_width_ * src_height_ * 3 / 2;
    uint8_t *yuvj420p_data = new uint8_t[yuv_size];
    AVFrame *frame = av_frame_alloc();
    
    while (!request_exit_)
    {
        AVPacket *pkt = av_packet_alloc();
        if(av_read_frame(mFmtCtx, pkt) >= 0){

            if(pkt->stream_index == 0){
                
                do
                {
                    ret = decoder_.ReceiveFrame(frame);
                    if (ret == RET_OK) // 解到一帧数据
                    {
                        frame->pts = frame->best_effort_timestamp;

                        // 将 frame 数据复制到 yuvj420p_data
                        memcpy(yuvj420p_data, frame->data[0], src_width_ * src_height_);               // Y 分量
                        memcpy(yuvj420p_data + src_width_ * src_height_, frame->data[1], (src_width_ / 2) * (src_height_ / 2)); // U 分量
                        memcpy(yuvj420p_data + src_width_ * src_height_ + (src_width_ / 2) * (src_height_ / 2), 
                               frame->data[2], (src_width_ / 2) * (src_height_ / 2)); // V 分量

                        if(callback_) {
                            callback_(yuvj420p_data, yuv_size);
                        }
                    }

                } while (ret == RET_OK);

                if(request_exit_) {
                    av_packet_free(&pkt);
                    break;
                }

                decoder_.SendPacket(pkt);
            }
        }
        av_packet_free(&pkt);
    }

    av_frame_free(&frame);

    delete[] yuvj420p_data; // 使用 delete[] 而不是 set NULL
}

注意事项:

  1. 内存管理:确保对动态分配的内存进行正确管理,避免内存泄漏。
  2. 数据格式:确保你的输入流确实为 YUVJ420P 格式,如果不是,可能需要进行格式转换。
  3. 线程安全:如果在多线程环境中使用此代码,需要考虑对共享资源的保护,以防止竞争条件。
  4. 性能:根据具体需求优化数据拷贝操作,例如通过 SIMD 指令或其他并行处理手段加速。

确保你已经正确设置了 decoder_ 和其他相关组件,使得它们能够正常解码和输出所需的帧格式。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://sdn.0voice.com/?id=6351

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?