VideoPlay001

记得一键三连哦

  • 使用qt+ffmpeg开发简单的视频播放器,无声音
  • 视频解码使用的是软解码即只用CPU进行QPainter绘制每一帧图像,CPU占用过高
  • 简单易学,适合小白入门学习FFMpeg视频解析的基本API

遗留问题

  • 视频播放时间的处理,基匀速播放的实现原理

项目代码

videoPlay001分支

项目警告

  • 注:博主本人学习过程的分享,引用他人的文章皆会标注原作者
  • 注:点名某初生DN,未来是属于开源的
  • 注:本人文章非盈利性质,若有侵权请联系我删除
  • 注:联系方式Q:2950319782
  • 注:博主本人很菜,文章基本是二次创作,大佬请忽略我的随笔
  • 注:我会一步步分享实现的细节,若仍有问题请留言,还可以问ChatGPT

项目引用

问题解决

开发环境

  • 系统:Win10
  • Qt:5.14.2
  • 编译器:qtcreator 4.11.1, minGW64
  • ffmpeg: 5.12

实现功能

  • 使用ffmpeg音视频库软解码实现视频播放器
  • 支持打开多种本地视频文件(如mp4,mov,avi等)
  • 支持解析多种网络视频流(如rtsp,rtmp,http等)
  • 支持视频匀速播放
  • 采用QPainter进行图像显示,支持自适应窗口缩放
  • 视频播放支持实时开始,暂停,继续播放
  • 采用模块化编程,视频解码,线程控制,图像显示各功能分离,低耦合
  • 多线程编程

实现逻辑

  • 程序主逻辑
  • ffmpeg软解码流程

项目实现

项目结构

项目思路

页面搭建

  • 需要实现视频的播放,那么要先要有个页面,使用qtcreator设计界面
  • 不是很复杂的页面我们直接使用自带的ui界面即可
  • 博主使用的是minGW64编译
  • 我们要有一个combo box来获取网络视频流的URL或者本地视频流的地址
  • 还需要一个打开文件的按钮,来打卡文件对话框,选择视频文件
  • 还需要一个开始播放的按钮和一个暂停播放的按钮
  • 至于QPainter绘制解码出来的每一帧图片我们自定义一个PlayImage控件,来显示视频
  • PlayImage继承自Widget,记得把ui文件中的PlayImage控件提升为自定义的控件
  • 最终的ui图

自定义控件

  • 一步步来,我们先实现自定义的控件来解决视频的功能
  • 先创建一个CPP类PlayImage继承自QWidget
  • 为什么不用QLabel显示图片呢,因为显示静态的图片还可以,但是如果像视频这样频繁的更新图片,会使程序变得异常卡顿,因此使用QPainter重绘每一帧图像来实现视频播放的功能
  • 这个Demo图片数据量比较小,完全可以实现,基本的逻辑就是不断更新图像路径,一直重绘,直到没有图像传进来
  • 其实这里自定义控件应该是单独封装的,作为外部文件引入,方便复用,但这里为了简单,还是直接写入代码吧
  • 在这里封装了两个主要的方法updateImage和updatePixmap,解码出的每一帧图片只需要调用对应的图像更新方法就可以实现视频显示

视频解码实现

  • 到这里,已经有视频播放的功能了,现在需要把视频的解码完成出来
  • 到这里呢,其实建议把视频解码封装成一个单独的功能,使用pri引入即可
  • 这里呢,直接创建一个不带ui文件的pri就可以,我是直接在源文件目录下新建了一个play文件了,新建一个videoplay.pri文件,再修改一下主工程的pro文件,引入即可
  • 在这个子工程中,添加一个纯cpp类,videoDocode,实现视频解码主要功能
  • 视频解码按照上面的流程图实现即可,当然需要先引入FFMpeg的l相关文件,这里建议以外部文件引入,我是放在videoplay.pri目录下,新建一个ffmpeg文件夹,再更改一下pri文件,引入即可
视频解码
  • 引入avformat解封装模块,先来把封装的格式剥去
  • 这里呢因为使用了FFmpeg,建议还是写c风格的代码,省的报错
  • 先定义一个通用的处理错误的函数errHandle
  • 然后在open函数中实现解析视频流,剥去封装格式,然后读取视频流获取信息
  • 然后我们发现需要手动释放一些资源,自己定义一个free函数,先释放解封装上下文,后续还需要释放什么资源自己添加到free函数里就可以了
  • 下面的小逻辑都在代码里以注释的形式表示了,不写了,太累了
  • 这里完了之后,其实就是把视频解码的功能封装好,供下面的读取线程调用,因为都写在子线程的run函数里太复杂了,所以这里单独处理视频解码
视频解码线程
  • 这里为什么需要有一个线程类呢,因为在qt设计中,窗口的控制和各种功能的后台实现应该是不同线程处理的,否则都给窗口线程处理,这个程序会变得异常卡顿
  • 直接创建一个readThread类继承自QThread类,这里基本是按照流程图调用视频解码的函数即可,并返回给窗口线程相应的值,下面要定义几个public的接口供窗口线程调用
  • 主要是处理重写run函数,在cpp文件中引入videoDocode,并实例化对象,调用视频解码功能
  • 先调用videoDocode的open函数,
  • 需要一个自定义信号playState来与窗口线程传递信息,处理播放状态
  • open成功后开始调用videoDocode的read函数
  • 还需要处理视频暂停pause的功能,这里需要先实现sleep延时操作
  • 视频解码是一个相对耗时的操作,不能影响窗口线程,因此解码线程应该是非阻塞延时
  • 成功open和read后,需要关闭线程close了
  • 下面我们来处理窗口线程

窗口线程

  • 在ui文件中绑定控件的槽函数
  • 通过将获取的文件路径显示在combox上,其他控件通过文本值调用,其实是不安全的
  • 页面的具体状态通过自定义的信号与槽与视频解码线程交互

基于FFmpeg和Qt实现简易视频播放器的更多相关文章

  1. C语言基于GTK+Libvlc实现的简易视频播放器

    小编心语:现下,各种视频播放软件层出不穷,竞争也越演越烈,不知道大家有木有这个想法,小编有时在想能不能做一款属于自己的视频播放器呢~小编特意去实验楼,整理出了这篇关于如何实现简易视频播放器的博文.简易 ...

  2. C语言基于GTK+Libvlc实现的简易视频播放器(二)

    简易视频播放器-全屏播放 一.课程说明 上一次我们使用gtk+libvlc实现了一个最简单的视频播放器,可以实现点击按钮暂定和停止播放视频,以及同步显 示视频播放进度,但即使作为一个视频播放器,只有这 ...

  3. 【Harmony OS】【ArkUI】ets开发 简易视频播放器

    ​前言:这一次我们来使用ets的Swiper组件.List组件和Video组件制作一个简易的视频播放器.本篇是以HarmonyOS官网的codelab简易视频播放器(eTS)为基础进行编写.本篇最主要 ...

  4. 简易视频播放器2 (基于Qt、opencv)

    因项目需要,需要实现一个对以保存的监测视频快速查看功能. 查询网上一些资料,初步简易的实现了一下. 实际效果图: 该程序基于Qt5.4,opencv248,开发环境为win8.1 结构为: video ...

  5. 基于FFmpeg和Qt的播放器 QtAV库

    http://blog.csdn.net/ibingow/article/details/8144795

  6. 痞子衡嵌入式:基于恩智浦i.MXRT1060的MP4视频播放器(RT-Mp4Player)设计

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是基于i.MXRT1062的MP4播放器参考设计. i.MXRT1062是恩智浦i.MXRT四位数系列的中端型号,外设搭配上很均衡,辅以6 ...

  7. FFMPEG学习----使用SDL构建视频播放器

    #include <stdio.h> #include <string.h> extern "C" { #include "libavcodec/ ...

  8. 100行代码实现最简单的基于FFMPEG+SDL的视频播放器(SDL1.x)【转】

    转自:http://blog.csdn.net/leixiaohua1020/article/details/8652605 版权声明:本文为博主原创文章,未经博主允许不得转载.   目录(?)[-] ...

  9. FFmpeg简易播放器的实现-视频播放

    本文为作者原创:https://www.cnblogs.com/leisure_chn/p/10047035.html,转载请注明出处 基于FFmpeg和SDL实现的简易视频播放器,主要分为读取视频文 ...

  10. FFmpeg简易播放器的实现-音视频播放

    本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10235926.html 基于FFmpeg和SDL实现的简易视频播放器,主要分为读取视频文 ...

随机推荐

  1. Cobalt Strike 4.0系列教程

    https://blog.csdn.net/weixin_45745344/article/details/109279097

  2. 二 APPIUM Android自动化 环境搭建(转)

    1.安装JAVA运行环境 2.安装Android开发环境 3.安装nodejs 下载地址:https://nodejs.org/en/ 下载完成之后双击安装. 4.安装APPIUM,Appium服务端 ...

  3. JVM常用运行时参数说明

    前言 仅列出常用JVM调优参数,更多请转文末的官方文档链接. 堆内存 -Xmx,设置最大堆内存,默认为物理内存的1/4.示例:-Xmx4096m,设置为4G -Xms,设置初始内存,默认为物理内存的1 ...

  4. 2023HWS_RE复现

    2023HWS_RE复现 参考wp:https://oacia.cc/hws-2023/ Android 参考这篇文章:https://www.52pojie.cn/thread-1680984-1- ...

  5. 国标GB28181视频平台EasyGBS视频监控平台无法播放,抓包返回ICMP排查过程

    国标GB28181视频平台EasyGBS是基于国标GB/T28181协议的行业内安防视频流媒体能力平台,可实现的视频功能包括:实时监控直播.录像.检索与回看.语音对讲.云存储.告警.平台级联等功能.国 ...

  6. 三维模型OSGB格式轻量化技术在大规模场景的加载和渲染的作用分析

    三维模型OSGB格式轻量化技术在大规模场景的加载和渲染的作用分析 在移动设备上,大规模场景的加载和渲染是一个不容忽视的问题.对于OSGB格式轻量化处理来说,大规模场景的加载和渲染也是其中一项重要的任务 ...

  7. 如何用PHP写接口

    当用PHP编写API接口时,可以使用PHP中的框架(如Laravel.Symfony.CodeIgniter等)来简化开发过程.接下来,以使用Laravel框架为例,提供一个简单的示例代码: 首先,确 ...

  8. 【matplotlib基础】--绘图配置

    Matplotlib 提供了大量配置参数,这些参数可以但不限于让我们从整体上调整通过 Matplotlib 绘制的图形样式,这里面的参数还有很多是功能性的,和其他工具结合时需要用的配置. 通过plt. ...

  9. 「codeforces - 1720」

    壹 最近 cq 情况很急急,昨天出去排核酸整了两个半小时,十分无语.提前放假自然是一大好事,但是一个人在家也蛮无聊.不要再涨体重了为好,这一年间他妈 delta 了 10 kilos,算了下 BMI ...

  10. 文心一言 VS 讯飞星火 VS chatgpt (104)-- 算法导论10.1 2题

    二.用go语言,说明如何在一个数组 A[1..n]中实现两个栈,使得当两个栈的元素个数之和不为 n 时,两者都不会发生上溢.要求 PUSH 和 POP 操作的运行时间为 O(1). 文心一言: 在这个 ...