![](https://img-blog.csdnimg.cn/direct/df2f1f99281744988c275dce5b6c010b.jpeg?x-oss-process=image/resize,m_fixed,h_224,w_224)
实战项目-视频播放器
文章平均质量分 83
Qt+ffmpeg+opengl实现视频播放器开发
从零实现一款视频播放器的开发工作。适合对音视频方向感兴趣以及想提升自己技术的同学。
ffmpeg实现视频的解码;
opengl实现视频的渲染;
Qt实现基础界面的开发;
软件打包发布;
ffmpeg常用操作;
软件移植;
灬Sunnnnn
不积跬步,无以至千里.不积小流,无以成江海
展开
-
Qt+FFmpeg+opengl从零制作视频播放器-1.项目介绍
学习音视频开发,首先从做一款播放器开始是比较合理的,每一章节,我都会将源码贴在最后,此专栏你将学习到以下内容:1)音视频的解封装、解码;2)Qt+opengl如何渲染视频;3)音视频同步,如何seek;4)学习FFmpeg常用接口;5)学习opengl的渲染原理;6)Qt界面开发以及样式表加载;7)网络视频流的加载;8)播放器跨平台移植;本项目使用Qt+ffmpeg+opengl实现视频播放器开发。适合对音视频方向感兴趣以及想提升自己技术的同学。ffmpeg实现音视频的解码;原创 2024-03-04 19:13:19 · 1211 阅读 · 0 评论 -
Qt+FFmpeg+opengl从零制作视频播放器-2.环境搭建
Qt5.9.0+VS2017+ffmpeg4.4.3,这里版本均使用64位版本。原创 2024-03-04 17:15:23 · 1100 阅读 · 0 评论 -
Qt+FFmpeg+opengl从零制作视频播放器-3.解封装
上述代码所示,通过循环调用av_read_frame()读取到pkt包,然后可以进行解码或者存储数据,如果读取的数据结束,则退出循环,开始指向结束操作。读取音视频流,采用av_read_frame来读取数据包,读出来的数据存储在AVPacket中,确定其为音频、视频、字幕数据,最后解码,或者存储。在使用FFmpeg API之前,需要先注册API,然后才能使用API。、MKV、MP4等文件解封装为视频H.264或H.265压缩数据,音频MP3或AAC的压缩数据,下图为常用的基本操作。原创 2024-03-13 19:42:00 · 657 阅读 · 1 评论 -
Qt+FFmpeg+opengl从零制作视频播放器-4.音频解码
音视频同步:使用命令`ffmpeg -i input.mp4 -ss 8 -t 2 -i input.aac -c copy -map 0:v:0 -map 1:a:0 output.mp4`来将视频和音频同步。首先一个完整的MP4文件解封装之后,得到了压缩的音频数据,这个数据是不能直接拿去播放的,我们需要解码成原始的PCM数据才能够播放,解码音频数据,如下图所示,把MP3或者AAC数据解码成原始的数据pcm。获取视频信息:`ffmpeg -i [输入文件名]`来获取视频的详细信息。配置解码器上下文参数。原创 2024-03-13 20:11:56 · 769 阅读 · 0 评论 -
Qt+FFmpeg+opengl从零制作视频播放器-5.音频播放
中,我们学到了如何将音频数据解码成pcm原始数据,并且保存到本地,最后使用工具来播放pcm音频文件。QAudioFormat可以设置参数,采样率、采样大小、通道数等,接口如下所示,很好理解。构造函数:构造一个新的音频输出并将其附加到父级。默认的音频输出设备与输出格式参数一起使用。开始:返回一个指向用于将数据传输到系统音频输出的内部QIODevice的指针。ffmpeg实现重采样代码,如下所示,初始化重采样上下文。停止处理音频数据,保留缓冲的音频数据。suspend()后继续处理音频数据。原创 2024-03-13 20:18:42 · 329 阅读 · 0 评论 -
Qt+FFmpeg+opengl从零制作视频播放器-6.视频解码
首先一个完整的MP4文件解封装之后,得到了压缩的视频数据H.264、H.265等,这个数据是不能直接拿去播放的,我们需要解码成原始的YUV等数据才能够播放,解码视频数据,如下图所示,把H264或者H265数据解码成原始的数据YUV等数据。在FFmpeg中,AVFrame是一个非常核心的数据结构,它封装了解码后的媒体数据。视频解码是将压缩的视频数据流转换成一系列可显示的图像帧(通常是YUV或RGB格式)的过程。ffmpeg解码视频的数据步骤:首先前面的解封装步骤不能少,这和解码音频很像。原创 2024-03-13 20:26:12 · 592 阅读 · 0 评论 -
Qt+FFmpeg+opengl从零制作视频播放器-7.OpenGL播放视频
除了可以选择使用QPainter和标准的OpenGL渲染图形,QOpenGLWidget类提供了在Qt应用程序中显示OpenGL图形的功能。中,我们学到了如何将视频数据解码成YUV原始数据,并且保存到本地,最后使用工具来播放YUV文件。opengl完全没有基础的同学,请先学习以下的几篇文章,我们只需要了解2D图像如何渲染就行。然后是解码线程实现,有两个重要的回调函数,一个回调每一帧视频数据,一个是回调视频的宽和高。新建widget,拖放QOpenGLWidget,然后提升为上面的类。原创 2024-03-13 20:32:20 · 1285 阅读 · 0 评论 -
Qt+FFmpeg+opengl从零制作视频播放器-8.C++类封装、简介
在前面的几节中,我们学习了如何解封装、音频的解码、音频的播放、视频的解码、视频的渲染以及ffmpeg很多相关的操作,还有一些方便我们查看yuv、pcm的工具,QOpenGLWidget的使用。但是这些都是单独章节讲的,本章将使用C++类封装,将前面讲解的内容进行类的封装。以下展示一些源码:接受WCtrlBarWidget的信号以及处理,主要是最上面的控制栏,控制窗口大小、关闭。右侧播放列表,显示当前播放的视频列表。中间这块就是视频显示区域,使用。然后是打开视频播放,设置回调。面向对象语言的特性主要包括。原创 2024-03-13 21:12:18 · 514 阅读 · 0 评论 -
Qt+FFmpeg+opengl从零制作视频播放器-9.解封装类实现
通过 AVFormatContext 结构体中的 streams 字段,可以遍历所有的流,并根据流的类型(音频、视频等)进行相应的处理。因为我们这个是多线程开发,解封装、音频解码、视频解码都需要在单独的线程跑,所以WDemuxThread封装了单独解封装的线程。这个函数返回一个 AVFormatContext 结构体的指针,该结构体包含了媒体文件的相关信息。打开视频的时候,设置了几个回调,视频数据的回调,视频的宽高,当前的播放时间用于显示当前的进度。:最后,清理 FFmpeg 库,释放所有分配的资源。原创 2024-03-13 21:19:15 · 407 阅读 · 0 评论 -
Qt+FFmpeg+opengl从零制作视频播放器-10.解码类实现
这个类有WDecode对象。WDecodeThread基类主要工作就是将解码前的数据保存到队列中,送入到解码器进行解码。然后音频和视频各处理各的,音频处理线程继承自WDecodeThread,实现了打开、关闭、设置暂停、清空等接口。WDecode类提供了以下接口:打开解码器、关闭、发送数据到解码器、获取解码器解码后的数据、清空等接口。视频处理线程继承自WDecodeThread,实现了打开、关闭、设置暂停、设置同步等接口。因为我们这个是多线程开发,解封装、音频解码、视频解码都需要在单独的线程跑,所以。原创 2024-03-13 21:20:57 · 279 阅读 · 0 评论 -
Qt+FFmpeg+opengl从零制作视频播放器-11.界面设计
我使用的是QMainWindow,因此包含了菜单栏、工具栏、状态栏,如下图所示,不需要的部分我们可以进行隐藏。动画效果:QPropertyAnimation类提供动画支持,改变geometry属性。,自定义的QPushButton类,提升为WImageButton。这个时候使用鼠标按住主界面是没有办法移动的,所以需要重写鼠标事件。鼠标移动的时候根据上、下、左、右的方向,进行整个窗口的移动。最后安装事件过滤器:通过鼠标进入和离开事件,触发动画效果。项目界面由Qt进行设计,界面主要由以下几个部分组成。原创 2024-03-13 21:24:37 · 277 阅读 · 0 评论 -
Qt+FFmpeg+opengl从零制作视频播放器-12.界面美化
使用分隔线和间距:在控件之间添加分隔线(QFrame)和调整间距(通过setSpacing和setContentsMargin方法),可以使界面看起来更加整洁和有条理。使用动画和过渡效果:Qt提供了QPropertyAnimation和QTransition类,可以用来为控件添加动画和过渡效果,使界面更加生动和有趣。使用图标和图片:在按钮、菜单项等控件上添加图标或图片,可以使界面更加直观和美观。使用自定义控件:如果Qt自带的控件无法满足你的需求,你可以创建自定义控件,以便实现特定的外观和功能。原创 2024-03-13 22:48:30 · 571 阅读 · 0 评论 -
Qt+FFmpeg+opengl从零制作视频播放器-13.打包为exe包发布软件
执行命令 ,直接先拖动windeployqt.exe到cmd中,然后再拖动VideoPlayer.exe到cmd中。然后将ffmpeg的动态库拷贝到上面这个路径下,双击程序可执行不缺少库,准备工作就已经完成了。我使用的编译器是msvc64位的编译器,所以可执行程序的使用的库也是msvc64的库。然后在卸载的脚本地方改一下,不然卸载程序,不会完全卸载。程序打包完成后,双击程序可能会找不到库的情况,如下。填写名称,版本号,其他的就不用填了,点击下一步。好了,添加好上面的语句之后,可以开始编译脚本了。原创 2024-03-13 21:37:08 · 339 阅读 · 0 评论 -
Qt+FFmpeg+opengl从零制作视频播放器-14.程序Ubuntu移植
首先查看的是Linux系统的版本,我使用的是Ubuntu20.04.6LTS版本。回想一下,在之前的程序,我们都是在Windows上开发,仅仅使用Qt和ffmpeg,这里下载的是5.12.12版本,双击运行,然后安装好Qt。我按照上面的教程,已经整理好了编译所需要的脚本。去Qt官网下载Qt 的版本。完整的库地址目录和脚本目录。最后生成的库路径如下图所示。原创 2024-03-13 21:54:46 · 177 阅读 · 0 评论 -
Qt+FFmpeg+opengl从零制作视频播放器-15.音视频一些知识
本专栏只针对视频压缩数据为H.264的数据进行演示。H264解码后的原始数据主要包括。原始视频数据会被压缩成I帧、P帧和B帧三种不同类型的视频帧。I帧是关键帧,包含完整的画面信息,而P帧和B帧则分别参考前后的I帧或P帧,记录与前后帧的差异信息。解码的时间戳。显示的时间戳。对于音频来说,DTS和PTS是相同的;对于视频来说,考虑到 I帧、B帧、P帧,所以一般不同。GOP:两个I帧之间的一组图片,由一个I帧和多个B/P帧组成,是编解码器存取的基本单位。原创 2024-03-13 22:00:12 · 380 阅读 · 0 评论 -
M3U8 文件格式简介
HLS协议HLS是一个由苹果公司提出的基于 HTTP的流媒体网络传输协议,传输内容包括两部分,一是M3U8描述文件,二是TS媒体文件。工作原理:整个流分成一个个小的基于 HTTP的ts格式文件来下载,每次只下载一些。当媒体流正在播放时,客户端可以选择从许多不同的备用源中以不同的速率下载同样的资源,允许流媒体会话适应不同的数据速率。在开始一个流媒体会话时,客户端会下载一个包含元数据的 extended M3U (m3u8) playlist文件,用于寻找可用的媒体流。HLS 只请求基本的 HTTP..原创 2021-04-28 18:27:09 · 33867 阅读 · 0 评论 -
H.264简介
一.基础概念I帧:帧内编码帧(intra picture),采用帧内压缩去掉空间冗余信息。P帧:前向预测编码帧(predictive-frame),通过将图像序列中前面已经编码帧的时间冗余信息来压缩传输数据量的编码图像。参考前面的I帧或者P帧。B帧:双向预测内插编码帧(bi-directional interpolated prediction frame),既考虑源图像序列前面的...原创 2019-12-19 19:34:49 · 6022 阅读 · 1 评论 -
MP4文件简介
首先了解以下几个概念:下图为主要的box:MP4infoMP4info-C++文档类资源-CSDN下载MP4info更多下载资源、学习资料请访问CSDN下载频道.https://download.csdn.net/download/wzz953200463/86033110使用MP4info工具打开任意一个MP4文件,如下图所示。3.1moov容器至少包含以下3种中的一种:也可以包含其他容器信息,例如:一个或几个trakAtom(trak)、User Data Atom(udta)等。trak中定义了媒体文原创 2022-07-11 23:24:32 · 3945 阅读 · 0 评论 -
FLV文件简介
FLV是Adobe发布的一种可以作为直播也可以作为点播的封装格式,格式非常简单,均以FLVTAG的形式存在,并且每一个TAG都是独立存在的。2.1FLV文件头以下是我打开一个FLV文件,查看16进制数据。 从上图中分析可知:2.2FLV文件内容格式FLV文件内容如下所示:表中可以看见FLV文件内容格式主要是FLVTAG,FLVTAG分为两部分TAGHeader+TAGBody。如下图所示,我展示了一个音频的TAG,可以看见header为11字节 body 为4字节,紧接着跟了一个4字节大小的 “上一个TAG原创 2022-07-27 20:54:10 · 916 阅读 · 0 评论 -
FFmpeg 音视频转封装(MP4与FLV互转,流数据转FLV、MP4)
音视频文件转封装操作就是把一种格式转换为另外一种格式,例如从flv转到MP4,或者把流地址数据转换为MP4。本文主要讲解流地址数据转为flv文件。原创 2022-07-14 22:24:28 · 2248 阅读 · 0 评论 -
FFmpeg 音视频截取
在日常处理视频文件时常常会用到视频片段的截取功能,FFmpeg支持该功能,拥有视频的起始时间定位以及截取视频长度的接口av_seek_frame。原创 2022-07-18 19:42:39 · 908 阅读 · 0 评论 -
FFmpeg 音频编码
编码音频数据,把pcm原始数据编码为MP3或者AAC。原创 2022-07-21 21:04:54 · 1935 阅读 · 0 评论 -
FFmpeg 视频编码
编码视频数据,如下图所示,将原始的YUV数据编码为H.264或者H.265。原创 2022-07-25 18:55:37 · 1889 阅读 · 1 评论