精华内容
下载资源
问答
  • Qt FFmpeg 音视频播放器
    2021-09-18 11:23:45

    使用FFmpeg库实现 本地和rtp 音视频播放器,使用qt绘制视频。

    本demo环境为 qt5.12 vs2019-32位 .pro的qt工程

    FFmpeg版本位3.4.8 vs2092-32位

    本demo一共分为四部分

    1:FFmpeg接口类,封装了一些FFmpeg的api,方便提供调用

    2:thread类, 线程类,读取视频,解码,发送数据

    3:UI类 使用qt的QOpenGLWidget类来绘制图像

    4:audio播放类。 使用qt的QAudioOutput来播放解码后的音频数据

    初始化ffmpeg

        avcodec_register_all();//注册所有解码器
        av_register_all();//注册所有格式
        avformat_network_init();//初始化网络流格式,使用RTSP网络流时必须先执行
    
        m_avFormatContext = avformat_alloc_context();
        m_yuvFrame = av_frame_alloc();
        m_pcmFrame = av_frame_alloc();

    打开视频流或者rtp,流获取视频信息

        //打开视频流
        int result=avformat_open_input(&m_avFormatContext, url.toStdString().c_str(),nullptr,nullptr);
        if (result<0)
        {
            qDebug()<<"avformat_open_input error ---"<<result;
            return false;
        }
        //获取视频流信息
        result=avformat_find_stream_info(m_avFormatContext,nullptr);
        if (result<0)
        {
            qDebug()<<"avformat_find_stream_info error ---"<<result;
            return false;
        }

    初始化音频相关,需要获取音频流的索引,初始化解码器上下文,音频重采样上下文

        //获取音频流索引
        for (uint i = 0; i < m_avFormatContext->nb_streams; i++)
        {
            if (AVMEDIA_TYPE_AUDIO == m_avFormatContext->streams[i]->codec->codec_type)
            {
                m_audioCodecContext = m_avFormatContext->streams[i]->codec;
                m_audioStreamIndex = i;
                break;
            }
        }
    
        if (-1 == m_audioStreamIndex)
        {        
            return false;
        }
    
        if(nullptr == m_audioCodecContext)
        {        
            return false;
        }
    
        //初始化一个视音频编解码器的AVCodecContext
        AVCodec *codec = avcodec_find_decoder(m_audioCodecContext->codec_id);//查找解码器
        if (avcodec_open2(m_audioCodecContext, codec, nullptr) < 0)
        {
            qDebug()<<"avcodec_open2 error---";
            return false;
        }
    
        m_sampleRate = m_audioCodecContext->sample_rate;//样本率
        m_channel = m_audioCodecContext->channels;//通道数
        switch (m_audioCodecContext->sample_fmt)//样本大小
        {
        case AV_SAMPLE_FMT_S16:
            this->m_sampleSize = 16;
            break;
        case  AV_SAMPLE_FMT_S32:
            this->m_sampleSize = 32;
        default:
            break;
        }
       
    
        if (nullptr == m_audioSwrContext)
        {
            m_audioSwrContext = swr_alloc();//初始化
            swr_alloc_set_opts(m_audioSwrContext,m_audioCodecContext->channel_layout,
                               AV_SAMPLE_FMT_S16,
                               m_audioCodecContext->sample_rate,
                               m_audioCodecContext->channels,
                               m_audioCodecContext->sample_fmt,
                               m_audioCodecContext->sample_rate,
                               0,0
                               );
            swr_init(m_audioSwrContext);
        }

    初始化视频相关,获取视频流的索引,初始化解码器上下文。

     //获取视频流索引
        for (uint i = 0; i < m_avFormatContext->nb_streams; i++)
        {
            if (AVMEDIA_TYPE_VIDEO == m_avFormatContext->streams[i]->codec->codec_type)
            {
                m_videoStreamIndex = i;
                m_videoCodecContext = m_avFormatContext->streams[i]->codec;
                break;
            }
        }
    
        if(-1 == m_videoStreamIndex)
        {
            qDebug()<<"videoStreamIndex init error---";
            return false;
        }
        if (m_videoCodecContext == nullptr)
        {
            qDebug()<<"videoCodecContext init error---";
            return false;
        }
    
        //获取视频流解码器
        AVCodec *pAVCodec = avcodec_find_decoder(m_videoCodecContext->codec_id);
        //打开对应解码器
        int result=avcodec_open2(m_videoCodecContext,pAVCodec,nullptr);
        if (result<0)
        {
            qDebug()<<"avcodec_open2 video open error";
            return false;
        }
    
        m_videoSwsContext = sws_getContext(m_videoCodecContext->width,m_videoCodecContext->height,
                                           m_videoCodecContext->pix_fmt,
                                           m_videoCodecContext->width,m_videoCodecContext->height,
                                           AV_PIX_FMT_BGRA,SWS_BICUBIC,0,0,0);
    
        avpicture_alloc(&pAVPicture,AV_PIX_FMT_BGRA,m_videoCodecContext->width,m_videoCodecContext->height);
    

    接下来就是线程run里面的读取数据,解码,发送数据的操作

    void VideoThread::run()
    {
        char audioOut[10000] = {0};
    
        while(m_isRun)
        {
            int free = AudioPlayer::Get()->GetFree();
            if (free < 10000)
            {
                msleep(1);
                continue;
            }
            AVPacket pkt = m_ffmpeg->getPacket();
            if (pkt.size <= 0)
            {
    
                msleep(10);
                continue;
            }
            if (pkt.stream_index == m_ffmpeg->m_audioStreamIndex)
            {
                m_ffmpeg->decode(&pkt);//解码
    
                int len = m_ffmpeg->getPCM(audioOut);//获取一帧音频的pcm
    
                AudioPlayer::Get()->Write(audioOut, len);            
            }
            else
            {
                if(m_ffmpeg->decode(&pkt))
                {
                    m_ffmpeg->getRBG();
                }
            }
    
            av_packet_unref(&pkt);
        }
    }
    AudioPlayer::Get()->Write(audioOut, len);    此部分是音频播放
    
    m_ffmpeg->getRBG();  此部分是获取rgb数据帧, 并且绑定信号跟槽函数到QTopenglWidget绘制

    UI绘制上:

    在槽函数中接受数据,并且updata刷新

    void OpenglWidget::paintEvent(QPaintEvent *e)
    {
        QPainter painter;
        painter.begin(this);
        painter.drawImage(QPoint(0, 0), m_image);
        painter.end();
    }
    
    void OpenglWidget::showImage(const QImage &image)
    {
        if(image.width() > image.height())
            m_image = image.scaledToWidth(width(),Qt::SmoothTransformation);
        else
            m_image = image.scaledToHeight(height(),Qt::SmoothTransformation);
    
        update();
    }

    绘制是按照视频原有的比例来绘制, 如果大分辨率切成小分辨率则需要刷新一下背景

    以上是在做音视频demo时候的一点小心得,第一次发表,如有不妥之处,敬请指教。

    demo链接 https://download.csdn.net/download/qq871580236/23535111

            

    更多相关内容
  • 基于Qt ffmpeg开发的安卓实时投屏软件,将安卓手机视频实时投屏到电脑端,并使用电脑键鼠实时控制安卓手机,还支持键鼠玩吃鸡手游。项目中使用Qtffmpeg等开发,涉及多进程、多线程、网络编程、视频解码、视频渲染...
  • QT FFMPEG播放H264

    2019-01-09 17:16:40
    QT框架下利用ffmpeg, 播放H264,
  • qt ffmpeg 视频文件

    2020-08-26 11:30:29
    qt 的qml 和C++交互的模式,利用第三方的ffmpeg 多线程 播放本地视频,视频路径需要自己改一下
  • QT-RTSP-DEMO 使用从 CSDN 下载的演示,ffmpeg-2.4.3 库。
  • qt ffmpeg player

    2017-11-29 14:11:30
    qt 播放器 qt 播放器 ffmpeg qt qt 播放器 qt 播放器 ffmpeg qt qt 播放器 qt 播放器 ffmpeg qt
  • ffmpeg是世界上应用广的开源视频处理框架,在各个平台(windows,linux,嵌入式、Android、IOS)被广泛应用,可以说是做视频相关项目技能qt是目前跨平台项目界面开发的第一选择,本课程基于这两种框架在加上VC++,给...
  • QT+FFmpeg4.x Windows开发环境搭建.docx
  • 这是基于QT+FFMPEG推流客户端。 QT版本5.12.6. 编译器: MinGW 32 支持: 1. 推流摄像头图像+音频到流媒体服务器 2. 推流桌面图像+音频到流媒体服务器 3. 录制摄像头图像+音频到本地 4. 录制桌面图像+音频到本地 ...
  • Qt调用FFmpeg命令录屏

    2019-02-25 21:05:47
    Windows平台,Qt调用FFmpeg.exe进行录屏。支持操作,开始录屏-暂停-结束录屏。
  • qt 基于ffmpeg 实现视频的拼接、合并,只针对同格式,同分辨率的视频,不同格式不通过分辨率的视频需要从新进行解码和编码,附带FFmepg第三方库,windos和linux都有
  • vs2017+qt+ffmpeg 开发的视频播放工具,最简单的播放功能,可以播放rtsp流,rtmp流,udp流。
  • 功能: 1. 从摄像头拉rtmp裸h264流 2. 实时播放 3. 断线重连 4. ffmpeg版本4.3,包括在源码中 5. 作为学习够用了
  • qt+ffmpeg播放音频

    2017-08-29 21:53:05
    使用qtffmpeg播放音频。
  • Qt FFmpeg音乐播放器

    2016-11-29 21:58:31
    http://blog.csdn.net/what951006/article/details/53376413 项目名因为一个bug迟迟未解决,怒了就乱敲了!! 可以多次播放!有UI界面~鸡肋
  • 功能: 1. 从摄像头拉rtsp裸h264流 2. 实时播放 3. 视频流实时转换为Mpeg-Ts 4. 改变码率,改变I帧间隔 5. 断线重连 6. ffmpeg版本4.3
  • qt基于ffmpeg 实现保存网络流到本地文件,网络流包括flV,rtmp、rtsp等形式,本地存储文件格式包括MP4、flv、avi等格式,可以根据需要进行修改,附带ffmpeg+SDL第三方库,windows64位以及linux库
  • 实现了一路Qt + FFmpeg RTSP视频流的解码,调用FFmpeg API实现,版本为FFmpeg 4.1.2。实测视频延迟为200ms 以内,已达到商业使用标准。
  • Qt+FFMPEG 实现简单的视频播放器

    热门讨论 2017-11-28 13:26:46
    这是Qt的工程,建议使用Qt Creator 打开 从零开始学习音视频编程技术(二十二) 录屏软件开发之BUG修复 FFMPEG的版本是2.5.2 SDL的版本是2.04 记得将ffmpeg/bin目录下的dll文件拷贝到编译生成的exe所在的目录下...
  • QT+ffmpeg+可设置rtsp地址+实时显示多摄像头,多线程,重点是简单易懂可拓展性很强,在Ubuntu上可以直接运行整个工程,毫无破绽。在Windows上需要
  • Linux上用ffmpegQt上实现采集摄像头并编码RTMP传输,里面附带像素操作添加水印源码,可惜录音那里我被ALSA Buffer xrun卡住了,所以只有视频。
  • Qt+ffmpeg+qsv解码,包含所有依赖的库以及运行所需的库,以及解码+显示源代码整个工程。项目在Qt5.9.3下编译,64位,默认用Release编译。需要注意硬件是否支持QSV解码。
  • qt ffmpeg camera 打开摄像头

    千次阅读 2019-10-25 14:58:57
    最近项目需求,研究了下ffmpeg操作摄像头,主要是参考了雷神的博客,博主用的ffmpeg版本有点低,但是还是很有参考价值,对于初学者来说是一个很不错的选择。 准备工作,ffmpeg官网下载SDK,我使用的是mingw编译器,...

    最近项目需求,研究了下ffmpeg操作摄像头,主要是参考了雷神的博客,博主用的ffmpeg版本有点低,但是还是很有参考价值,对于初学者来说是一个很不错的选择。

    准备工作,ffmpeg官网下载SDK,我使用的是mingw编译器,直接下载编译好的32位SDK就可以直接使用了,如果是MSVC编译器貌似不能直接使用,得下载源码,自己编译,编译还比较简单,这里就不多说了。

    ffmpeg 打开摄像头的大致 流程:初始化设置调用几个api,然后是avframe_open_input 打开摄像头,就可以开始一直循环读取一帧一帧的数据了,av_read_frame 获取的是一个packet,解包生成AVFrame,这个时候数据一般是YUV格式,如果使用qt显示是无法直接使用的,在使用一个api进行转换格式sws_scale 转位RGB32格式数据,在构建成一个QImage图片,然后qt就可以直接显示图片了。

    核心代码截图:

    运行效果图:


    完整项目下载地址:https://download.csdn.net/download/u012532263/11925212
    直接qt编译即可使用,带了ffmpeg SDK 我测试的是mingw的 msvc自己编译源码。
    仅供学习参考:by Dione

    展开全文
  • Qt使用FFMPEG的例子

    2018-05-13 12:14:55
    根据http://blog.yundiantech.com/?log=blog&id=7这篇教程写的FFMEG例子 Qt版本是5.5 FFMPEG版本是3.4
  • 整合QTFfmpeg,实现ffmpeg抽取音频、视频、格式转换等内容。本例是QT源码文件,需要自己下载ffmpegFfmpeg_demo1.pro中配置自己的ffmpeg目录
  • Qt+FFMPEG+SDL实现的视频播放器 包含源代码和可执行程序 Qt+FFMPEG+SDL实现的视频播放器 包含源代码和可执行程序
  • 利用QTFFmpeg实现类似于格式工厂的功能,进行简单的音视频处理。
  • 这是QT+FFMPEG设计的流媒体播放器完整源码 1. 支持RTMP流播放 2. 支持RTSP流播放 3. 支持音频播放 4. 支持视频播放 编译器: MinGW 32位 QT版本: 5.12.6
  • 先在官网下载ffmpeg32位的库,在Qt上打开usb摄像头。在线程里每一帧的图片通过信号传回GUI界面并显示,记住一定要在线程里面实现,不然会卡界面。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 11,445
精华内容 4,578
关键字:

QT ffmpeg