ios流媒体--播放,下载

进式下载(伪流媒体)

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

实时流媒体

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

实时流媒体协议:

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(@"----------视频下载失败-----------");

}

时间: 2024-09-30 19:47:45

ios流媒体--播放,下载的相关文章

iOS音频播放、录音、视频播放、拍照、视频录制

随着移动互联网的发展,如今的手机早已不是打电话.发短信那么简单了,播放音乐.视频.录音.拍照等都是很常用的功能.在iOS中对于多媒体的支持是非常强大的,无论是音视频播放.录制,还是对麦克风.摄像头的操作都提供了多套API.在今天的文章中将会对这些内容进行一一介绍: 音频 音效 音乐 音频会话 录音 音频队列服务 视频 MPMoviePlayerController MPMoviePlayerViewController AVPlayer 摄像头 UIImagePickerController拍照

IOS 音频播放

iOS音频播放 (一):概述 Audio Playback in iOS (Part 1) : Introduction 前言 从事音乐相关的app开发也已经有一段时日了,在这过程中app的播放器几经修改我也因此对于iOS下的音频播放实现有了一定的研究.写这个系列的博客目的一方面希望能够抛砖引玉,另一方面也是希望能帮助国内其他的iOS开发者和爱好者少走弯路(我自己就遇到了不少的坑=.=). 本篇为<iOS音频播放>系列的第一篇,主要将对iOS下实现音频播放的方法进行概述. 基础 先来简单了解一

iOS音频播放 (一):概述 转

今天看到非常好的介绍音频开发的文章,转载一下 原文地址:http://msching.github.io/blog/2014/07/07/audio-in-ios/ 前言 从事音乐相关的app开发也已经有一段时日了,在这过程中app的播放器几经修改我也因此对于iOS下的音频播放实现有了一定的研究.写这个系列的博客目的一方面希望能够抛砖引玉,另一方面也是希望能帮助国内其他的iOS开发者和爱好者少走弯路(我自己就遇到了不少的坑=.=). 本篇为<iOS音频播放>系列的第一篇,主要将对iOS下实现音

iOS音频播放之AudioQueue(一):播放本地音乐

AudioQueue简介 AudioStreamer说明 AudioQueue详解 AudioQueue工作原理 AudioQueue主要接口 AudioQueueNewOutput AudioQueueAllocateBuffer AudioQueueEnqueueBuffer AudioQueueStart Pause Stop Flush Reset Dispose AudioQueueFreeBuffer AudioQueueGetProperty AudioQueueSetProper

iOS音频播放(一):概述

(本文转自码农人生) 前言 从事音乐相关的app开发也已经有一段时日了,在这过程中app的播放器几经修改,我也因此对于iOS下的音频播放实现有了一定的研究.写这个 系列的博客目的一方面希望能够抛砖引玉,另一方面也是希望能帮助国内其他的iOS开发者和爱好者少走弯路(我自己就遇到了不少的坑). 本篇为<iOS音频播放>系列的第一篇,主要将对iOS下实现音频播放的方法进行概述. 基础 先来简单了解一下一些基础的音频知识. 目前我们在计算机上进行音频播放都需要依赖于音频文件,音频文件的生成过程是将声音

iOS音乐播放器相关

iOS音乐播放器框架主要有两大类:AvPlayer.AvaudioPlayer AvPlayer 能播放本地及网络歌曲 AvaudioPlayer 能播放本地歌曲.有相关代理方法(其实也可以播放网络歌曲,只不过该播放器播放网络歌曲是先将歌曲下载下来再进行播放) 下面记录一下相关要用到的方法 1.获取本地歌曲库(ipod路径)歌曲 // 读取本地音乐 MPMediaPropertyPredicate *albumNamePredicate = [MPMediaPropertyPredicate p

iOS多图片下载

iOS多图片下载.在cell里面下载图片.做了缓存优化. (app.icon是图片地址) // 先从内存缓存中取出图片 UIImage *image = self.images[app.icon]; if (image) { // 内存中有图片 cell.imageView.image = image; } else { // 内存中没有图片 // 获得Library/Caches文件夹 NSString *cachesPath = [NSSearchPathForDirectoriesInDo

iOS教程:详解iOS多图下载的缓存机制

ios教程,ios的干货一直来不及给大家分享,小编也是一直在忙啊!今天给大家献上ios:详解iOS多图下载的缓存机制 1. 需求点是什么? 这里所说的多图下载,就是要在tableview的每一个cell里显示一张图片,而且这些图片都需要从网上下载. 2. 容易遇到的问题 如果不知道或不使用异步操作和缓存机制,那么写出来的代码很可能会是这样: cell.textLabel.text = app.name; cell.detailTextLabel.text = app.download;NSDat

iOS音频播放 (五):AudioQueue

码农人生 ChengYin's coding life 主页 Blog 分类 Categories 归档 Archives 关于 About Weibo GitHub RSS Where there is a will, there is a way. -- Thomas Edison Aug 2nd, 2014 Audio, iOS, iOS Audio iOS音频播放 (五):AudioQueue Audio Playback in iOS (Part 5) : AudioQueue 在第三