« 上一篇下一篇 »

Mirrorlink类型车联网项目阶段性成果(二)

前段时间弄的是CE平台的车机。但是因为android发展迅猛,现在android车机已经相当普遍,所以最近一直在弄android系统的车机平台,这次主要的目标是实现android车机平台与iPhone手机之间的连接。对于苹果在车联网领域,已经有了它自己的方案CarPlay,但是正如苹果一贯的封闭,对我来说完全没有帮助。我只得采用airplay协议进行屏幕的投射。至于说反控,就是通过车机屏幕去控制iPhone手机的屏幕,这个因为iPhone手机严格的权限控制,是不可能实现的。不过人总是聪明的,这里有一种很取巧的办法,虽然我们没有权限控制整个iPhone手机,但是我们却可以实现应用内的控制,简单来说我们可以开发一个自己的苹果APP,然后可以通过车机端控制我们自己APP在运行时所展现出来的那个屏幕内容。这也不失是一种折中的好办法。 整的来说难度还是挺大的,而且对于airplay协议来说也是封闭的,没有太多公开的资料,很多时候需要自己抓包去分析,另外也不知道什么时候苹果一升级,协议又变了。

这里附上几个协议的参考地址:

下面是成果展示图片:



前面讲的都是android车机平台连接iPhone手机的情况,那么对于android车机连接android手机的情况又如何处理呢。受到弄iPhone手机过程中的启发,决定重新对android手机屏幕投射至android车机进行技术选型。

一开始选择的是VNC方案,但是VNC实在太古老了,碰到高清视频完全无法正常工作。所以还是决定果断放弃。新方案决定参考苹果的airplay还有DLNA,采用流媒体进行屏幕投射。

从简单到复杂有三种具体实现方式:

android手机端 (生产者) 网络协议
android车机端(消费者)
方案一:
不停的获取屏幕帧,然后利用FFmpeg进行编码通过网络传给车机端 自定义协议 通过网络获取编码后的帧数据,利用FFmpeg解码后,然后利用android自带的SurfaceView或GLSurfaceView等机制将解码后的屏幕帧显示出来
方案二:
同上 同上
通过网络获取编码后的帧数据,利用FFmpeg解码后,然后利用SDL(Simple DirectMedia Layer)将画面显示出来
方案三:
实现一个标准的流媒体服务器,向外发布一个标准的流媒体地址,流媒体播放器可以通过打开这个地址播放画面。更严格的说相当于一个直播服务器,直播的内容为手机屏幕。『采集->编码->传输->解码->播放』 各种标准协议,如HTTP,RTSP等协议 实现一个标准的流媒体播放器,可以打开标准的流媒体地址进行播放。可以考虑利用Vitamio,VLC等框架加速开发。也可以直接参考如ijkplayer等开源播放器项目。


补充:
android平台显示视频内容的几种途径:
1.通过MediaPlayer进行播放。
2.自己对视频进行解码,然后利用android自带的SurfaceView,GLSurfaceView等将一帧一帧的画面显示出来。
3.自己对视频进行解码,然后利用SDL等库将画面显示出来。

android平台播放音频内容的几种途径:
1.通过MediaPlayer进行播放。
2.自己对音频进行解码,然后利用android自带的AudioTrack将解码出来的PCM播放出来。
3.自己对音频进行解码,然后利用SDL等库将音频播放出来。

android平台音视频编解码几种途径:
1.用FFmpeg库进行编解码。
2.利用android自带的MediaCodec(API-16及其以上),原生层面的nativecodec(API-21及其以上) 。一般来说这俩都属于硬解。