由于机顶盒行业的管制日趋严厉,从手机上推送视频到电视上观看成为一个需求,所以需要开发一个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。(待续。。。。)

DLNA DMR实现相关推荐

  1. Android 蓝牙

    从事Connectivity模块几年时间了,Team负责集成包括WiFi/Bluetooth(A2DP Source/Sink,HID[key/Audio],OPP,SPP)投屏类[Miracast, ...

  2. Android日志分析

    近期开始接触Android相关内容,从基础开始学习吧. 一.Android 日志分类 Android日志主要分为kernel.radio.event.main四种,相关描述如下: 1. Kernel ...

  3. Android ANR简介

    1.ANR是什么 Application Not Responding即应用无响应. 当操作在一段时间内,系统无法处理是,就会发生ANR.弹出对应的无响应的对话框. 2.ANR的类型 发生ANR的主要 ...

  4. Android Miracast 投屏

    从事Connectivity模块几年时间了,Team负责集成包括WiFi/Bluetooth(A2DP Source/Sink,HID[key/Audio],OPP,SPP)投屏类[Miracast, ...

  5. DLNA, PulseAudio, diffpatch, bash

    http://antkillerfarm.github.io/ 参考资料 http://www.miui.com/thread-647727-1-1.html http://pie.pconline. ...

  6. 在android系统中开发DLNA

     内容目录 Part 1. 前言:DLNA简介 Part 2. 主体:DLNA在android中的开发流程 Part 2. 关于DLNA的其他知识 Part 1. 前言:DLNA简介 DLNA,D ...

  7. dlna和miracast可以共存吗_Airplay、Miracast、DLNA传输原理的底层搭建

    Airplay.Miracast.DLNA传输原理的底层搭建 上一篇小编在<手机无线投屏的技术干货>一文中,跟大家介绍了Airplay.Miracast.DLNA.这三种传输效果和应用上的 ...

  8. 第一集 DLNA 白話文介紹

    今天和大家分享 DLNA 這個東東.DLNA 的全名是  Digital Living Network Alliance ,聽名字一點都不酷,這也是開放式標準的悲哀,常常缺乏一個響亮好記的商業口號來推 ...

  9. DLNA 在自己的APP 中添加投屏功能

    2019独角兽企业重金招聘Python工程师标准>>> 功能:让本机的视频在其他设备上播放. demo 学习中 关键词: cling demo from: DROID DLNA 关于 ...

最新文章

  1. charles的一些使用
  2. layui弹窗自适应变大_layui弹窗宽度固定高度自适应界面
  3. hdu 1671 Phone List 字典树模板
  4. 浅谈C++中的资源管理
  5. PrimaDonna智能咖啡机,咖啡也要私人定制
  6. c语言调用数学函数根号,不调用库函数求根号x的计算方法(二分/三分/牛顿迭代法)...
  7. linux 3ds 模拟器下载,3DS模拟器电脑版
  8. 基于FPGA的循迹小车,控制器:Xilinx-Ego1
  9. Citrix PVS无盘系统最小环境搭建
  10. 20行代码制作字符画版小黄鸭表情包 | 文末送书抽奖结果
  11. 能够正常加入域但无法实施域策略
  12. bag of tricks for image classification with convolutional neural networks
  13. 为什么下载的破解游戏和软件经常会被报毒?
  14. ESP8266 接入阿里物联网平台实现远程控制LED
  15. java微信支付v3系列——6.微信支付查询订单API
  16. ventoy启动盘 集成多版本系统的启动盘
  17. python跨年表白神器--你值得拥有!
  18. MySQL默认字符集设置
  19. Oracle.DataAccess.dll 下载 dll之家
  20. pcs+corosync+pacemaker+haproxy负载均衡环境部署

热门文章

  1. 无穷小量与无穷大量的阶
  2. linux docker 常用命令
  3. 频繁跳槽写入简历的三条原则!
  4. 联想电脑 关闭打开机盖自动开机功能
  5. 这是美国MarTech最大的一家独立公司:HubSpot
  6. Des加密原理与简单实现
  7. Word、Excel、PPT软件打开关闭时很慢(卡顿)的一种解决方法
  8. epub电子书如何用安卓手机打开?
  9. mapboxGL实现旋转的地球
  10. 读《骨干是折腾出来的》有感