本文转自EasyDarwin开源团队成员John的博客:
EasyPlayer 是一款小而美的RTSP安卓播放器。具有起搏快、延迟底、兼容性好的特点,而且支持抓拍、录像等实用功能。
好了,我就在此简单介绍一下播放器的代码结构吧!播放
简单来说,EasyPlayer就是一个典型的生产者、消费者模式案例,如下图所示:
首先,创建音视频消费者线程。线程刚开始,会等待音视频数据帧,根据音视频相关信息,初始化Decoder和Render。EasyPlayer的视频用MediaCodec进行解码与渲染;音频用AudioDecoder解码和AudioTrack来渲染。
其次,创建生产者线程。即图中的媒体数据回调线程。生产者为EasyRTSPClient。EasyRTSPClient是一个RTSP的Demuxer库,在EasyPlayer工程里以Native形式存在。该库将RTSP协议里的音视频数据流解析成音视频帧,并缓存到媒体帧队列里。 需要注意的是,缓存队列在保存音视频数据帧的同时,会对其按时间戳排序,用来实现音视频同步。 当消费者线程从媒体帧队列取到媒体帧后,会发起渲染,这样一个简单的播放器就实现了。录像
关于EasyPlayer的录像作者之前也有过介绍,参考文章:
EasyPlayer实现播放时同步录像的功能: Android MediaMuxer录像(支持G711音频): 播放器的录像是在消费者线程里进行的,其流程图如下: Created with Raphaël 2.1.0视频线程视频线程MuxerMuxer音频线程音频线程写入视频数据写入音频数据渲染视频渲染音频
停止
Player停止的顺序恰好与播放的顺序相反。首先,先停止生产者线程,然后再终止音视频消费者线程,值得注意的是由于音视频渲染相关的处理都放在了消费者线程当中,因此消费者线程结束时会同时反初始化相关资源。最后再清空缓冲队列。如果正在录像,还要停止muxer,以确保录像文件正常结束,能够播放。
相关资源
- EasyPlayer项目地址: Github
- App下载地址:
获取更多信息
邮件:
WEB:
QQ群:587254841
Copyright © EasyDarwin.org 2012-2017