iOS DLNA编程

iOS DLNA编程

近期实现了iOS下的DLNA,发现ios下的DLNA编程资料很少,其实DLNA文档还好 (28m) ,但是真的确定要看文档自己去实现么?

下面先介绍一下DLNA的基本概念,已经有概念的同学可以跳过,直接看iOS下的DLNA库

什么是DLNA

DLNA的全称是DIGITAL LIVING NETWORK ALLIANCE, 其宗旨是Enjoy your music, photos and videos, anywhere anytime, DLNA (Digital Living Network Alliance) 由索尼、英特尔、微软等发起成立、旨在解决个人PC, 消费电器, 移动设备在内的无线网络和有线网络的互联互通, 使得数字媒体和内容服务的无限制的共享和增长成为可能, 目前成员公司已达280多家.DLNA并不是创造技术, 而是形成一种解决的方案,
一种大家可以遵守的规范. 所以, 其选择的各种技术和协议都是当前所应用很广泛的技术和协议.DLNA将其整个应用规定成5个功能组件. 从下到上依次为:网络互连, 网络协议, 媒体传输, 设备的发现控制和管理, 媒体格式.

以上摘自百度百科.通俗的说就是一帮人为实现某些功能,定义了一个标准.

功能

  1. 探索:网络中寻找无配置的设备并计算出其提供的性能
  2. 浏览:浏览内容并通过不同方式分类
  3. 搜索:在设备上寻找特定内容
  4. 分流:全网发送多媒体内容
  5. 服务:网络通知通讯录
  6. 打印:向网络附属打印机发送内容
  7. 控制:使用网络改变设备状态
  8. 上传:发送内容到服务器
  9. 下载:接收并储存内容
  10. 自动译码:改变分辨率或内容格式来确保设备正确翻译
  11. 服务保证:区分网络交通优先次序, 若网络超载, 优先放弃最弱的优先权

功能模块

  • 数字媒体服务器 (DMS, Digital Media Server) :提供了媒体文件的获取、录制、存储以及作为源头的设备.
  • 数字媒体播放器 (DMP, Digital Media Player) :可查找并播放或输出任何由DMS所提供的媒体文件的设备.
  • 移动式数字媒体服务器 (M-DMS, Mobile Digital Media Server) :针对手机等体积较小、轻巧可移动式的电子设备所定义的服务器, 多媒体格式支持与一般DMS稍有不同.
  • 移动式数字媒体播放器 (M-DMP, Mobile Digital Media Player) :同样是针对移动设备的播放器, 多媒体格式支持与一般DMP稍有不同.
  • 数字媒体控制器 (DMC, Digital MediaController) :作为遥控设备使用, 可查找DMS上的多媒体文件, 并指定可播放该多媒体文件的DMP进行播放或是控制多媒体文件上下传到DMS的设备.
  • 数字媒体打印机 (DMPr, Digital Media Printer) :DMPr的打印机可以在DLNA网络架构下提供打印功能.

iOS下的DLNA库

git上搜的话,只搜到一个oc包装的库https://github.com/FuruyamaTakeshi/DLNA

这个库的问题还是有些的

  • 文档嘛,去了作者的个人站点,发现有了和没有一样.
  • demo不全,不是所有的功能写了
  • 还有个bug,seek那里应该用REL_TIME
  • 所有的请求是走是程同步,非多线程
  • 初始化到启动时间过长,ip6测试从init开始到搜索需要6s左右.
  • DLNA协议实现的也不全,但是再不全也比自己重写的好.

iOS下的DLNA

咱项目呢,需要用的是DMC那部分,通俗的说就是把手机上的在线的视频投放到小米盒子之类的产品上.

具体的实现:

// 搜索设备,我们这里就只搜DMR了
CGUpnpAvController *avCtrl = [[CGUpnpAvController alloc] init];
avCtrl.delegate  = self;
// 这个 start 要6s
[self.avCtrl start];
[self.avCtrl searchWithST:DLNAService__CG_UPNPAV_DMR_DEVICE_TYPE];

// 响应设备跟新的委托
-  (void) controlPoint: (CGUpnpControlPoint *) controlPoint deviceAdded: (NSString *) deviceUdn;
-  (void) controlPoint: (CGUpnpControlPoint *) controlPoint deviceUpdated: (NSString *) deviceUdn;
-  (void) controlPoint: (CGUpnpControlPoint *) controlPoint deviceRemoved: (NSString *) deviceUdn;
-  (void) controlPoint: (CGUpnpControlPoint *) controlPoint deviceInvalid: (NSString *) deviceUdn; 

// 有设备后,给设备发送相应的命令,控制设备的行为
// 给指定的设备设置播放地址
// 这里DLNA的文档上是用了这个action后DMP会变成play状态,就是会自动播放
BOOL b = [_currentRenderer setAVTransportUrl:url];

// 但是腾讯是又发了一个play的action,可能是腾讯测试的机子多,发现有些设备没有自动播放吧
b = [_currentRenderer play] && b;

// 设置seek的时间,这里记得fix下库的bug
[_currentRenderer seek:iTime]

// 这样就完成了将网上的视频投放到盒子 (电视上了) ,但是还没完,我们不知道播放进度
// 我们得自己写个定时器,主动问设备,您播放到哪秒了啊
CGUpnpAVPositionInfo *positionInfo = [_currentRenderer positionInfo];

// 最后就是关于停止暂停的一些方法了
[_currentRenderer stop];
[_currentRenderer pause];

// 如果你还想改音量啊,连续播放视频啊
// 呵呵,这个库没带,请自己实现
// 类似下面的下一个
-  (BOOL) next
{
    CGUpnpAction *action = [self actionOfTransportServiceForName:@"Next"];
    if  (!action)
        return NO;

    [action setArgumentValue:@"0" forName:@"InstanceID"];

    if  (![action post])
        return NO;

    return YES;
}

// 当你实现了连续播放视频的功能时候呢,你会发现,小米盒子没实现这个功能
// SetVolume这个action是实现设置音量的,这个可以试试看哦

看了上述代码发现其实也不难嘛,具体试了之后呢会发现一堆坑的,如seek, 文档上是说只有play或者stop的状态下发送才能成功.所以呢,你直接发完play的action后,立马发一个seek,觉得会成功么?DMR刚刚收到setAVTransportUrl后是下载,不是play状态哦,但是这个时候已经回复你action成功了.如果你想知道DMR的状态是有办法的,但是这个oc包装的库没写.但是呢有的设备可以直接就发送seek,有的就必须等下载完成开始play后才能seek,我说的设备还都是小米盒子.

时间: 2024-08-24 00:33:40

iOS DLNA编程的相关文章

iOS DLNA Cyberlink,PlatinumKit库完成DLNA功能

经过一个多月的研究,终于将iOS DLNA搞定.记录一下. 关于DLNA开发,目前有两个框架.一个Cyberlink,一个platinumkit.Cyberlink的好处就是提供了一套OC的api供你调用,很简单方便.但是此框架有很多问题,且功能不全.platinumkit框架底层为c++,若要用此套框架,就得进行oc和c++的混编,之前我没做过oc和c++的混编,所以去看platinumkit的源码时,觉得头疼无比,浪费了很多时间,但是使用cyberlink框架又有很多功能无法解决,并且框架经

iOS多线程编程

1. 进程,线程, 任务 进程:一个程序在运行时,系统会为其分配一个进程,用以管理他的一些资源. 线程:进程内所包含的一个或多个执行单元称为线程,线程一般情况下不持有资源,但可以使用其所在进程的资源. 任务:进程或线程中要做的事情. 在引入线程的操作系统中,通常把进程作为分配资源的基本单位,而把线程作为独立运行和独立调度的基本单位. 线程比进程更小,对其调度的开销小,能够提高系统内多个任务的并发执行程度. 一个程序至少有一个进程,一个进程至少有一个线程.一个程序就是一个进程,而一个程序中的多个任

深入浅出iOS函数式编程与响应式编程概念

简介 本篇文章主要回顾一下——iOS函数式编程 && 响应式编程概念,如何一步步实现函数式编程的过程,对阅读Masonry && SnapKit源码有一定的帮助. 图片描述 作为一个iOS 开发者,那么你一定用过Masnory/ SnapKit: Masonry是一个OC开发中,非常好用的自动布局的第三方框架: SnapKit是Masonry团队打造的Swift版本的自动布局框架: 如果你没有用过,在自动布局中用的是苹果原生的或者原生的升级版VFL语言,那我只好为你点“赞”

iOS网络编程笔记——Socket编程

一.什么是Socket通信: Socket是网络上的两个程序,通过一个双向的通信连接,实现数据的交换.这个双向连路的一端称为socket.socket通常用来实现客户方和服务方的连接.socket是TCP/IP协议的一个十分流行的编程接口.一个socket由一个IP地址和一个端口号唯一确定.TCP/IP协议的传输层又有两种协议:TCP(传输控制协议)和UDP(用户数据报协议).TCP是基于连接的,而UDP是无连接的:TCP对系统资源的要求较多,而UDP少:TCP保证数据的正确性而UDP可能丢包:

线程同步-iOS多线程编程指南(四)-08-多线程

首页 编程指南 Grand Central Dispatch 基本概念 多核心的性能 Dispatch Sources 完结 外传:dispatch_once(上) Block非官方编程指南 基础 内存管理 揭开神秘面纱(上) 揭开神秘面纱(下) iOS多线程编程指南 关于多线程编程 线程管理 Run Loop 线程同步 附录 Core Animation编程指南 Core Animation简介 基本概念 渲染架构 几何变换 查看目录 中文手册/API ASIHTTPRequest Openg

iOS网络编程(六) NSURLSession详解

昨夜浏览Demo的时候,看到别人请求网络数据用的是NSURLSession,当时就在想这里什么,怎么没有用过,引起了我的好奇心,遂去百度-谷歌-官方文档一一查看,有了一定的了解,原来NSURLSession是iOS7中新的网络接口,它与咱们熟悉的NSURLConnection是并列的. 查找资料,写了一个小Demo,大家可以看看,有什么不足的地方,可以留言帮我指出来. // // HMTRootViewController.m // // // Created by HMT on 14-6-7.

iOS 并行编程:Operation Queues

1 简介 1.1 功能        Operation Queue也是IOS的一种并行编程技术,类似Dispatch Queue可以帮助用户管理多线程.但是Operation Queue将任务封装在NSOperation对象中,从而可以更好的控制任务的执行.并且Dispatch Queue的先入先出的执行方式不同,Operation Queue任务的执行顺序可以控制.其中IOS是将任务交给NSOperation对象进行管理,其中NSOperation是个抽象类,必须被继承,目前系统预定义了两个

IOS socket编程--Asyncsocket

iPhone的标准推荐是CFNetwork 库编程,其封装好的开源库是 cocoa AsyncSocket库,用它来简化CFNetwork的调用,它提供了异步操作 主要特性有: 队列的非阻塞的读和写,而且可选超时.你可以调用它读取和写入,它会当完成后告知你 自动的socket接收.如果你调用它接收连接,它将为每个连接启动新的实例,当然,也可以立即关闭这些连接 委托(delegate)支持.错误.连接.接收.完整的读取.完整的写入.进度以及断开连接,都可以通过委托模式调用 基于run loop的,

[HMLY]11.iOS函数式编程的实现&&响应式编程概念

简介 本篇主要回顾一下--iOS函数式编程 && 响应式编程概念 ,如何一步步实现函数式编程的过程,对阅读Masonry && SnapKit源码有一定的帮助. 作为一个iOS 开发者,那么你一定用过Masnory/ SnapKit: Masonry是一个OC开发中,非常好用的自动布局的第三方框架: SnapKit是Masonry团队打造的swift版本的自动布局框架:如果你没有用过,在自动布局中用的是苹果原生的或者原生的升级版VFL语言,那我只好为你点"赞&qu