Qt基于FFmpeg解码本地视频生成H264文件并播放

这篇具有很好参考价值的文章主要介绍了Qt基于FFmpeg解码本地视频生成H264文件并播放。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、获取并写入H264码流数据的步骤:

Qt基于FFmpeg解码本地视频生成H264文件并播放

二、实现效果:

用eseye_u.exe打开H264文件并播放

Qt基于FFmpeg解码本地视频生成H264文件并播放

本文福利, 免费领取C++音视频学习资料包、技术视频,内容包括(音视频开发,面试题,FFmpeg webRTC rtmp hls rtsp ffplay srs↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓ 文章来源地址https://www.toymoban.com/news/detail-416022.html

三、核心代码: 

 
 
    /*1、注册*/
    av_register_all();//
 
 
    //参数:1双指针定义一颗星*,2要打开流的路径(文件名)
    //AVFormatContext保存视频(视频流)相关信息的结构体
    AVFormatContext  * formatContent = avformat_alloc_context();
    char * filename="Warcraft3_End.avi";
    /*2、打开视频文件*/
    int res = avformat_open_input(&formatContent,filename,nullptr,nullptr);
    if(res!=0)
    {
        qDebug()<<"打开视频失败";
        return ;
    }
    /*3、打开成功之后相关的结构体信息放在了formatContent里面,进行获取视频文件信息*/
    //3.1先看有没有视频流信息(avformat_find_stream_info),进行判断的原因是有可能打开普通文件
    res = avformat_find_stream_info(formatContent,nullptr);
    if(res<0)
    {
        qDebug()<<"打开流媒体信息";
        return ;
    }
 
 
    //AVFormatContext(含有解码器的id,去streams的流数组里面找视频流)->AVStream->AVCodecContext
    //->codec(有解码器的AVCodec)->AVCodec(含有编解码器的id、类型)
                //AVCodecContext 保存视频音频编解码相关的信息
 
    int videoType = -1;
    //3.2一个视频中有多股码流(用循环),存在AVFormatContext的streams数组中
    for(int i=0;i<formatContent->nb_streams;i++)
    {
        if(formatContent->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO)//streams->有AVStream结构体,AVStream->codec
        {
            //找到视频流(只有一个)
            videoType = i;//标识视频流这个类型
            break;
        }
    }
    if(videoType == -1)
    {
        qDebug()<<"没有找到视频流相关信息";
        return;
    }
            //对视频的编码只有编码器是不够的还要有宽高格式等
    //3.3编码器对应的上下文对象结构体,存储编码器以及宽高格式等
    AVCodecContext *codec = formatContent->streams[videoType]->codec;
    /*4、有视频流,则查找对应视频流的解码器*/
    AVCodec *decoder = avcodec_find_decoder(codec->codec_id);//需要解码器的id
    if(decoder ==nullptr)
    {
        qDebug()<<"没有找到对应的解码器";
        return;
    }
 
    /*5、找到解码器后打开解码器*/
    //参数:1.初始化的上下文对象 2.打开的解码器 3.类似目录的东西(没有)
    res = avcodec_open2(codec,decoder,nullptr);
    if(res!=0)
    {
        qDebug()<<"解码器打开失败";
        return;
    }
    /*6、获取到的每一帧码流(视频流)数据写到文件中(FILE结构体)*/
    /*6.1*/
    FILE *fp = fopen("saveH264.h264","wb+");
    AVPacket *pkt=nullptr;//pkt这时没有指向,要我们给他分配内存空间,希望把读出来的数据放到这块内存去
    pkt = (AVPacket *)malloc(sizeof(AVPacket));
    //码流数据是存到buffer里面,也需要我们动态开空间(AVBufferRef *buf;)
    //开空间不知道一帧的码流数据是多少?其实编解码器告诉了宽高,以此可以计算出给码流数据开多大空间
    int bufSize = codec->width*codec->height;//计算一帧(图)数据的大小
    av_new_packet(pkt,bufSize);
 
    //一帧一帧读[av_read_frame](循环)
    //参数:1最初保存信息的结构体 2包
 
    while(av_read_frame(formatContent,pkt) == 0)//成功读到了数据
    {
        /*6.2AVPacket->AVStream,要判断读到的每一帧的码流数据是不是视频流*/
        if(pkt->stream_index == videoType)
        {
            //是视频流则写到文件中
            fwrite(pkt->data,pkt->size,1,fp);//每次写一个结构体
        }
        //每次都存在同一块内存空间里,要清空上一次的操作
        av_packet_unref(pkt);//不是free
    }
 
    qDebug()<<"保存码流数据成功";
    fclose(fp);
 
 

main中创建对象即可测试:fdecode code;

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

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

到了这里,关于Qt基于FFmpeg解码本地视频生成H264文件并播放的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 音视频处理 ffmpeg中级开发 H264编码

    libavcodec/avcodec.h 常用的数据结构 AVCodec 编码器结构体 AVCodecContext 编码器上下文 AVFrame 解码后的帧 结构体内存的分配和释放 av_frame_alloc 申请 av_frame_free() 释放 avcodec_alloc_context3() 创建编码器上下文 avcodec_free_context() 释放编码器上下文 解码步骤 avcodec_find_decoder 查找解码器 avcod

    2024年02月01日
    浏览(59)
  • ffmpeg学习日记604-指令-将视频格式转为H264格式

    ffmpeg学习日记604-指令-将视频格式转为H264格式 在第四篇中,想要解码视频,缺没有弄清楚怎样的一个数据流,现在又明晰了一点,所谓的h264编解码,并不是直接将视频格式,通过h264编解码为视频原始数据流,这种说法是错误的,而是应该将视频格式转换为h264的数据流,然后

    2024年02月11日
    浏览(36)
  • 【Qt+FFmpeg】鼠标滚轮放大、缩小、移动——解码播放本地视频(三)

     上一期我们实现了播放、暂停、重播、倍速功能,这期来谈谈如何实现鼠标滚轮放大缩小和移动;如果还没看过上期,请移步 【Qt+FFmpeg】解码播放本地视频(一)_logani的博客-CSDN博客【Qt+FFmpeg】解码播放本地视频(二)——实现播放、暂停、重播、倍速功能_logani的博客-C

    2024年02月10日
    浏览(29)
  • 【音视频处理】转编码H264 to H265,FFmpeg,代码分享讲解

    大家好,欢迎来到停止重构的频道。 本期我们讨论音视频文件 转编码 ,如将视频H264转H265等。 内容中所提及的 代码都会放在GitHub ,感兴趣的小伙伴可以到GitHub下载。 我们按这样的顺序展开讨论:​ 1、  编码的作用  2、  转编码的工作原理 3、  编解码器安装  4、  示

    2024年02月11日
    浏览(38)
  • 关于Ubuntu python程序利用lixb264生成h264格式的视频相关问题

    从官网下载:https://www.nasm.us/pub/nasm/releasebuilds/2.13.03/ 安装包页面上的nasm-2.13.03.tar.bz2 x264库下载地址:http://www.videolan.org/developers/x264.html 下载 x264-master.tar.bz2 利用命令 x264 --version 查看是否配置成功 从官网下载ffmpeg ffmpeg-snapshot.tar.bz2 sudo ldconfig 若转出视频为h.264格式则说明成功

    2023年04月08日
    浏览(75)
  • Android MediaCodec将h264实时视频流数据解码为yuv,并转换yuv的颜色格式为nv21

    初始化mediacodec 处理数据,解码h264数据为yuv格式 这里传入的是h264格式的实时视频流数据。 处理获取到的nv21颜色格式的yuv数据  yuv视频数据颜色格式转换 h264实时视频流的数据来源 写入h264视频流到sdcard中 rtsp获取h264实时视频流数据  编写C代码加载ffmpeg库 源码地址 https://gi

    2024年01月17日
    浏览(51)
  • Linux Qt5.15.2 编译QWebEngine源码支持音视频H264

    默认自带的QWebEngine 因版权问题不支持音视频功能,需要自己编译源码以支持。 平台:Linux(UOS V20 1050) Qt:5.15.2 下载 Qt 5.15.2 对应版本源码,使用镜像网站或者Qt Maintenance Tool工具下载。 配置 Qt 环境变量 将以下内容追加到bashrc文件后 刷新使其生效 这个阶段可以预先安装所

    2024年02月05日
    浏览(45)
  • FFmpeg 解码 H.264 视频出现花屏和马赛克的解决办法

    发送数据包太大,超过了 FFmpeg 的默认最大值。 网络情况较差时,因网络状况出现的丢包。 解码出错。 包乱序。 一种方法是控制播放源的发送数据大小,但这极大浪费了当前的网络带宽,非优选方案。 更好的做法是扩大接收端的接收缓冲区,其修改方法为: 在 FFmpeg 的源码

    2024年04月26日
    浏览(28)
  • FFmpeg4入门13:h264编码为mp4

    上一篇将yuv源视频文件编码为 *.h264 的由libx264实现压缩的文件,将源文件从55M编码为620KB,但是h264文件只有视频数据,而且使用范围不太广。那么就需要进一步的封装,在此选用最常用的mp4格式为例。 随便选一个mp4格式文件,用FFmpeg4入门4:解析视频并输出视频信息或者ffp

    2023年04月10日
    浏览(68)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包