Android流媒体框架的AHandler消息机制分析

Android流媒体框架是从android2.3有的,其核心是nuplayer。Android流媒体从4.1之后主要的文件是httplivesource,rtspsource,genericsource。其中RTSP和Httplive是主要的,它们有着本质上的不同。
Rtspsource 是客户端向视频服务端请求视频服务之前,必须先通过HTTP协议从WEB服务器获得请求视频服务的演示描述文件(Presentation description),在RTSP,每一个演示和对应的媒体流都有一个RTSPURL标识。整个演示和媒体特性都在一个演示描述文件中定义,该文件可能包含媒体编码方式、语言、RTSP URLs、目标地址、端口等参数。客户端在向服务器请求某个连续媒体流的服务前,首先要获取服务器中该媒体流的演示描述文件得到一些基本的参数,演示描述文件的获取可采用HTTP、email等方式。利用演示文件提供的视频服务地址(视频服务器地址和端口号)以及视频服务编码方式等信息。然后客户端根据获取的信息向视频播放器请求视频服务。视频服务初始化完成后,视频服务端会为该客户端建立一个新的视频服务流,客户端同服务端实时流控制协议RTSP,对该视频流进行控制信号的交换,播放、停止等。当服务完毕,客户端提出拆线(TEARDOWN)请求。服务端使用RTP/UDP协议将媒体数据传送给客户端,当数据到达客户端,客户端随即播放。在流式传输中,使用RTP/RTCP/UDP和RTSP/TCP两种不同的通信协议在客户端和服务端间建立联系。
在android上,流媒体播放跟本地媒体播放是两个不同的架构体系,两者的区别如下
1:框架层创建的player不同,local playback用的是stagefrightplayer而流媒体是nuplayer。
2:跟OMX接口不一致,local playback用的是omxcodec,而流媒体用的是Acodec。
3:消息机制不同,localplayback用的是TimedEventQueue模型,而流媒体用的是AHandler消息机制,类似于我们熟悉的Handler。下面介绍AHandler机制。
AHandler是Android native层实现的一个异步消息机制,在这个机制中所有的处理都是异步的,将变量封装到一个消息Amessage结构体中,然后放到队列中去,后台专门有一个线程会从这个队列中取出消息然后执行,执行函数就是onMessageReceived。
Ahandler机制包括以下几个类
1. AMessage
消息类,用于构造消息,通过post方法投递出去给ALooper
 
2. AHandler
消息处理类,一般当做父类,继承该类的子类需要实现onMessageReceived方法
 
3. ALooper
与Ahander一一对应,负责存储消息并分发Ahandler的消息,与AMessage一对多关系
 


 
 
4. LooperThread
此线程调用ALooper的loop方法来分发消息

virtual status_t readyToRun() {
        mThreadId = androidGetThreadId();
        return Thread::readyToRun();
    }
    virtual bool threadLoop() {
        return mLooper->loop();
}



5. ALooperRoaster
与Handler是一对多的关系, 管理Looper和Handler一一对应关系,负责释放stale handler
 


进行异步消息机制的创建

sp<ALooper> mLooper = new ALooper; //创建一个Alooper实例
sp<AHandlerReflector> mHandler = new AHandlerReflector //创建一个Ahandler实例
mLooper->setName(“xxxxx”); //设置looper名字
mLooper->start(false, true, PRIORITY_XXX); //根据参数创建并启动 looper thread
mLooper->regiserHandler(mHandler); //register handler 会调用AHandler的setID方法将looper设置到Handler里去


Post消息

sp<AMessage> msg = new AMessage(kWhatSayGoodbye, mHandler); //在AMessage的构造方法里获取Ahandler对应的Looper并保存
msg->post(); // 调用looper的post方法
Message Post的调用过程
Message::pos
ALooper::post
mEventQueue.insert
mQueueChangedCondition.signal() //如果之前没有event,通知looper thread
ALooper::loop()
if (mEventQueue.empty()) { //如果消息队列为空,则等待
mQueueChangedCondition.wait(mLock);
return true;
}
event = *mEventQueue.begin();
event.mMessage->deliver();
AHandler::deliverMessage
AHandlerReflector:: onMessageReceived

Ahandler大致就是启动一个threadLooper,监听looper的消息队列是否有变化,如有交给相应的Handler去处理。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值