C++基于ffmpeg和QT开发播放器

B站网址

https://www.bilibili.com/video/BV1h44y1t7D8?p=2&spm_id_from=pageDriver
http://www.ffmpeg.club/qt_download.html

封装格式和编码格式

格式头:使用什么压缩方式,帧率是多少,音频采用什么压缩方式,视频采用什么压缩方式,对应关键帧的索引,并不是所有视频都有,如没有关键帧索引的,在seek时就会很慢。
视频帧和音频帧交叉出现,但不太可能完全一对一。如视频帧1秒25帧,但音频很难做到的。音频是根据采样率定的,比如44100。对应1秒钟视频就不好算,一般是一秒22.5帧。

YUV转换成RGB数据量是非常大的,200万像素,一个像素RGB是3个字节,一幅画面有6M,一秒钟有10幅画面就60M,
一秒钟有20幅画面就120M,一分钟就几个G了。所以大家要注意,如果把这部分RGB的做缓冲,一定要考虑好,数据量非常大。不像我们做视频帧。视频帧是很小的,如一副画面有6M,经过压缩后可能只有10k。能压到1%,甚至0.5%。可以选择压缩率,甚至效果还不差。
YUV的复制和缓冲开销都不用考虑,但RGB的复制和缓冲一定要考虑。YUV可以采用软解压,也可以采用硬解压,目前主流CPU的解码应该是比硬解码比较强的,这个是做过测试的。现在如8核的CPU解码非常快,但是耗电量非常大,CPU会一直很热,好处是兼容性很强。目前更多的还是基于软解码,将来可能更多的还是基于硬解码,因为硬解码快,可能1秒可以解压100帧多。硬解码是很快的,一般是我们写好的程序,烧录在CPU上或者显卡上的。对应ARM来说,直接就是硬件电路,这部分解码时间可以忽略不计的。但也有问题,它是固话在硬件中的,无法做优化。它解码的性能是固定好的。

像素格式


显卡的解码并不比我们的CPU强

注意这里有个坑,col3后面有时会补齐格式,会增加几个,为提升计算效率,这样在像素复制时,必须跳过这些,否则就出错了。知道了一般拷贝你就要8的倍数。如1024。不要一个一个拷贝,一块进行拷贝这样效率高。

很多人有错误的认识,认为软解码慢,那是嵌入式,它确是慢。比如DSP芯片,它的软解码就慢,它单核主频才1G,但现在的主流CPU多核,8核2.0G的,很多情况下比硬解码快。它的软解码的性能和兼容性都是强于硬解码的,而硬解码是固定的,比如它就只能60帧/s,硬解码的好处是它无需解码指令的转换,那CPU的开销就小,它直接就是电路。如CPU做先要把指令转换为电路,然后在进行运算。硬解码直接把电路跑通就行了,所以它的热功耗会非常小,省电。

YUV


YUV可以多种存储方式,而RGB一般一种存储方式。
YUV4:4:4 YUV类似RGB,转换简单
YUV4:2:2,第一个还是YUV,但第二个UV共用前一个的Y
YUV4:2:0,我们日常都采用这个格式,它不是连续4个,而是上下,为什么呢,因为图像周边色度是相似的,所以它采用2*2,然后共用一个UY,这样可以看出它占用的存储空间是最小的,占12b。
YUVP,先连续存Y,再连续存UV,这我们需要关注什么?之前方式只需一个数组,而这个需要两个数组,一个存Y,一个存UV

PCM音频参数


采样率 44100什么意思?就是每秒钟采样44100次。那可以知道,采样率越大,听到的声音越真实,采样率越小,听到的声音越假。
那双声道,就是左右声道,更类似我们人类听,现在话筒都支持两个采样点,那信息量又翻一倍。


AV_SAMPLE_FMT_S16 交叉存储C1左声道,C2右声道
AV_SAMPLE_FMT_S16P,平面存储,则先存储左声道C1,后存储右声道C2,两个数组
必然说加快播放速度,视频很容易,如25帧/s,那每秒刷50帧,就是两倍速。那音频如何处理,就可以改变播放和原始采样率的关系,那就是快速播放。

MP4


它有个BOX结构,BOX还可以嵌套,首先有个总时长,还有视频和音频时间,因为它们不总是一致的,总会相差一点



GOP


这组数据是可以独立播放的,GOP,
如你随便抽出10帧,并不一定能独立播放的,如果你没有关键帧,或者关键帧少数据,那解码不出来,

  • I帧,关键帧(一帧视频的完整数据,这帧可以单独解码),比如监控,降低帧率,1秒刷新1次,就解关键帧,其它帧不解。在做运动分析时,就只解关键帧,其它帧都不要了,24路监控,摄像头正常就行了,其它帧解析开销很大,关键帧可以单独解码。一般设置成为25,50,那什么意思,就是指每50帧,就一帧关键帧。也可能有问题,那这关键帧丢掉了,这50帧就都不正确了。中间丢掉一帧,画面都乱了。如果只依赖前一帧,就没问题。因为每一帧都是针对它的参考帧的变化,前面乱了,后面自然也就乱了。
  • P帧,是针对前一帧的变化
  • B帧,是针对前后帧的变化,需要先把前面的帧和后面的帧都解完,才能把当前B解码,这样会出现解码顺序和帧顺序不一致,因为存放的顺序是按显示的顺序存放的。那就必须有缓冲。就会发现有人做mpeg最后会少一段,就在缓冲中,不缓冲就没法解码。画面的不正确,画面的花屏,都可能跟这个有关。

C++基于ffmpeg和QT开发播放器~学习笔记相关推荐

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

    参与项目开发: https://github.com/wang-bin/QtAV 下载编译好的文件等:https://sourceforge.NET/projects/qtav win下编译好的可执行 ...

  2. C++实战手把手教您用ffmpeg和QT开发播放器--01音视频基础知识

    笔记:https://blog.csdn.net/tainjau/article/category/9272757 音视频基础知识 封装.解码.重采样.像素格式 1.MPEG-4 MPEG-4标准将众 ...

  3. 【开源项目】基于C++使用ffmpeg和QT开发播放器

    音视频基础知识 1.MPEG-4是一套用于音频,视频信息的亚索编码标准. 2.常见的封装格式 MP4  MOV AVI:压缩标准可以任意选择 FLV :FLV封装格式详细参考 TS:直播流媒体使用: ...

  4. 基于Ffmpeg解码器的简单播放器(a simple audio player based on Ffmpeg)

    这是一个基于Ffmpeg解码器的简单播放器,怎么在Windows上编译Ffmpeg可以在网上找到很多,开发环境是Windows XP SP3+VS2008,其中DirectSound控制单元来自jdk ...

  5. 最简单的基于FFMPEG+SDL的音频播放器

    ===================================================== 最简单的基于FFmpeg的音频播放器系列文章列表: <最简单的基于FFMPEG+SDL ...

  6. 最简单的基于FFMPEG+SDL的音频播放器 ver2 (采用SDL2.0)

    ===================================================== 最简单的基于FFmpeg的音频播放器系列文章列表: <最简单的基于FFMPEG+SDL ...

  7. 最简单的基于FFMPEG SDL的音频播放器

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! ==== ...

  8. 最简单的基于FFMPEG+SDL的音频播放器:拆分-解码器和播放器

    ===================================================== 最简单的基于FFmpeg的音频播放器系列文章列表: <最简单的基于FFMPEG+SDL ...

  9. 最简单的基于FFMPEG+SDL的音频播放器 拆分-解码器和播放器

    ===================================================== 最简单的基于FFmpeg的音频播放器系列文章列表: <最简单的基于FFMPEG+SDL ...

最新文章

  1. linux c 判断文件打开文件,Linux 用C语言判断文件和文件夹
  2. 走进欧洲、澳洲和加拿大21000个零售网点,比特币现金(BCH)有何潜力?
  3. [每日一问]虚拟化网络设计中为什么建议采用链路聚合
  4. 版本控制工具Git 常用操作命令
  5. laravel session redis 设置
  6. 影像拼接(3种方法)
  7. 详测 Generics Collections TStack(1): Push、Pop、Peek - 其他功能同 TQueue
  8. 【转】 opengl编程学习笔记(三)(2D绘图)
  9. HDU 4069 Squiggly Sudoku
  10. python实现阿拉伯数字和罗马数字的互相转换
  11. 关于华为路由器下一跳的心得
  12. 【优化算法】爬虫搜索算法(RSA)【含Matlab源码 1838期】
  13. 读取 RV1126 CPU温度 NPU CPU频率
  14. 《多收了三五斗》大学毕业版 (转)
  15. 超详细!简单的物联网模块esp8266接入小爱爱同学控制电器(一)——控制开关灯
  16. 计算机win7卡顿如何解决方法,电脑win7系统出现卡顿怎么处理
  17. 这个微信小游戏我就坚持了五秒 好玩的休闲游戏推荐
  18. SFP(Soft Filter Pruning)笔记
  19. C#中接口(Interface)与抽象类(abstract)的区别
  20. 使用TinyProxy搭建代理服务器

热门文章

  1. 国辰视觉检测设备用在哪些行业?
  2. arcgis几何修复有作用吗_ARCGIS几何修复使用技巧
  3. 2023泰晤士高等教育世界大学排名发布(附TOP200榜单)
  4. 注册电气工程师短路电流计算口诀法
  5. 虚拟机Windows Linux镜像下载
  6. ActiveStorage. 英文书Learnrails5.2的案例,看如何放到云上。
  7. 【单片机毕业设计】【mcuclub-204】建筑工地降尘 | 粉尘检测 | 降尘处理系统 | PM2.5检测
  8. opencv resize方法总结
  9. 北航工业设计计算机图形学,北航工业设计专培养计划.doc
  10. Ansible-python