DLNA DMR实现

由于机顶盒行业的管制日趋严厉,从手机上推送视频到电视上观看成为一个需求,所以需要开发一个dlna服务端。

先了解下DLNA,抄一段网上的定义:

DLNA协议定义了一种通用的行业规范,目的是让电子设备之间可以方便地共享照片、视频、音乐等多媒体内容。简单的说,是个共享东西的协议。

DLNA协议是建立在UPnP协议的基础上的,它依靠UPnP协议来完成设备的搜索、发现和控制,DLNA协议在此基础上对多媒体设备进行了更加详细的分类和约束,它其实更像是UPnP协议的一个子集。相比于UPnP协议,它更加专注于解决多媒体内容的共享的架构。

一个典型的upnp网络包含三个要素

服务器(MediaServer)主要负责提供多媒体文件的浏览和控制。
播放器(MediaRender)主要负责提供播放和渲染。
控制点(Control Point)则控制整个播放过程。

关于UPnP,已经有第三方库给予实现framework,我们这里选用的是Platinum UPnP,如下是它的简介:

The Platinum framework consists of a core framework that implements the UPnP core specifications including GENA, SOAP and SSDP. Building on top of that, the Platinum framework provides the foundation for UPnP AV Media Server and Media Renderer compliant implementations.

由上可知,该库提供了构MediaServer和MediaRender的基础。

那么我们先下载Platinum sdk,并进行编译。我是在ubuntu下编的。
1.进入Platinum目录,敲命令scons target=arm-android-linux build_config=Release
2.生成的静态库文件在Build/Targets/arm-android-linux/Release/
3.进入Source/Platform/Android/module/platinum/jni/,可以看到Android.mk文件中将

LOCAL_LDLIBS += -lPlatinum
LOCAL_LDLIBS += -lNeptune
LOCAL_LDLIBS += -laxTLS

这些第一步生成的库都链接进来了。运行ndk-build生成libplatinum-jni.so。这里只是测试,实际应用中会修改这个jni文件再编译。

环境准备好后,进入正题。由于是运行在电视上的apk,我们大致的应用结构如下:

这里写图片描述

最上面的是View,用android混合html框架实现。
中间层是具体的dlna和airplay衔接部分,DLNA部分主要作用是管理UPnp服务的启动,设备的加入、已经控制命令和获取参数命令的下发和接收。
Airplay部分以后再说。

最下面一层是Platinum库。

下面对各个类做下简单说明:

UPnP:JNI的连接类,定义了播放动作。

DMRServ:初始化的时候,初始化UPnP对象并init,当UPnP底层发来命令时,会通过设置的RemotePlayListener传递给RPService。如果此时默认UPnp是开启的,则调用一些函数来初始化dmr名称等
如:

        mupnp.start();
        mdeviceInfo.name = "TBox";
        mdeviceInfo.uuid = getUUID();
        Log.e(TAG, "startEngine name=" + mdeviceInfo.name);
        Log.e(TAG, "startEngine uuid=" + mdeviceInfo.uuid);
        mdeviceInfo.addip = LocalConfig.getProperty(mContext,            "/apps/dmrd/addip").equals("TRUE");
        UpnpRenderer.setDeviceInfo(mdeviceInfo);
        Log.i(TAG, "startEngine!!!!!!!!");
        UpnpRenderer.init();
        massetManager = mContext.getAssets();
        UpnpRenderer.InitAssets(UpnpRenderer.cSelf, massetManager);
        int ret = mupnp.addDevice(UpnpRenderer.getDeviceReferance());

同时该类还负责处理GENA Event,如:

    public static String MEDIA_RENDERER_RSP_PLAYSTATUS = "PlayStatus";
    public static String MEDIA_RENDERER_RSP_PLAYERREADY = "PlayerReady";
    public static String MEDIA_RENDERER_RSP_PLAYSPEED = "PlaySpeed";
    public static String MEDIA_RENDERER_RSP_TIMEDURATION = "TimeDuration";
    public static String MEDIA_RENDERER_RSP_TIMEPOSITION = "TimePosition";
    public static String MEDIA_RENDERER_RSP_CURRENTURI = "CurrentURI";
    public static String MEDIA_RENDERER_RSP_VOLUME = "Volume";
    public static String MEDIA_RENDERER_RSP_MUTE = "Mute";
    public static String MEDIA_RENDERER_RSP_TRACKNUMBER = "TrackNumber";
    public static String MEDIA_RENDERER_RSP_CURRENTTRACK= "CurrentTrack";
    public static String MEDIA_RENDERER_RSP_METADATA= "MetaData";

这些都是上层应用播放时要往手机里去取的参数,onTransdelGenaEvent()就是负责调用UPnPrender去发送。

Dmr_jni.cpp:由图可以看到TTV_MediaRenderer和TTV_MediaRendererDelegate 分别继承自PLT_MediaRenderer和PLT_MediaRendererDelegate。在dmr的init过程中,


TTV_MediaRenderer *render = upnpCreateRenderer(lname.getStrFromJba(), addip, luuid.getStrFromJba());
    TTV_MediaRendererDelegate *delegate = new TTV_MediaRendererDelegate();
    delegate->setJni(g_jvm, jcls, methodID);
    render->SetDelegate(delegate);
    render->mdevice = new PLT_DeviceHostReference();
    *render->mdevice = render;

我们初始化了MediaRendererDelegate, 并设置为该render的delegate。(待续。。。。)

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值