C+ ffmpeg视频播放器开发
文章平均质量分 73
该专栏讲解基于ffmpeg的视频播放器开发,首先介绍ffmpeg,然后编译分析ffplay源码,从ffplay入手, 开发基于C++ ffmpeg的视频播放器,解封装,像素转换,音视频同步,音量调节,rtmp拉流播放等, 提供播放器Qt和MFC的实现方式, 有完整源码。
优惠券已抵扣
余额抵扣
还需支付
¥99.90
¥299.90
购买须知?
本专栏为图文内容,最终完结不会低于15篇文章。
订阅专栏,享有专栏所有文章阅读权限。
本专栏为虚拟商品,基于网络商品和虚拟商品的性质和特征,专栏一经购买无正当理由不予退款,不支持升级,敬请谅解。
令狐掌门
C++程序员,出版过《C++零基础入门视频教程》、《Qt高级进阶视频教程》、《OBS源码分析与桌面录制视频教程》、《PyQt PySide6零基础入门与项目实战》。
展开
-
ffmpeg视频播放器专栏阅读说明
专栏内容说明 学习音视频开发,从做播放器的开发入手是比较合理的,了解音视频的各种参数,界面与音视频数据的交互,如何显示视频画面,系统如何播放音频,本专栏将给你答案。 本专栏主要介绍C++ ffmpeg视频播放器开发,主要讲解如下内容:(1)视频的解封装,解码,像素转换,如何在Qt, MFC的界面上显示,网络流显示等;(2)Qt控件显示视频的方法,MFC控件显示视频的方法(3)音视频同步(4)SDL知识,窗口创建,纹理显示,音频重采样等(5)ffmpeg的常用API讲解与应用(6)ffpl原创 2021-07-31 21:26:23 · 797 阅读 · 0 评论 -
C++ Qt高仿QQ影音视频播放器 (三)
Qt高仿QQ影音视频播放器原创 2022-01-09 22:36:30 · 1685 阅读 · 1 评论 -
C++ Qt高仿QQ影音视频播放器 (二)
C++ Qt高仿QQ影音视频播放器原创 2022-01-09 21:47:45 · 1449 阅读 · 0 评论 -
C++ Qt高仿QQ影音视频播放器 (一)
C++ Qt高仿QQ影音视频播放器原创 2022-01-09 21:03:07 · 2164 阅读 · 1 评论 -
音视频开发基础(1):模拟视频技术简介
模拟视频技术是指用模拟技术对动态影像进行捕捉、记来、处理、存储、传输、复现的技术.模拟视频技术的发明、发展与模拟电视系统的发展密不可分.下面将通过模拟电视系统来介绍模拟视频技术中的基本概念. 首先,人的视觉系统的特征为电视等視稿系铳的发明、发展提供了理论依据.光线通过角膜、腫孔、晶状体的折射光线.透过玻璃体到达视网展.视网膜上分布着光感受器,光感受器在光线的剌激下...原创 2019-12-16 00:44:47 · 1168 阅读 · 0 评论 -
音视频开发基础(2):数字视频技术简介
数字视频技术是指以数字形式捕捉、记录、处理、存储、传输、复现动态彩像的一系列相关技术。例如通过数字摄像机直接产生数字视频信号,压缩成MPEG-2格式存储在视频数据库。在被检索到后通过因特网传输到远端的PC,并在播放器上播放岀来。数字视频技术的发展与数字电視系统密不可分。这里以数字电视系統来讲解数字视频的特点。数字电视系統是将模拟的电视值号变换为数字形式的信号,然后进行处理、传输、播放...原创 2019-12-16 23:08:09 · 2657 阅读 · 0 评论 -
音视频开发基础(3):什么是视频编解码
视频编解码技术是指对视频进行压缩、解压缩的技术。在日常生活中,视頻编解码技术应用非常广泛。例如十几年前在DVD(MPEG・2)、VCD(MPEG-1)、高清电视以及现在的互底网上都有大量的应用。 视频信号数字化之后会产生十分庞大的数据量,需要大量的磁盘空间。一帧没有压缩的PAL制电视画面包含442368个像素。转换成数字视频后,毎个像素必须由3字节即24位信息表示R...原创 2019-12-20 23:35:13 · 1261 阅读 · 0 评论 -
音视频开发基础(4):常见的视频编解码标准
随着数字视频编解码业务迅猛发展,为了保证不同厂家视频编解码产品之间的相互操作性. 視频编解码技术的标准化问题显得日益重要,各大国际组织在数字视频编解码标准化方面展开了许多工作并制定了一系列视频编解码保准。其中,国际电信联盟ITU - T下的视頻编码专家组VCEG( Video Coding Expert Group)与国际标准化组织ISO/IEC下的运动图像专家组MPEG(Motio...原创 2019-12-21 00:55:19 · 1720 阅读 · 0 评论 -
H.264标准简介
H.264/AVC是由国际电信联盟标准化组织(ITU-T)的视频图像专家组(VCEG)和国际标准化组织(ISO/IEC )的运动图像专家组(MPEG )共同组成的联合视频組(JVT)所开发的最新的视频编码标准,被称作ISO/IEC14496-10或MPEG-4/AVC.联合视频组JVT早期开发的MPEG -2/H. 262视频编码标准已经成为目前广泛使用的DVD数据编码技术;最...原创 2019-12-21 00:58:07 · 742 阅读 · 1 评论 -
视频技术与H264编码的诞生
视频技术是指将动态影像以电信号的方式加以捕捉、记录、处理、存储、传输、复现相关的一系列技术。视频技术最早出现在早期的模拟电视系统中。视频技术编年史 19世纪末,先驱者们开始研究传送图像的技术。 1904年,英国人贝尔威尔和德国人柯隆发明了一次电传一张照片的电视技术,每传一张照片需妾10 分钟. 1924年,英国和德国科學家几...原创 2019-12-15 23:29:07 · 599 阅读 · 0 评论 -
h264格式说明与分析
H264是一种视频编码标准,用ffmpeg工具可以将MP4视频转码为h264,例如下面的命令:ffmpeg -i 1.mp4 -c:v copy -bsf:v h264_mp4toannexb -an out.h264 h264的功能分为两层,视频编码层(VCL)和网络提取层(NAL), 我们常关注网络提取层(NAL),H264在网...原创 2020-05-03 22:49:47 · 877 阅读 · 0 评论 -
FFmpeg简介与源码编译
一 FFmpeg是什么 FFmpeg诞生于十几年前,最初是作为一个MPlayer播放器的一个子项目出现。因为当时的播放器有需要支持各种各样解码的需求, 其中有一位Mplayer的开发者看到了这样的需求,于是编写了FFmpeg。 2000年,法国天才程序员Fabrice Bell开发了初版; 2004年,Michael Niederm...原创 2019-11-18 18:34:32 · 981 阅读 · 0 评论 -
VS2019编译ffplay源码
ffplay的源码不太多,3000多行,有时间的话,可以看看。 我选择的版本是ffmpeg4.2.1-win64。 ffmpeg源码的fftools目录是ffmpeg, ffplay, ffprobe这3个exe文件的源码,用VS2019新建windows控制台程序,把ffplay.c添加到程序目录,如下图: 一堆报错,不要慌,一个个的解决,(...原创 2020-03-03 14:26:20 · 2054 阅读 · 5 评论 -
ffplay源码分析(一):代码架构简述
ffplay是用ffmpeg代码实现的一个播放器,可以播放本地文件,也可以播放网络资源,与vlc播放器功能类似。把ffmpeg环境配好后,在资源所在的目录,打开控制台输入ffplay [资源名字]即可播放该媒体资源,ffplay源码只有3800多行,C工程,音视频显示渲染是用的SDL库。下载ffmpeg源码后,找到ffplay.c,这既是ffplay播放器的全部代码。我用的是ffm...原创 2019-12-08 15:14:35 · 1895 阅读 · 1 评论 -
ffplay源码分析(二):main函数与音视频解码线程
在看本篇博客之前,希望你能把前面的SDL的博客先熟悉一下,因为ffplay的代码用到了大量SDL的知识,SDL初始化,窗口创建,渲染器创建,文件创建,多线程,纹理渲染,事件等。main函数介绍ffplay的main函数主要主要涉及到SDL窗口创建,ffmpeg打开文件,SDL事件循环这三部分内容。SDL 初始化,窗口创建SDL的初始化:flags = SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER;if (SDL_Init (flags)) {原创 2021-08-09 23:28:15 · 251 阅读 · 0 评论 -
ffplay源码分析(三):ffplay PacketQueue分析
在上一篇介绍了ffplay的main函数与三个主要线程的创建,这一篇主要介绍ffplay的帧队列。ffplay用PacketQueue保存解封装后的数据,即保存AVPacket,PacketQueue的第一个参数是结构体MyAVPacketList,如下:typedef struct MyAVPacketList { AVPacket pkt; struct MyAVPacketList *next; int serial;} MyAVPacketList;MyAVPacketLis原创 2021-08-10 00:09:01 · 334 阅读 · 0 评论 -
ffplay源码分析(四):FrameQueue
在上一篇介绍了解封装后解码前的队列PacketQueue,本篇分析解码后的数据队列FrameQueue,该队列的第一个成员是Frame, 声明如下:/* Common struct for handling all types of decoded data and allocated render buffers. */typedef struct Frame { AVFrame *frame; //音频或视频的解码数据 AVSubtitle sub; //字幕数据 int原创 2021-08-11 23:09:24 · 293 阅读 · 0 评论 -
ffplay源码分析(五):解码线程
在ffplay第二篇介绍了read_thread的stream_component_open里又创建了3个线程,分别进行视频、音频、字幕解码。来看看decoder_start的实现,第二个参数fn是函数指针,传给SDL_CreateThread做线程运行的函数。static int decoder_start(Decoder *d, int (*fn)(void *), const char *thread_name, void* arg){ packet_queue_start(d->原创 2021-08-12 00:02:55 · 217 阅读 · 0 评论 -
ffplay源码分析(六):ffplay 视频帧显示逻辑分析
ffplay的视频显示入口是在main函数的最后面:在event_loop函数中处理显示/* handle an event sent by the GUI */static void event_loop(VideoState *cur_stream){ SDL_Event event; double incr, pos, frac; for (;;) { double x; //视频显示刷新 refresh_loop_原创 2021-08-12 00:19:36 · 233 阅读 · 0 评论 -
ffplay 源码分析(七):音频播放线程分析
音频播放是一个被动的过程,声卡设备主动向程序要数据,而不是程序主动发数据到声卡。在ffmpeg解码一个AVPacket的音频到AVFrame后,在AVFrame中存储的音频数据大小与SDL回调所需要的数据大概率是不相等的,这就需要再增加一级缓冲区解决问题。在audio输出时,主要模型如下图:在这个模型中,sdl通过sdl_audio_callback函数向ffplay要音频数据,ffplay将sampq中的数据通过audio_decode_frame函数取出,放入is->audio_buf,然后原创 2021-08-12 00:23:49 · 333 阅读 · 0 评论 -
ffplay源码分析(八):视频字幕显示
ffplay里subtitle的显示比较简单,它是将subtitle当作video的附属进行显示,所以subtitle实际上没有独立的显示线程,它是和video的显示线程(主线程)共用一个线程。看过ffplay video显示线程分析的应该会有印象,在video显示线程中有看到关于subtitle的显示处理。先从video_refresh函数看起:static void video_refresh(void *opaque, double *remaining_time){ //……这里省略的原创 2021-08-12 00:25:19 · 353 阅读 · 0 评论 -
ffplay源码分析(九):音视频同步基本原理介绍与更深层次原因分析
由于音频和视频的输出不在同一个线程,而且,也不一定会同时解出同一个pts的音频帧和视频帧。更有甚者,编码或封装的时候可能pts还是不连续的,或有个别错误的。因此,在进行音频和视频的播放时,需要对音频和视频的播放速度、播放时刻进行控制,以实现音频和视频保持同步,即所谓的音视频同步。在ffplay中,音频(audio)和视频(video)有各自的输出线程,其中音频的输出线程是sdl的音频输出回调线程,video的输出线程是程序的主线程。(参考:https://zhuanlan.zhihu.com/p/4413原创 2021-08-12 00:26:56 · 277 阅读 · 0 评论 -
ffplay源码分析(十):视频同步音频的代码实现(也是最不好理解的地方)
ffplay默认也是采用的这种同步策略。主流程ffplay中将视频同步到音频的主要方案是,如果视频播放过快,则重复播放上一帧,以等待音频;如果视频播放过慢,则丢帧追赶音频。这一部分的逻辑实现在视频输出函数video_refresh中,分析代码前,我们先来回顾下这个函数的流程图:在这个流程中,“计算上一帧显示时长”这一步骤至关重要。先来看下代码:static void video_refresh(void *opaque, double *remaining_time){ //……原创 2021-08-12 00:28:16 · 359 阅读 · 0 评论 -
ffplay源码分析(十一):音频同步视频
在“视频同步音频”的策略中,我们是通过丢帧或重复显示的方法来达到追赶或等待音频时钟的目的,但在“音频同步视频”时,却不能这样简单处理。在音频输出时,最小单位是“样本”。音频一般以数字采样值保存,一般常用的采样频率有44.1K,48K等,也就是每秒钟有44100或48000个样本。视频输出中与“样本”概念最为接近的画面帧,如一个24fps(frame per second)的视频,一秒钟有24个画面输出,这里的一个画面和音频中的一个样本是等效的。可以想见,如果对音频使用一样的丢帧(丢样本)和重复显示方案,是原创 2021-08-12 00:29:25 · 213 阅读 · 0 评论 -
ffplay源码分析(十二):同步到外部时钟
前面我们分析了音视频同步中的两种策略:视频同步到音频,以及音频同步到视频。接下来要分析的是第三种,音频和视频都同步到外部时钟。回顾先回顾下前面两种同步策略。视频同步到音频主要由函数compute_target_delay计算出lastvp应显示时长,并通过frame_timer对比系统时间控制输出,最后在video_refresh中更新了video clock(vidclk)。static double compute_target_delay(double delay, VideoState *i原创 2021-08-12 00:30:43 · 363 阅读 · 0 评论 -
ffplay源码分析(十三):ffplay的播放控制事件
ffplay的键盘事件,这段代码,相对于前面的代码来说,很简单。ffplay在播放视频时,可以通过键盘进行视频的控制,代码如下:switch (event.type) { case SDL_KEYDOWN: if (exit_on_keydown || event.key.keysym.sym == SDLK_ESCAPE || event.key.keysym.sym == SDLK_q) { do_exit(cur_stream); break; } /原创 2021-08-14 01:27:15 · 269 阅读 · 0 评论 -
SDL开发(1):C++ SDL开发环境配置
SDL官网:http://www.libsdl.org/ 本文是在VS2017下使用SDL, 先进官网下载SDL库,我下的是SDL2, 项目配置和其它SDK类似,.h .lib .dll这些在属性中配置好后,就可以写代码了,注意 (1)main函数必须又有参数 (2)导入SDL2main.lib 虽然是C语言写的...原创 2019-12-08 19:36:30 · 1477 阅读 · 0 评论 -
SDL开发(2):SDL窗口创建与显示与事件处理
SDL创建窗口有相应的步骤,如下(1)调用SDL_CreateWindow,(2)创建渲染器SDL_CreateRenderer,(3)显示,调用SDL_RenderPresent,在显示前最好清空之前的显示,调用SDL_RenderClear, 根据上述步骤,编写SDL窗口代码,如下:#include <iostream>#include "SDL.h"using namespace std;int main(int argc, cha...原创 2020-10-11 20:08:55 · 1828 阅读 · 0 评论 -
SDL开发(3):SDL文理渲染流程
ffplay的视频解封装和解码像素转换用的是ffmpeg, 视频显示、音频重采样用的是SDL,为了更好的了解ffplay的源码,有必要对SDL的纹理渲染做个介绍。SDL 纹理相关的API创建纹理 SDL_CreateTexture声明如下extern DECLSPEC SDL_Texture * SDLCALL SDL_CreateTexture(SDL_Renderer * renderer,原创 2021-07-27 19:36:39 · 350 阅读 · 0 评论 -
SDL学习(4):SDL显示视频yuv数据
ffplay的代码挺复杂的,我们要把各个功能拆开进行解读,这篇博客介绍如何用SDL显示视频的yuv的数据。首先我们用ffmpeg命令行获取视频的yuv420数据:ffmpeg -i 1.mp4 -s 640x360 -pix_fmt yuv420p 1.yuv上面的命令是将1.MP4转换成了1.yuv, 格式是420. yuv数据获取后可以用ffplay进行播放,命令如下:ffplay -f rawvideo -video_size 640x360 -i 1.yuvSDL播放yuv, 本质上是原创 2021-07-27 19:53:19 · 656 阅读 · 0 评论 -
SDL学习(5):SDL音频重采样
SDL支持对音频的重采样,Qt也有这功能,下面介绍SDL的音频处理相关的API.(1) 打开音频设备 SDL_OpenAudioSDL在播放音频前需要打开音频设备,函数声明如下:extern DECLSPEC int SDLCALL SDL_OpenAudio(SDL_AudioSpec * desired, SDL_AudioSpec * obtained);根据它的注释可知,这个函数打开带有所需参数的音频设备如原创 2021-07-27 20:05:27 · 562 阅读 · 0 评论 -
C++ ffmpeg开发环境配置
本篇记录ffmpeg C++开发环境配置,我的环境:win10-64 ,VS2015,FFmpeg_4.2.1_win64 需要ffmpeg 4.2.1 win64开发包的可以去【ffmpeg官网】下载,或者点击点击如下百度网盘链接下载. 链接:https://pan.baidu.com/s/1YXmkHoBp-JYMln7aSQrgs...原创 2020-02-28 13:09:32 · 2389 阅读 · 0 评论 -
MFC SDL FFmpeg视频播放器开发教程(一)
在看本篇博客之前,希望你有如下知识背景:(1)SDL的基础,知道如何搭建SDL开发环境,了解SDL窗口的创建,纹理渲染等知识;(2)熟悉MFC开发,了解windows消息机制本篇博客开始介绍基于MFC SDL FFmpeg的视频播放器开发过程,MFC是一门老手艺,在Qt不是很流行的时候,爱奇艺,腾讯视频等都是基于Win32、MFC、DirectUI技术写的。基本开发步骤:(1)用vs2019创建MFC Dialog工程,设计如下界面中间视频显示用的是picture control.(2)导入原创 2021-07-31 20:24:47 · 810 阅读 · 1 评论 -
MFC SDL FFmpeg视频播放器开发教程(二)
在前一篇博客介绍了MFC视频播放器的基本开发过程,本篇继续。MFC SDL FFmpeg视频播放器开发教程(一)视频seek功能的实现如果不熟悉MFC开发,可能会比较难理解,在界面上我用的是slider control,使用方法类似于Qt, 当拖动进度条时,Qt的处理是响应相应的信号,MFC则是相应相应的消息,如果不会用类向导添加消息处理函数,则直接用代码吧添加slider水平拖动消息响应函数先在xxxdlg里面添加声明:afx_msg void OnHScroll(UINT nSBCode,原创 2021-07-31 21:02:08 · 426 阅读 · 2 评论 -
Qt FFmpeg视频播放器开发(一):FFmpeg简介与项目环境搭建
前言 在各大博客,论坛,看到很多人对流媒体音视频的开发感兴趣,可是不知道怎么入门,对音视频的了解也很少,写代码更不用说了,经过一段时间的整理,我准备在csdn上写一套ffmpeg音视频播放器的开发教程,希望对想从事ffmpeg音视频领域的同学给与帮助,有什么疑问可以在博客下留言,我会及时回复。希望看完的同学,对你们有所帮助。 视频开发库有很多,例如微软的Direct...原创 2018-06-03 01:09:17 · 34976 阅读 · 4 评论 -
Qt FFmpeg视频播放器开发(二):FFmepg基本使用与视频播放
本篇博客目标:读帧解码显示视频 开始进入ffmepg的开发之旅。音视频的细节知识不统一讲解,我在教程中逐点渗透,容我以雷神的话开篇。 视频播放器播放一个互联网上的视频文件,需要经过以下几个步骤:解协议,解封装,解码视音频,视音频同步。如果播放本地文件则不需要解协议,为以下几个步骤:解封装,解码视音频,视音频同步。 ...原创 2018-06-03 20:35:47 · 23695 阅读 · 14 评论 -
Qt FFmpeg视频播放器开发(三):音频解码播放
本篇开始讲解音频解码播放,该项目用Qt的音频类QAudioFormat, QAudioOutput等进行解码,先讲解一些关于音频的知识。1.采样频率 指每秒钟取得声音样本的次数。采样的过程就是抽取某点的频率值,很显然,在一秒中内抽取的点越多,获取得频率信息更丰富,为了复原波形,采样频率越高,声音的质量也就越好,声音的还原也就越真实,但同时它占的资源比较多。由于人耳的分辨率很有限,太...原创 2018-06-09 18:51:53 · 6069 阅读 · 5 评论 -
Qt FFmpeg视频播放器开发(四):音视频同步
之前的3篇博客,实现了视频音频解码读帧,并同步播放,这篇讲将实现视频进度条的功能,实现拖动播放。还是使用教程【3】的代码,需要前3篇教程的,请点击以下链接: 基于FFmpeg的视频播放器开发系列教程(三) 基于FFmpeg的视频播放器开发系列教程(二) 基于FFmpeg的视频播放器开发系列教程(一) 先在Qt Des...原创 2019-01-14 23:24:19 · 4234 阅读 · 8 评论 -
Qt FFmpeg视频播放器开发(五):界面优化
最近又把这项目整了整,做了一些优化,增加了一些功能。例如: (1)界面用qss做了优化,实现暗黑效果; (2)添加了菜单,按钮添加了图标,窗口大小自适应大小等; (3)最大化按钮 (4)增加了音量调整功能 (5)增加了网络拉流功能 主界面 ...原创 2020-01-01 03:16:10 · 2178 阅读 · 0 评论 -
Qt FFmpeg视频播放器开发(六):FFmpeg视频音量调节
在声音物理学中,音量的变化是对数关系,在代码里,暂时我没有这样处理,简单的用线性关系表示,在主进程进行设置,解码时设置进pcm数据,再用声卡播放。 这段代码的实现也是参考了别人的,代码如下:/** @Func : SetVolume* @brief : 音量调节* @author : linghuzhangmen* @[in] : buf 为需...原创 2020-01-01 03:51:30 · 1879 阅读 · 0 评论