QT 6.6.0 + FFmpeg + SDL2实现MP4视频播放(过程详解)

B站视频讲解

GitHub源码下载地址

目录

实现思路

问题1:avformat_alloc_context和avcodec_alloc_context3分别作用以及区别?

问题2:av_image_get_buffer_size和av_image_fill_arrays分别作用以及区别?

问题3:sws_getContext和sws_scale的作用?

问题4:av_packet_unref作用?

问题5:寻找视频流索引号?


初学案例教程
QT6.6.0实现打开电脑摄像头或其他的外接摄像头(实现拍照功能)
QT6.6.0实现简单的录音器
QT6.6.0实现一个简单的视频和音频播放器
QT6.6.0实现简单的视频录制(包含语音录制)器
QT6.6.0关于QMediaMetaData功能以及列子说明使用方法
QT6.6.0实现QtCamera功能(拍照,录像以及图像和视频的相关配置)
T6.6.0实现更好的视频播放器(前期改进)
QT6.6.0实现图表如饼图,柱状图,散点图以及盒图等的基本使用
QT6.6.0实现客户端Socket编程以及socket测试软件通信
QT6.6.0 实现服务端Server和多个客户端Client通信以及socket测试软件通信
QT6.6.0 实现QNetworkAccessManager的基本应用以及其拓展使用
QT6.6.0 实现服务端Server和多个客户端Client互相发送文件信息
QT6.6.0和QT6.0以下的版本实现FTP文件上传和下载(过程详解)
QT6.6.0实现QNetworkInterface网络接口,QHostAddress网络地址IP以及域名解析等相关信息查询。
QT6.6.0基于QTcpSocket和QTcpServer实现多个客户端群聊
QT6.6.0实现基于UDP协议的简单通信(过程详解)
QT 6.6.0基于UDP协议实现广播和多播机制(过程详解)
QT 6.6.0基于UDP协议实现群聊功能(过程详解)
QT 6.6.0中OpenCV两种环境的配置方法以及基本使用例子
QT 6.6.0 中基于OpenCV的图像变换以及基于鼠标点击移动事件的图像绘制
QT 6.6.0 基于OpenCV对图像进行旋转,缩放和裁剪等操作
QT 6.6.0 基于OpenCV实现图像风格的改变(add和subtract)
PyTorch 训练之后的网络模型.pth转.onnx文件并对图像进行预测
QT 6.6.0 基于OpenCV加载.pth模型文件转换之后的ONNX模型文件,并且实现图像分类
QT 6.6.0 基于OpenCV中的cv::dnn::ClassificationModel实现图像分类
yolov5目标检测和QT 6.6.0 基于OpenCV加载yolov5.onnx模型文件实现目标检测
FCN图像分割和QT 6.6.0 加载分割FCN_Resnet50.ONNX模型文件进行图像分割(过程详解)
QT 6.6.0 中基于SDL2库实现WAV音频格式的播放(过程详解)
QT 6.6.0 中SDL2库的基本使用以及利用SDL2库创建的界面实现音频播放(过程详解)
QT 6.6.0 中基于SDL2,SDL2_ttf,SDL2_image,SDL2_mixer实现音频播放器(改进版)
QT 6.6.0 + SDL2 + SDL2_mixer实现音频播放器(改进)
QT 6.6.0 中基于FFmpeg + SDL2 + SDL2_mixer实现音频录音(过程详解)

        前面我们已经实现了QT 6.6.0 中基于FFmpeg + SDL2 + SDL2_mixer实现音频录音 录音功能,但是里面关于音频的解码部分并没有讲的很清楚(因为那不是重点,重点是录音),因此后期会继续去搞清楚再来讲解。文本主要是讲解使用QT 6.6.0 + FFmpeg + SDL2实现视频播放,其中采用FFmpeg对视频解码,同时也采用了SDL2多线程功能防止主线程阻塞。

实现思路

  1. SDL2初始化以及FFmpeg设备注册;
  2. 定义结构体数据,包含了创建窗口,渲染器,纹理以及上下文格式等变量(便于传入到创建的线程函数中);

  1. 创建窗口,渲染器,纹理以及遍历当前上下文流,找到视频流索引号,其实就是SDL2初始化指定的SDL_INIT_VIDEO变量

  1. 创建线程,包含了线程函数,线程函数名以及传入的结构体变量;

  1. 主线程运行,显示窗口以及从事件队列中获取待处理的事件;

  • 处理事件:通过 SDL_PollEvent 从事件队列中获取待处理的事件,例如鼠标移动、键盘按下等。
  • 保持窗口响应:在应用程序运行时,循环不断检查和处理事件,确保窗口不会被冻结并能够即时响应用户交互。
  • 程序退出的控制:通过捕捉 SDL_QUIT 事件(例如点击窗口的关闭按钮)或特定按键(如 ESC)实现安全退出,使用户能够方便地关闭程序。

 注:大家想一想,如果缺少这部分,程序还能正常运行吗?答案是可以正常运行,但是不能响应鼠标移动等事件,会导致程序运行的过程中崩溃。因此,除了使用多线程解决读取视频帧以及更新视频帧之外,还需要使用上述while中的代码解决鼠标移动等事件。防止鼠标移动窗口导致程序崩溃。

  1. 子线程运行,读取视频帧和实时更新视频帧;

  1. 等待子线程结束。
//等待线程结束
SDL_WaitThread(thread,nullptr);
  1. 回收资源。
// 清理资源(子线程函数)
av_free(buffer);
av_frame_free(&pFrameRGB);
av_frame_free(&pFrame);
sws_freeContext(sws_ctx);
//主线程介素
SDL_DestroyTexture(texture);
SDL_DestroyRenderer(renderer);
SDL_DestroyWindow(window);
avcodec_free_context(&pCodecCtx);
avformat_close_input(&pFormatCtx);
SDL_Quit();

问题1:avformat_alloc_contextavcodec_alloc_context3分别作用以及区别?

特性/函数avformat_alloc_contextavcodec_alloc_context3
对象类型分配和初始化 上下文AVFormatContext分配和初始化 AVCodecContext
主要用途管理和处理多媒体文件及其格式处理特定编解码器的编码或解码参数
表示方法文件或流的格式信息编解码器的设置和状态
使用场景打开文件、查找流信息、处理媒体文件的上下文进行音视频编解码,操作具体的编解码器设置

注:虽然这里并没有对其函数的具体参数进行介绍,但是读者了解其作用之后,点击进去查看具体的函数参数即可知道参数的含义(下面的介绍同样的方式)。

问题2:av_image_get_buffer_sizeav_image_fill_arrays分别作用以及区别?

特性/函数av_image_get_buffer_sizeav_image_fill_arrays
作用计算图像数据需要的缓冲区大小(字节单位)填充 AVFrame结构体的数据指针和行宽以及其他参数
输出结果返回所需的内存字节数,表示存储指定格式和尺寸的图像所需字节数,用于申请空间无返回值,直接修改传入的指针和行宽数组
大致使用场景内存分配前获取缓冲区大小,并且使用av_malloc申请空间初始化和准备图像帧的像素数据,比如本文用于显示视频帧
大致输入参数图像格式、宽度、高度数据指针、行宽数组、图像格式、宽度、高度

注:这两个函数通过看了这个表格总结之后倒是比较好理解,因为用于最终视频帧的显示,必须要有能存储视频帧信息的变量。

问题3:sws_getContextsws_scale的作用?

第一点:sws_getContext

基本作用

  • sws_getContext 函数用于创建和初始化一个缩放上下文(SwsContext),该上下文包含了进行图像缩放所需的所有信息和状态(比如从原图像大小到目标图像大小信息,原图格式到目标格式信息,具体的缩放算法信息)。
    •  三种缩放算法(本文主要是对图像高宽调整,使用了SWS_BILINEAR双线性插值
      •  对于SWS_BICUBIC参数[0]和[1],调整基的形状函数,参数[0]调整f(1)和参数[1]f´(1)
      • 对于SWS_GAUSS参数[0]调整指数,从而切断频率;
      • 对于SWS_LANCZOS, param[0]调整窗口函数的宽度
  • 此函数根据输入和输出图像的格式、尺寸和缩放方法等参数,配置相应的上下文,使得图像可以在不同格式或分辨率之间转换。

使用场景

  • 在处理视频流时,如果需要将图像从一种格式或分辨率转换为另一种格式或分辨率(比如像本文调整视频帧大小等),则必须先使用 sws_getContext 创建一个缩放上下文。
  • 当应用程序处理输入的原始图像时,使用此函数为以后的图像缩放和格式转换做准备。

第二点:sws_scale

基本作用

  • sws_scale 函数用于执行图像的缩放和格式转换操作。
  • 使用之前创建的 SwsContext,它根据源图像的像素数据,将图像缩放到目标尺寸,并可能进行格式转换(如图像高宽缩放)。

使用场景

  • 在接收到输入帧后,使用 sws_scale 将其处理成特定输出格式和尺寸的图像数据,以便能够显示、编码、存储或用于后续处理,比如本文对读取的视频帧处理。

问题4:av_packet_unref作用?

  • 释放资源av_packet_unref 释放 AVPacket 中可能分配的内存缓冲区,特别是数据指针指向的内存。
  • 重置状态av_packet_unref释放了数据后,会将 AVPacket 的状态重置为初始化状态,意味着可以在同一个 AVPacket 实例上重新调用 av_read_frame 或重新填充数据,清除之前的数据干扰。

问题5:寻找视频流索引号?

QT 6.6.0 + FFmpeg +SDL2 实现视频播放

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值