首页| 论坛| 消息

标题:Qt/C++音视频开发58-逐帧播放/上一帧下一帧/切换播放进度/实时解码
作者:liudianwu
日期:2023-12-08 09:29
内容:

## 一、前言
逐帧播放是近期增加的功能,之前也一直思考过这个功能该如何实现,对于mdk/qtav等内核组件,可以直接用该组件提供的接口实现即可,而对于ffmpeg,需要自己处理,如果有缓存的数据的话,可以通过在缓存中的数据往前移动往后移动即可。这样就要求做一个比较大的缓存队列,占用一定的内存是肯定的。为了在现有代码基础上能够最快最稳定最小代码量实现逐帧播放功能,一个思路就是在播放完一帧后立马暂停,只有当用户单击了下一帧,就继续播放一帧,解码线程那边会自动判断音视频同步线程中缓存的数据包数量,超过一定数量则会暂停解码,通过验证此策略是完全可行的,每次播放一帧就暂停。但是这个也有个问题,就是不支持往回播放一帧,因为播放完成后就已经把之前的数据释放清空了,如果一定要往后播放,只能切换进度,这样才会重新读取数据解码。通过对比其他播放器发现vlc也是只能往前播放一帧,不支持回退逐帧播放,可能也是遇到了一样的困难。等后期有更好的办法再考虑重构。
对于一些没有提供逐帧播放api接口的sdk比如qmediaplayer,可以通过设置进度来模拟实现逐帧播放,但是确切的说未必是逐帧就是。比如可以获取到fps,就是1s内播放多少张图片,这样就可以根据fps计算出每一张图片占用的进度时间,比如fps=25就是一张图片40ms,意味着逐帧播放函数每次将进度+40即可,试下来也还行,基本上看下来是逐帧播放的。
## 二、效果图

## 三、体验地址
1. 国内站点:[https://gitee.com/feiyangqingyun](https://gitee.com/feiyangqingyun)
2. 国际站点:[https://github.com/feiyangqingyun](https://github.com/feiyangqingyun)
3. 个人作品:[https://blog.csdn.net/feiyangqingyun/article/details/97565652](https://blog.csdn.net/feiyangqingyun/article/details/97565652)
4. 体验地址:[https://pan.baidu.com/s/1d7TH_GEYl5nOecuNlWJJ7g](https://pan.baidu.com/s/1d7TH_GEYl5nOecuNlWJJ7g) 提取码:01jf 文件名:bin_video_demo。
## 四、功能特点
### 4.1. 基础功能
1. 支持各种音频视频文件格式,比如mp3、wav、mp4、asf、rm、rmvb、mkv等。
2. 支持本地摄像头设备和本地桌面采集,支持多设备和多屏幕。
3. 支持各种视频流格式,比如rtp、rtsp、rtmp、http、udp等。
4. 本地音视频文件和网络音视频文件,自动识别文件长度、播放进度、音量大小、静音状态 ..

回复 发表
主题 版块