使用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来播放解码后的音频数据

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

初始化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;}//初始化一个视音频编解码器的AVCodecContextAVCodec *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);//获取一帧音频的pcmAudioPlayer::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);elsem_image = image.scaledToHeight(height(),Qt::SmoothTransformation);update();
}

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

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

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

Qt FFmpeg 音视频播放器相关推荐

  1. 基于Phonon+QT的音视频播放器设计与实现

    目 录 摘 要 2 第一章 软件需求说明书 1 1.1 引言 1 1.2 业务流程整体说明 1 第二章 需求分析报告 3 2.1 引言 3 2.2 任务概述 3 2.3 功能需求 3 2.4 性能需求 ...

  2. FFmpeg音视频播放器系列(第三篇:seek实现播放进度控制)

    文章目录 如何实现播放进度控制 av_seek_frame seek操作要点 按视频流seek 按音频流seek 代码实现 上一篇基本实现了音视频的播放同步,简单的按键控制暂停.恢复.退出操作,这一篇 ...

  3. wince版ffmpeg音视频播放器

    介绍: 1. 基于ffmpeg 0.8.7版本开发 2. 目标运行平台 Wince 6.0+ Armv4 3. 音视频的全格式支持 4. 支持音乐播放器的歌词显示 5. 支持音乐播放的频谱显示 6.支 ...

  4. QT + FFmpeg 5.x + x264 + x265 + SDL2 音视频播放器

    QT + FFmpeg 5.x + x264 + x265 + SDL2 音视频播放器 使用了QT的QML设计界面,人机交互; 使用了FFmpeg 5.x + x264 + x265 + SDL2 完 ...

  5. 基于Qt、FFMpeg的音视频播放器设计一

    前言:整个项目的源代码 https://download.csdn.net/download/hfuu1504011020/10672140 最近刚完成基于Qt.FFMpeg的音视频播放器相关C++程 ...

  6. QT软件开发-基于FFMPEG设计视频播放器-软解图像(一)

    QT软件开发-基于FFMPEG设计视频播放器-CPU软解视频(一) https://xiaolong.blog.csdn.net/article/details/126832537 QT软件开发-基于 ...

  7. QT软件开发-基于FFMPEG设计视频播放器-解码音频(三)

    QT软件开发-基于FFMPEG设计视频播放器-CPU软解视频(一) https://xiaolong.blog.csdn.net/article/details/126832537 QT软件开发-基于 ...

  8. 使用Qt编写的跨平台音视频播放器(一)

    1.初衷 为了学习Qt,遂自己琢磨着写一个音视频播放器(比较五花八门,借鉴模仿了好几个软件的界面),可以有很多种实现方式,在这里我使用的是QMediaPlayer,和QVideoWidget显示.有时 ...

  9. QT视频播放器(windows qt、linux qt 音视频播放器)

    想要更多项目私wo!!! 一.项目简介        这是基于Qt的QMediaPlayer实现的音视频播放器,实现了播放器的常用功能,例如根据播放列表选择播放的音视频,拖动滑块控制音视频播放. 二. ...

最新文章

  1. MySQL的安装过程
  2. 送你38个常用的Python库,数值计算、可视化、机器学习等8大领域都有了
  3. 无预测 不零售 | SAP统一需求预测平台
  4. 物联网帝国——孙正义职业生涯最大的豪赌
  5. 道指mt4代码_道恩转债上市首日遭大股东清仓式减持!
  6. #自定义多级菜单_怎么搞定排版中的多级列表问题?
  7. com.google.zxing 二维码生成与解析
  8. Cookie机制小记
  9. 处理机调度算法——先来先服务、高优先权、按时间片轮转调度算法,高响应比调度算法
  10. CST学习笔记------材料边界
  11. 一次Linux内核内存泄露实例分析
  12. chrome打不开plugins
  13. Android P 怎样屏蔽HOME键和RECENT键
  14. 【第一组】第十一次例会纪要
  15. 2011刚上市的句子
  16. 5个不为人知的黑科技手机APP,绝对让你大开眼见!
  17. 88E1111 100BASE-T百兆工程(part2--完)
  18. linux hosts的allow和deny
  19. 比心app源码,获取系统时间
  20. 2018前端面试题 css 部分

热门文章

  1. 【Guacamole中文文档】二、用户指南 —— 4.代理Guacamole
  2. Vue父子组件生命周期的先后顺序
  3. 不会吧,不会吧,不会还有人不知道Python给图片加水印超级简单哦
  4. 华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典
  5. C语言学习之路(高级篇)—— 变量和内存分布(上)
  6. PLU-分解以及求逆矩阵
  7. Element-ui的理解
  8. 单板计算机系统备份,最强单板计算机UP Board之Windows10完全版、Ubuntu、Andriod系统体验...
  9. python读取xlsx python读取excel数据
  10. 使用mybatis plus添加返回主键id