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(......)

经验分享 程序员 微信小程序 职场和发展