1 为什么要学习播放器开发
对于⾳视频应⽤⽽⾔,主要的核⼼流程为:
image.png即是
- 采集录制/推流:⽐如采集⻨克⻛+摄像头,进⾏编码后保存为MP4⽂件,或者通过RTMP协议推送 到流媒体服务器; 在后续的录制推流项⽬会详细讲解。
- 流媒体服务器承载RTMP推拉流等,或者其他流媒体协议⽐如HLS/HTTP-FLV的转换;在srs项⽬详 细讲解。
- 拉流/本地播放。这个是我们当前项⽬要重点讲解的。
2 学习播放器开发的前置知识
学习本章节的播放器,需要先掌握ffplay.c。
本章播放器分为两个阶段:
- 第⼀阶段,基于ffplay.c进⾏⼆次开发,并参考ijkplayer的逻辑流程。
- 第⼆阶段,吸收QMPlay2的⼀些优秀设计。
3 我们该如何掌握⼀个商业的播放器
我们为什么这个播放器是参考ffplay.c、ijkplayer和QMPlay2,是因为做⼀个商业的播放器,如果完全⾃⼰从0开始会⾛很多弯路,⽐如:
- UI界⾯如何和播放器核⼼进⾏解耦,能百度到的简单demo播放器UI和播放器核⼼都是耦合在⼀起的,这个时候我们可以参考ijkplayer的消息机制
- 再⽐如我们设计了消息机制进⾏UI界⾯和播放器核⼼的解耦,那如果⾃⼰完全写代码是否会想到每个状态转换之前是否会做状态能否转换的检测,⽐如 从IDE状态,能否直接转到START播放状态。
- 还有我们反复得发暂停、恢复播放, 消息队列⾥是否有存储多个暂停、播放指令的必要,⽽对于成熟的播放器消息队列,他会把消息队列⾥有冲突的消息指令删除,在发送新的消息指令,⽐如刚按了暂停,然后⼜要恢复播放,如果发送恢复播放的时候队列⾥有暂停指令,那这个暂停指令就没有必要被继续执⾏,可以将其删除。
- 从上分析也可以得到UI界⾯和播放器核⼼直接的消息队列,是存在两个线程的竞争关系,此时消息队列是不是要设计为线程安全。
5. 以上等等分析,我们都可以借鉴成熟的商业播放器,站着前⼈的基础上提升。
对于参考ijkplayer,建议⼤家可以⽤vscode或者sourceinsight加载其源码,可以跟踪其源码。
在学习的过程中,⼀定要多思考有些逻辑为什么这么设计。
网友评论