iOS 第三方之流媒體

摘要:進式下載(偽流媒體) 介于下載本地播放與實時流媒體之間的一種播放形式弥雹,下載本地播放必須全部將文件下載完成后才能播放,而漸進式下載不必等到全部下載完成后再播放消别,它可以一邊下載一邊播放契沫,在完成播放內(nèi)容之后,整個文件會保存在手機上观堂。 實時流媒體 實時流媒體是一邊接收數(shù)據(jù)包一邊播放让网,本地不保...

進式下載(偽流媒體)

介于下載本地播放與實時流媒體之間的一種播放形式呀忧,下載本地播放必須全部將文件下載完成后才能播放,而漸進式下載不必等到全部下載完成后再播放溃睹,它可以一邊下載一邊播放而账,在完成播放內(nèi)容之后,整個文件會保存在手機上因篇。

實時流媒體

實時流媒體是一邊接收數(shù)據(jù)包一邊播放泞辐,本地不保留文件副本笔横,實時流式傳輸總是實時傳送,可以實時實況轉(zhuǎn)播咐吼,支持隨機訪問吹缔,用戶可以快進或者快退以觀看前面或后面的內(nèi)容。實時流媒體傳輸必須保證數(shù)據(jù)包的傳輸速度大于文件的播放速度锯茄,否則用戶看到的視頻會出現(xiàn)暫停厢塘。當網(wǎng)絡(luò)堵塞情況下視頻質(zhì)量會下降,所以要想保證視頻的質(zhì)量漸進式下載會更好一些肌幽。

實時流媒體協(xié)議:

RTSP(Real Time Streaming Protocol)

MMS(Microsoft Media Server protocol)

HLS(Http Live Streaming)

這里主要介紹HLS晚碾,

HLS(HTTP Live Streaming)是蘋果公司針對iPhone、iPod喂急、iTouch和iPad等移動設(shè)備而開發(fā)的基于HTTP協(xié)議的流媒體解決方案

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

技術(shù)關(guān)鍵點

1.采集視頻源和音頻源的數(shù)據(jù)

2.對原始數(shù)據(jù)進行H264編碼和AAC編碼

3.視頻和音頻數(shù)據(jù)封裝為MPEG-TS包

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

5.HTTP傳輸協(xié)議

搭建HLS流媒體服務器

Apache HTTP Server (蘋果自帶)

Tomcat Web Server

IIS(Internet Information Services)

這里只推薦Apache HTTP Server

打開終端格嘁,vi /etc/apache2/httpd.conf

在下

添加兩行

AddType application/x-mpegURL.M3U8

AddType video/MP2T.ts

可能你的權(quán)限不夠,那就用 sudo chmod 777 /etc/apache2/httpd.conf

然后 vi /etc/apache2/httpd.conf

重啟服務器

sudo apachectl restart

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

或者搭建xmpp服務器 ?或者不搭建廊移,從優(yōu)酷獲取m3u8

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

創(chuàng)建一個工程

從git中下載庫:http://git.oschina.net/1213125967/HLS

將庫導入工程

需要引入第三方開源框架:ASIHttpRequest糕簿,CocoaHTTPServer,m3u8

需要導入系統(tǒng)框架:libsqlite3.dylib狡孔、libz.dylib冶伞、libxml2.dylib、CoreTelephony.framework步氏、SystemConfiguration.framework响禽、MobileCoreServices.framework、Security.framework荚醒、CFNetwork.framework芋类、MediaPlayer.framework

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

添加頭文件

#import

#import?"M3U8Handler.h"

#import?"VideoDownloader.h"

#import?"HTTPServer.h"

聲明屬性:

@property (nonatomic, strong)HTTPServer * httpServer;

@property?(nonatomic,?strong)VideoDownloader?*downloader;

預先播放,畢先設(shè)置服務器

#pragma mark - 打開本地服務器

-?(void)openHttpServer

{

self.httpServer?=?[[HTTPServer?alloc]?init];

[self.httpServer?setType:@"_http._tcp."];//?設(shè)置服務類型

[self.httpServer?setPort:12345];//?設(shè)置服務器端口

//?獲取本地Documents路徑

NSString?*pathPrefix?=?[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES)?objectAtIndex:0];

//?獲取本地Documents路徑下downloads路徑

NSString?*webPath?=?[pathPrefix?stringByAppendingPathComponent:kPathDownload];

NSLog(@"-------------\nSetting?document?root:?%@\n",?webPath);

//?設(shè)置服務器路徑

[self.httpServer?setDocumentRoot:webPath];

NSError?*error;

if(![self.httpServer?start:&error])

{

NSLog(@"-------------\nError?starting?HTTP?Server:?%@\n",?error);

}

}

搭建完成后界阁,播放什么的侯繁,都是取決于需求

在線流媒體播放

// 優(yōu)酷視頻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];

視頻下載

M3U8Handler *handler = [[M3U8Handler alloc] init];

handler.delegate?=?self;

//?解析m3u8視頻地址

[handler?praseUrl:[NSString?stringWithFormat:@"http://pl.youku.com/playlist/m3u8?vid=XNzIwMDE5NzI4&type=mp4"]];

//?開啟網(wǎng)絡(luò)指示器

[[UIApplication?sharedApplication]?setNetworkActivityIndicatorVisible:YES];

播放本地視頻

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 >

#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(@"----------視頻下載失敗-----------");

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市较剃,隨后出現(xiàn)的幾起案子咕别,更是在濱河造成了極大的恐慌,老刑警劉巖写穴,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件惰拱,死亡現(xiàn)場離奇詭異,居然都是意外死亡啊送,警方通過查閱死者的電腦和手機偿短,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進店門欣孤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人昔逗,你說我怎么就攤上這事降传。” “怎么了勾怒?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵搬瑰,是天一觀的道長。 經(jīng)常有香客問我控硼,道長泽论,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任卡乾,我火速辦了婚禮翼悴,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘幔妨。我一直安慰自己鹦赎,他們只是感情好,可當我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布误堡。 她就那樣靜靜地躺著古话,像睡著了一般。 火紅的嫁衣襯著肌膚如雪锁施。 梳的紋絲不亂的頭發(fā)上陪踩,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天,我揣著相機與錄音悉抵,去河邊找鬼肩狂。 笑死,一個胖子當著我的面吹牛姥饰,可吹牛的內(nèi)容都是我干的傻谁。 我是一名探鬼主播,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼列粪,長吁一口氣:“原來是場噩夢啊……” “哼审磁!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起岂座,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤态蒂,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后掺逼,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體吃媒,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年吕喘,在試婚紗的時候發(fā)現(xiàn)自己被綠了赘那。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡氯质,死狀恐怖募舟,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情闻察,我是刑警寧澤拱礁,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站辕漂,受9級特大地震影響呢灶,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜钉嘹,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一鸯乃、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧跋涣,春花似錦缨睡、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至沛贪,卻和暖如春陋守,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背利赋。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工愧哟, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留掀宋,地道東北人。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像美浦,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子剧腻,可洞房花燭夜當晚...
    茶點故事閱讀 44,611評論 2 353

推薦閱讀更多精彩內(nèi)容