一直想学习如何开发一款视频播放器,做到尽量好用。然而一直没有机会,终于经历大半个月学习了夏曹俊老师的视频播放器开发课程,收获颇多,特此总结。学完基本上有了一个播放器应该有的大多内容了,之后再添加也就是小功能。
目的:
- 整理整个流程
- 做出一款能再Android上方便使用的播放器
整体介绍
这里就不介绍视频音频相关的基础知识了,因为我还没有去深刻理解,估计说不好,但是这个部分其实很重要,对理解代码中为什么要这样,很有帮助。
开发这个视频播放器用到了几块技术,分为了以下几个部分:
- 使用ffmpeg将视频解封装(demux模块)
- 使用ffmpeg将音视频解码(decode模块)
- 使用ffmpeg将音频重采样(resample模块)
- 使用opensles播放音频(音频播放模块)
- 使用opengl的shader将视频绘制,再由egl将绘制内容显示到surface窗口上(视频显示模块)
这几步中,首先需要将数据解封装,再把数据交给解码器,音频解码器解码音频数据,视频解码器解码视频数据,解码后音频数据交给ffmpeg去重采样,解码后的视频数据交给shader绘制,最后让egl显示到surface上。
当然不一定要所有数据都解码或者重采样,因为如果解封装之后有的数据本身就是原始数据了,那么就能直接使用。
这几步变成时序图就是这样,步骤很清晰,主要是老师讲的好。
帧数据处理顺序图.png
其实只要这个流程清楚了,之后的步骤按照这个来就很轻松了,因为ffmpeg、opengl、opensl这些库都把这些功能封装好了,具体怎么解封装,怎么解码,怎么重采样,怎么播放和显示都是调用api就可以了。
叹
到这里,其实这也才是刚入坑而已,其中视频的格式有很多,解码后数据是否存在问题等等,都只能慢慢的尝试调整了。