说明: 这是看了网上夏曹俊老师博客中仿照老师写的一个完整的视频播放器
下面是我从项目中总结的几点:
- 不是基于视频播放控件开发,全是是从底层实现。
- FFMPEG中基于音视频解封装,音频重采样,视频像素格式转换和尺寸变换。
- 用的是QT中的opengl shader 绘制yuv数据。
- 原来是基于QImage的图像尺寸转换策略(基于CPU效率低下),替换为高性能opengl材质实现(基于GPU)
- 原来使用的sws_scale的yuv转换RGB(基于CPU效率低下),替换为使用opengl Shader(基于GPU使用glsl,显卡的编程语言)
- 实现了全屏播放。
- seek找不到关键帧会跳到最开始修改代码,(h264只能跳转到关键帧),需要向后找到关键帧,显示。
- 修改视频中的尺寸造成花屏问题,是行对齐原因造成的,需要通过行复制解决。
- 程序退出会宕机,是由于线程未退出。
- 将解封装和解码隔离,隔离解封装,解音频,解视频。
- 实现Slider点击跳转功能,清理缓冲中内容,同时实现随意拉。
- 缓冲实现100帧,就是2秒左右(每秒中44帧)。1000帧就是20秒左右。
- 需要考虑到音视频同步问题,(有三个同步解决方案: 音频为基准, 视频为基准,时钟为基准)。本次采用的将音频为基准,原因音频不容易跟视频。
- 视频中用到了多线程技术。
- 测试的时候用的是MP4视频比较小,能放, 但是2个小时mkv视频能放,但是不能随机点击位置播放和跳转播放,原因未知。
- bin: 里面是生成执行文件目录,包含dll的文件。
- include:里面包含的是库的头文件目录。
- lib: 里面放的下项目需要链接库。
- src : 里面放的是项目的代码。