博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
EasyPlayer RTSP安卓Android播放器架构简析
阅读量:4501 次
发布时间:2019-06-08

本文共 995 字,大约阅读时间需要 3 分钟。

本文转自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

EasyDarwin

转载于:https://www.cnblogs.com/babosa/p/7348749.html

你可能感兴趣的文章
Google今天叫——谷歌
查看>>
Android中关闭DatePicker和NumberPicker等Picker类的可编辑模式
查看>>
jquery中利用队列依次执行动画
查看>>
reverie_mjp
查看>>
阅读笔记六
查看>>
J2EE(五)——servlet初识
查看>>
requests 可以玩接口自动化测试,爬虫也是可以滴
查看>>
20160419__第1课_第6课
查看>>
构造方法私有化和单例模式
查看>>
hdu 1846 Brave Game
查看>>
数据库连接历险记
查看>>
抛弃msvcrtXX库
查看>>
血眼龙王传--秋叶青篇
查看>>
Runtime
查看>>
取消git忽略文件
查看>>
Leetcode2--->链表中对应位相加(进位)
查看>>
PXE远程自动安装操作系统
查看>>
java开发知识IO知识之输入输出流以及文件
查看>>
作业4: 用户体验分析——以 “师路南通网站” 为例
查看>>
SurfaceViewVideoList网络获取视频播放
查看>>