Qt FFmpeg 音视频播放器
使用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 音视频播放器相关推荐
- 基于Phonon+QT的音视频播放器设计与实现
目 录 摘 要 2 第一章 软件需求说明书 1 1.1 引言 1 1.2 业务流程整体说明 1 第二章 需求分析报告 3 2.1 引言 3 2.2 任务概述 3 2.3 功能需求 3 2.4 性能需求 ...
- FFmpeg音视频播放器系列(第三篇:seek实现播放进度控制)
文章目录 如何实现播放进度控制 av_seek_frame seek操作要点 按视频流seek 按音频流seek 代码实现 上一篇基本实现了音视频的播放同步,简单的按键控制暂停.恢复.退出操作,这一篇 ...
- wince版ffmpeg音视频播放器
介绍: 1. 基于ffmpeg 0.8.7版本开发 2. 目标运行平台 Wince 6.0+ Armv4 3. 音视频的全格式支持 4. 支持音乐播放器的歌词显示 5. 支持音乐播放的频谱显示 6.支 ...
- QT + FFmpeg 5.x + x264 + x265 + SDL2 音视频播放器
QT + FFmpeg 5.x + x264 + x265 + SDL2 音视频播放器 使用了QT的QML设计界面,人机交互; 使用了FFmpeg 5.x + x264 + x265 + SDL2 完 ...
- 基于Qt、FFMpeg的音视频播放器设计一
前言:整个项目的源代码 https://download.csdn.net/download/hfuu1504011020/10672140 最近刚完成基于Qt.FFMpeg的音视频播放器相关C++程 ...
- QT软件开发-基于FFMPEG设计视频播放器-软解图像(一)
QT软件开发-基于FFMPEG设计视频播放器-CPU软解视频(一) https://xiaolong.blog.csdn.net/article/details/126832537 QT软件开发-基于 ...
- QT软件开发-基于FFMPEG设计视频播放器-解码音频(三)
QT软件开发-基于FFMPEG设计视频播放器-CPU软解视频(一) https://xiaolong.blog.csdn.net/article/details/126832537 QT软件开发-基于 ...
- 使用Qt编写的跨平台音视频播放器(一)
1.初衷 为了学习Qt,遂自己琢磨着写一个音视频播放器(比较五花八门,借鉴模仿了好几个软件的界面),可以有很多种实现方式,在这里我使用的是QMediaPlayer,和QVideoWidget显示.有时 ...
- QT视频播放器(windows qt、linux qt 音视频播放器)
想要更多项目私wo!!! 一.项目简介 这是基于Qt的QMediaPlayer实现的音视频播放器,实现了播放器的常用功能,例如根据播放列表选择播放的音视频,拖动滑块控制音视频播放. 二. ...
最新文章
- MySQL的安装过程
- 送你38个常用的Python库,数值计算、可视化、机器学习等8大领域都有了
- 无预测 不零售 | SAP统一需求预测平台
- 物联网帝国——孙正义职业生涯最大的豪赌
- 道指mt4代码_道恩转债上市首日遭大股东清仓式减持!
- #自定义多级菜单_怎么搞定排版中的多级列表问题?
- com.google.zxing 二维码生成与解析
- Cookie机制小记
- 处理机调度算法——先来先服务、高优先权、按时间片轮转调度算法,高响应比调度算法
- CST学习笔记------材料边界
- 一次Linux内核内存泄露实例分析
- chrome打不开plugins
- Android P 怎样屏蔽HOME键和RECENT键
- 【第一组】第十一次例会纪要
- 2011刚上市的句子
- 5个不为人知的黑科技手机APP,绝对让你大开眼见!
- 88E1111 100BASE-T百兆工程(part2--完)
- linux hosts的allow和deny
- 比心app源码,获取系统时间
- 2018前端面试题 css 部分
热门文章
- 【Guacamole中文文档】二、用户指南 —— 4.代理Guacamole
- Vue父子组件生命周期的先后顺序
- 不会吧,不会吧,不会还有人不知道Python给图片加水印超级简单哦
- 华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典
- C语言学习之路(高级篇)—— 变量和内存分布(上)
- PLU-分解以及求逆矩阵
- Element-ui的理解
- 单板计算机系统备份,最强单板计算机UP Board之Windows10完全版、Ubuntu、Andriod系统体验...
- python读取xlsx python读取excel数据
- 使用mybatis plus添加返回主键id