进式下载(伪流媒体)

介于下载本地播放与实时流媒体之间的一种播放形式,下载本地播放必须全部将文件下载完成后才能播放,而渐进式下载不必等到全部下载完成后再播放,它可以一边下载一边播放,在完成播放内容之后,整个文件会保存在手机上。

实时流媒体

实时流媒体是一边接收数据包一边播放,本地不保留文件副本,实时流式传输总是实时传送,可以实时实况转播,支持随机访问,用户可以快进或者快退以观看前面或后面的内容。实时流媒体传输必须保证数据包的传输速度大于文件的播放速度,否则用户看到的视频会出现暂停。当网络堵塞情况下视频质量会下降,所以要想保证视频的质量渐进式下载会更好一些。

实时流媒体协议:

RTSP(Real Time Streaming Protocol)

MMS(Microsoft Media Server protocol)

HLS(Http Live Streaming)

这里主要介绍HLS,

HLS(HTTP Live Streaming)是苹果公司针对iPhone、iPod、iTouch和iPad等移动设备而开发的基于HTTP协议的流媒体解决方案

https://developer.apple.com/streaming/

技术关键点

1.采集视频源和音频源的数据

2.对原始数据进行H264编码和AAC编码

3.视频和音频数据封装为MPEG-TS包

4.HLS分段生成策略及m3u8索引文件

5.HTTP传输协议

搭建HLS流媒体服务器

Apache HTTP Server (苹果自带)

Tomcat Web Server

IIS(Internet Information Services)

这里只推荐Apache HTTP Server

打开终端,vi /etc/apache2/httpd.conf

在<IfModule mime_module>下

添加两行

AddType application/x-mpegURL.M3U8

AddType video/MP2T.ts

可能你的权限不够,那就用 sudo chmod 777 /etc/apache2/httpd.conf

然后 vi /etc/apache2/httpd.conf

重启服务器

sudo apachectl restart

==============================================

或者搭建xmpp服务器  或者不搭建,从优酷获取m3u8

==============================================

创建一个工程

从git中下载库:http://git.oschina.net/1213125967/HLS

将库导入工程

需要引入第三方开源框架:ASIHttpRequest,CocoaHTTPServer,m3u8

需要导入系统框架:libsqlite3.dylib、libz.dylib、libxml2.dylib、CoreTelephony.framework、SystemConfiguration.framework、MobileCoreServices.framework、Security.framework、CFNetwork.framework、MediaPlayer.framework

在library search path 中添加 /usr/include/libxml2

添加头文件

?
1
2
3
4
#import <MediaPlayer/MediaPlayer.h>
#import "M3U8Handler.h"
#import "VideoDownloader.h"
#import "HTTPServer.h"

声明属性:

?
1
2
@property (nonatomic, strong)HTTPServer * httpServer;
@property (nonatomic, strong)VideoDownloader *downloader;

预先播放,毕先设置服务器

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#pragma mark - 打开本地服务器
- ( void )openHttpServer
{
     self.httpServer = [[HTTPServer alloc] init];
     [self.httpServer setType:@ "_http._tcp." ];   // 设置服务类型
     [self.httpServer setPort:12345];  // 设置服务器端口
     
     // 获取本地Documents路径
     NSString *pathPrefix = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES) objectAtIndex:0];
     
     // 获取本地Documents路径下downloads路径
     NSString *webPath = [pathPrefix stringByAppendingPathComponent:kPathDownload];
     NSLog(@ "-------------\nSetting document root: %@\n" , webPath);
     
     // 设置服务器路径
     [self.httpServer setDocumentRoot:webPath];
     NSError *error;
     
     if (![self.httpServer start:&error])
     {
         NSLog(@ "-------------\nError starting HTTP Server: %@\n" , error);
     }
}

搭建完成后,播放什么的,都是取决于需求

在线流媒体播放

?
1
2
3
4
5
6
     // 优酷视频m3u8新地址格式如下:http://pl.youku.com/playlist/m3u8?vid=XNzIwMDE5NzI4&type=mp4
     // 如果上面的链接不可用,那么使用这个链接http://v.youku.com/player/getM3U8/vid/XNzIwMDE5NzI4/type/flv
     NSURL *url = [[NSURL alloc] initWithString:@ "http://v.youku.com/player/getM3U8/vid/XNzIwMDE5NzI4/type/mp4" ];
     MPMoviePlayerViewController *player = [[MPMoviePlayerViewController alloc] initWithContentURL:url];
     
     [self presentMoviePlayerViewControllerAnimated:player];

视频下载

?
1
2
3
4
5
6
7
     M3U8Handler *handler = [[M3U8Handler alloc] init];
     handler.delegate = self;
     // 解析m3u8视频地址
     [handler praseUrl:[NSString stringWithFormat:@ "http://pl.youku.com/playlist/m3u8?vid=XNzIwMDE5NzI4&type=mp4" ]];
     
     // 开启网络指示器
     [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];

播放本地视频

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
     NSString * playurl = [NSString stringWithFormat:@ "http://127.0.0.1:12345/XNzIwMDE5NzI4/movie.m3u8" ];
     NSLog(@ "本地视频地址-----%@" , playurl);
     
     // 获取本地Documents路径
     NSString *pathPrefix = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES) objectAtIndex:0];
     
     // 获取本地Documents路径下downloads路径
     NSString *localDownloadsPath = [pathPrefix stringByAppendingPathComponent:kPathDownload];
     
     // 获取视频本地路径
     NSString *filePath = [localDownloadsPath stringByAppendingPathComponent:@ "XNzIwMDE5NzI4/movie.m3u8" ];
     NSFileManager *fileManager = [NSFileManager defaultManager];
     
     // 判断视频是否缓存完成,如果完成则播放本地缓存
     if  ([fileManager fileExistsAtPath:filePath]) {
         MPMoviePlayerViewController *playerViewController =[[MPMoviePlayerViewController alloc]initWithContentURL:[NSURL URLWithString: playurl]];
         [self presentMoviePlayerViewControllerAnimated:playerViewController];
     }
     else {
         UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@ "Sorry"  message:@ "当前视频未缓存"  delegate:self cancelButtonTitle:@ "确定"  otherButtonTitles:nil, nil];
         [alertView show];
     }

添加代理 <M3U8HandlerDelegate,VideoDownloadDelegate>

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#pragma mark --------------视频解析完成----------------
-( void )praseM3U8Finished:(M3U8Handler*)handler
{
     handler.playlist. uuid  = @ "XNzIwMDE5NzI4" ;
     self.downloader = [[VideoDownloader alloc]initWithM3U8List:handler.playlist];
     [self.downloader addObserver:self forKeyPath:@ "totalprogress"  options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil];
     self.downloader.delegate = self;
     [self.downloader startDownloadVideo];
}
-( void )observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:( void  *)context
{
     NSLog(@ "下载进度 - %f" , self.downloader.totalprogress);
}
#pragma mark --------------视频解析失败----------------
-( void )praseM3U8Failed:(M3U8Handler*)handler
{
     NSLog(@ "视频解析失败-failed -- %@" ,handler);
}
#pragma mark --------------视频下载完成----------------
-( void )videoDownloaderFinished:(VideoDownloader*)request
{
     [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];
     [request createLocalM3U8file];
     NSLog(@ "----------视频下载完成-------------" );
}
#pragma mark --------------视频下载失败----------------
-( void )videoDownloaderFailed:(VideoDownloader*)request
{
     NSLog(@ "----------视频下载失败-----------" );
}

原文出自:http://my.oschina.net/CgShare/blog/302303

iOS 第三方之流媒体相关推荐

  1. 常用的iOS第三方框架

    转载自:https://github.com/Tim9Liu9/TimLiu-iOS 目录 UI 下拉刷新 模糊效果 AutoLayout 富文本 图表 表相关与Tabbar 隐藏与显示 HUD与To ...

  2. 结合正则 抓取的iOS 第三方

    +++++抓取方法在后面+++++ 第三方 用途 EGOTableViewPullRefresh 最早的下拉刷新控件. SVPullToRefresh 下拉刷新控件. XHRefreshControl ...

  3. 手把手教你使用CocoaPods管理你的iOS第三方开源类库

    手把手教你使用CocoaPods管理你的iOS第三方开源类库 本文转载自:http://kittenyang.com/cocoapods 鉴于我开这个博客的初衷是记录自己平时的技术积累,而我平时又属研 ...

  4. Android11键盘弹出动画,(2016-11-04完美解决)移动端iOS第三方输入法遮挡底部input及android键盘回落后留白问题...

    问题概述 问题1:H5 web 移动端 输入框, 键盘唤起后fixed定位好的元素跟随页面滚动了起来- fixed属性失效了!满屏任性横飞, 如下图: 问题2:有几后来含些在到气时按式近篇来又的方浏消 ...

  5. iOS第三方集成之jpush极光推送

    iOS第三方集成之jpush极光推送 现在很多app都带推送功能,极光推送是很受大家欢迎的第三方推送,本文将为iOS初学者和初次设计开发推送的攻城狮们提供以下自己的使用心得. 大家可以边参考官方文档, ...

  6. IOS第三方框架集合

    简   注册 登录  添加关注 作者 xuejunjun 2015.06.06 17:39* 写了14057字,被17人关注,获得了116个喜欢 IOS第三方框架集合 字数6100 阅读17132 评 ...

  7. fir.im Weekly - 热门 iOS 第三方库大盘点

    本期 fir.im Weekly 收集的热度资源,大部分关于www.gyjqfkyy.comAndroid.iOS 开发工具.源码和脑洞大开的 UI 动画,希望给你带来更多的工作创意与灵感. 盘点国内 ...

  8. IOS 第三方开源库汇总

    IOS 第三方开源库汇总 1. 常用开源库简介 2. 统计工具 3. 数据埋点工具 4. 社交分享集成工具 5. 网络通信,网络数据工具 6. 音视频处理工具 7. 图像处理工具 8. 云存储 9. ...

  9. 项目中常用的 iOS 第三方库

    数据相关 Haneke:数据缓存,包括 UIImage.NSData.JSON.String-- FMDB:SQLite 数据库 CryptoSwift:各种加密 ObjectMapper: JSON ...

最新文章

  1. BCH推出BCH粉丝互动平台
  2. MySQL Group Replication 部署 (Single Master)
  3. Web群集与日志管理Haproxy搭建
  4. WEB前端 实现图片懒加载 echo.js
  5. 深入业务成为更好的软件架构师——信息化建设图鉴一二例
  6. 怎么修改服务器上的cpt文件,DELL-服务器-RAID-配置详解(28页)-原创力文档
  7. linux 安装maven
  8. SparkStreaming读取本地文件进行wordCount
  9. jar包的生成及运行
  10. 安卓模拟器genymotion连接eclipse成功但是不显示其中项目
  11. [算法]bitmap算法
  12. 人工智能及其应用-产生式系统实验-植物识别系统-java
  13. 《亲密关系》读书笔记
  14. ios描述文件下载安装
  15. 计算机远程操作之后怎么保护,电脑远程控制怎么操作 两种方法介绍
  16. 60个超实用的网络技能学习平台
  17. 新电脑如何进行磁盘分区?
  18. DEP(数据执行保护)介绍
  19. 阿里云-内容安全-接口demo
  20. 解决pycharm中中文列表输出'\xe5\xa4\xa7\xe8\x92\x9c'之类的字符串

热门文章

  1. red hat linux用户名密码,linux Red Hat Enterprise Linux Server root帐户密码
  2. java okHttp3
  3. Java JNA (五)—— 释放Memory对象分配的内存
  4. ubuntu中文输入法+谷歌输入法
  5. 潇洒郎: centos windows 命令行常用
  6. 欧元汇率java测试题_目前,多数国家(包括我国人民币)采用的汇率标价法是( )。_学小易找答案...
  7. JavaScript-T2
  8. 日语中7个必须知道的词句
  9. 如何将word等office文件添加到右键的新建菜单
  10. java se11.0.1安装_Java SE Development Kit V11.0.1 64位官方版