Qt基于FFmpeg解码本地视频生成RGB数据

Qt基于FFmpeg解码本地视频生成RGB数据,第1张

一、获取RGB像素数据的步骤:

本文福利, 免费领取C++音视频学习资料包、技术视频,内容包括(音视频开发,面试题,FFmpeg webRTC rtmp hls rtsp ffplay srs↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓

二、实现效果:

将获取RGB像素数据每25帧保存一张图片到本地

三、核心代码: 
    int count = 0;
    while(av_read_frame(formatContent,pkt) == 0)//成功读到了数据,一帧一帧读
    {
        /*AVPacket->AVStream,要判断读到的每一帧的码流数据是不是视频流*/
        if(pkt->stream_index == videoType)
        {
                     
            int got_picture_ptr = -1;
            AVFrame *picture = av_frame_alloc();//保存原始RGB数据
            //读到一帧是视频流就进行解码的动作,解码得到RGB保存在AVFrame结构体里
            avcodec_decode_video2(codec,picture,&got_picture_ptr,pkt);
            if(got_picture_ptr != 0)
            {
                //把解码得到的损坏的像素数据剔除(存到pictureRGB中)
                sws_scale(swsContent,picture->data,picture->linesize,0,picture->height,
                          pictureRGB->data,pictureRGB->linesize);
                count++;
                if(count % 25 == 0)//每25帧保存一张图
                {
                    uchar* transData = (unsigned char*)pictureRGB->data[0];//格式装换
                    QImage desImage = QImage(transData,codec->width,codec->height,
                                             QImage::Format_RGB32,nullptr,nullptr); 
                    //图片保存在当前目录下的pictures中
                    desImage.save(QString("./pictures/rgbPicture%1.png").arg(count-25),"PNG", 100);
 
                }
            }
        }
        //每次都存在同一块内存空间里,要清空上一次的 *** 作
        av_packet_unref(pkt);//不是free
    }

如果你对音视频开发感兴趣,觉得文章对您有帮助,别忘了点赞、收藏哦!或者对本文的一些阐述有自己的看法,有任何问题,欢迎在下方评论区与我讨论! 

 本文福利, 免费领取C++音视频学习资料包、技术视频,内容包括(音视频开发,面试题,FFmpeg webRTC rtmp hls rtsp ffplay srs↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/3002611.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-09-27
下一篇 2022-09-27

发表评论

登录后才能评论

评论列表(0条)

保存