Qt Qss FFplay SDL播放器实战项目


***【在线视频教程】***

好文章,来自【福优学苑@音视频+流媒体】

项目简介

基于Qt、FFMpeg的音视频播放器相关C++程序,实现音视频播放器的全部功能。

其中以模块为主,每一个模块,分为几个小模块,总结每个小模块,再整合起来,过程比较好理解,也比较清晰,适合新入门的同学快速理解并亲手实践。

image.png


功能模块   


  • QT界面设计

  • 类结构及功能组件详解

  • FFMPEG视频处理原理以及实现

  • FFMPEG音频处理原理以及实现

  • SDL视频渲染原理以及实现

  • 音视频同步及播放控制

  • 胳膊、腿、大脑,有机组合

  • Qt+FFmpeg播放器小结



MVC模式


MVC框架

MVC(Model-View-Controller)框架

其实从字面意思来说,只能了解各大概,view应该是视图的意思,那Model和Controller究竟是什么?  

image.png

  • 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并缩放

image.png




SDL结构图

image.png


SDL函数调用的一般流程

image.png


最最主要操作的函数是SDL_texture();

工作过程大致是:

FFMpeg「Decode」解码一帧,交给SDL_texture(), 然后再复制给渲染器,渲染器再显示出来。以此循环。


SDL的一些主要的数据结构

image.png





类结构及功能组件详解

类名 功能介绍

  • AVPacketQueue 包队列

  • MainDecoder 主解码器

  • AudioDecoder 音频解码器

  • MainWindow 主窗口



AVPacketQueue功能组件详解

class AvPacketQueue
{
public:
    explicit AvPacketQueue();
    void enqueue(AVPacket *packet);
    void dequeue(AVPacket *packet, bool isBlock);
    bool isEmpty();
    void empty();
    int queueSize();
private:
SDL_mutex *mutex;
SDL_cond *cond;
    QQueue<AVPacket> queue;
};



MainDecoder

初始化包队列


打开媒体(文件、流)


打开流解码器


线程VideoThread


打开音频解码器



视频FilterGraph

责任链模式

image.png




FFMPEG + SDL音频播放分析

1 抽象流程:

抽象流程:

设置SDL的音频参数

 —-> 打开声音设备,播放静音

 —-> ffmpeg读取音频流中数据放入队列

 —-> SDL调用用户设置的函数来获取音频数据

 —-> 播放音频


SDL内部维护了一个buffer来存放解码后的数据,这个buffer中的数据来源是我们注册的回调函数(audio_callback),audio_callback调用audio_decode_frame来做具体的音频解码工作,

需要引起注意的是:从流中读取出的一个音频包(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(......)





Qt+FFmpeg播放器小结





好文章,来自【福优学苑@音视频+流媒体】
***【在线视频教程】***