FFmpeg入门详解之53:Qt Qss FFplay SDL播放器实战项目
项目简介
基于Qt、FFMpeg的音视频播放器相关C++程序,实现音视频播放器的全部功能。
其中以模块为主,每一个模块,分为几个小模块,总结每个小模块,再整合起来,过程比较好理解,也比较清晰,适合新入门的同学快速理解并亲手实践。
功能模块
-
QT界面设计 类结构及功能组件详解 FFMPEG视频处理原理以及实现 FFMPEG音频处理原理以及实现 SDL视频渲染原理以及实现 音视频同步及播放控制 胳膊、腿、大脑,有机组合 Qt+FFmpeg播放器小结
MVC模式
MVC框架
MVC(Model-View-Controller)框架
其实从字面意思来说,只能了解各大概,view应该是视图的意思,那Model和Controller究竟是什么?
-
Model: 处理数据逻辑和程序运行状态,实体类,用于存储属性值 View: 则只负责显示 Controller: 通常负责处理用户交互的部分,从视图读取数据与用户输入,并向模型发送数据;这里顺便提一下,在Qt里面我们并没有Controller的概念,而是Delegate(委托),意义很明显:控制器委托模型来处理数据,模型委托控制器来做数据的交互。
这样的框架好处是很明显的:
- 高重用性:一个模型可以有多个视图,同样一个视图也可以对应多个模型
- 低耦合:因为模型与视图分离,所以可以独立的拓展和修改而不产生相互的影响
- 快速开发和便捷部署
Qt界面设计
主窗口
布局
垂直布局
水平布局
控件
标签
按钮
滑动条
文本框
QSS
border-radius: 4px;
border:2px solid #00ff00;
width: 60px;
height: 10px;
border-color
background: red;
color:white;
font-size:20px;
font-weight:bold;
FFMPEG视频处理原理以及实现
打开视频获取视频信息
读取视频分析视频包
打开视频解码器
视频解码并分析H264解码
打开格式转换和缩放
视频转RGB并缩放
SDL结构图
SDL函数调用的一般流程
最最主要操作的函数是SDL_texture();
工作过程大致是:
FFMpeg「Decode」解码一帧,交给SDL_texture(), 然后再复制给渲染器,渲染器再显示出来。以此循环。
SDL的一些主要的数据结构
类结构及功能组件详解
类名 功能介绍
-
AVPacketQueue 包队列 MainDecoder 主解码器 AudioDecoder 音频解码器 MainWindow 主窗口
AVPacketQueue功能组件详解
MainDecoder
初始化包队列
打开媒体(文件、流)
打开流解码器
线程VideoThread
打开音频解码器
视频FilterGraph
责任链模式
FFMPEG + SDL音频播放分析
1 抽象流程:
抽象流程:
设置SDL的音频参数
—-> 打开声音设备,播放静音
—-> ffmpeg读取音频流中数据放入队列
—-> SDL调用用户设置的函数来获取音频数据
—-> 播放音频
需要引起注意的是:从流中读取出的一个音频包(avpacket)可能含有多个音频桢(avframe),所以需要多次调用avcodec_decode_audio4来完成整个包的解码,解码出来的数据存放在我们自己的缓冲中(audio_buf2)。
SDL每一次回调都会引起数据从audio_buf2拷贝到SDL内部缓冲区,当audio_buf2中的数据大于SDL的缓冲区大小时,需要分多次拷贝。
2 关键实现:
2.1 main()函数
2.2 decode_thread()读取文件信息和音频包
2.3 stream_component_open():设置音频参数和打开设备
2.4 audio_callback(): 回调函数,向SDL缓冲区填充数据
2.5 audio_decode_frame():解码音频
胳膊、腿、大脑,有机组合,赋予生命
解协议
解封装
解码
音视频同步
SDL渲染
Start(......)