iOS中流媒體播放和下載

來源:互聯網
上載者:User

iOS中流媒體播放和下載

iOS中關於流媒體的簡介:介於下載本地播放與即時資料流媒體之間的一種播放形式,下載本地播放必須全部將檔案下載完成後才能播放,而漸進式下載不必等到全部下載完成後再播放,它可以一邊下載一邊播放,在完成播放內容之後,整個檔案會儲存在手機上。

即時資料流媒體

即時資料流媒體是一邊接收資料包一邊播放,本地不保留檔案副本,即時資料流式傳輸總是即時傳送,可以即時實況轉播,支援隨機訪問,使用者可以快進或者快退以觀看前面或後面的內容。即時資料流媒體傳輸必須保證資料包的傳輸速度大於檔案的播放速度,否則使用者看到的視頻會出現暫停。當網路堵塞情況下視頻品質會下降,所以要想保證視頻的品質漸進式下載會更好一些。

下面是本人親測的流媒體播放和下載教程:

1.介面搭建()

2.用到的第三方助手類

:http://pan.baidu.com/s/1hrvqXA8

3.開始項目-標頭檔及相關宏

LO_ViewController.h

#import #import #import "M3U8Handler.h"#import "VideoDownloader.h"#import "HTTPServer.h"@interface LO_ViewController : UIViewController@property (nonatomic, strong)HTTPServer * httpServer;@property (nonatomic, strong)VideoDownloader *downloader;@end

LO_ViewController.m

#import "LO_ViewController.h"@interface LO_ViewController ()@property (weak, nonatomic) IBOutlet UIProgressView *progressView;@property (weak, nonatomic) IBOutlet UILabel *progressLabel;@property (weak, nonatomic) IBOutlet UIButton *downloadButton;@property (weak, nonatomic) IBOutlet UIButton *clearButton;@end@implementation LO_ViewController- (void)viewDidLoad{    [super viewDidLoad];// Do any additional setup after loading the view, typically from a nib.        //開啟本機伺服器    [self openHttpServer];        if ([[[NSUserDefaults standardUserDefaults] objectForKey:@"isDownload"] boolValue]) {        [self.downloadButton setTitle:@"已完成" forState:UIControlStateNormal];        self.downloadButton.enabled = NO;        self.clearButton.enabled = YES;        M3U8Handler *handler = [[M3U8Handler alloc] init];        [handler praseUrl:[NSString stringWithFormat:@"http://v.youku.com/player/getM3U8/vid/XNjUxMTE4NDAw/type/mp4"]];        handler.playlist.uuid = @"XNjUxMTE4NDAw";        self.downloader = [[VideoDownloader alloc]initWithM3U8List:handler.playlist];        [self.downloader addObserver:self forKeyPath:@"clearCaches" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil]; // 判斷是否清理緩衝    }        }

#pragma mark - 開啟本機伺服器
- (void)openHttpServer{    self.httpServer = [[HTTPServer alloc] init];    [self.httpServer setType:@"_http._tcp."];  // 設定服務類型    [self.httpServer setPort:12345]; // 設定伺服器連接埠            // 擷取本地Library/Cache路徑下downloads路徑    NSString *webPath = [kLibraryCache 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);}}
#pragma mark - 清理緩衝- (IBAction)clearCaches:(id)sender {    [self.downloader cleanDownloadFiles];}
#pragma mark - 線上流媒體播放
- (IBAction)playStreamingMedia:(id)sender {        // 優酷視頻m3u8新地址格式如下:http://pl.youku.com/playlist/m3u8?vid=XNjUxMTE4NDAw&type=mp4    // 如果上面的連結不可用,那麼使用這個連結http://v.youku.com/player/getM3U8/vid/XNjUxMTE4NDAw/type/mp4,如果兩個串連都不可以用的話,那麼很大可能是優酷的伺服器掛掉了    // 如果上面的兩種格式都不行的話,考慮用這個格式,當然如果這個格式不行的話,是上面的,或者直接換個對應的m3u8的地址 http://pl.youku.com/playlist/m3u8?vid=162779600&ts=1407469897&ctype=12&token=3357&keyframe=1&sid=640746989782612d6cc70&ev=1&type=mp4&ep=dCaUHU2LX8YJ4ivdjj8bMyqxJ3APXP8M9BiCiNRiANQnS%2B24&oip=2043219268    NSURL *url = [[NSURL alloc] initWithString:@"http://pl.youku.com/playlist/m3u8?vid=162779600&ts=1407469897&ctype=12&token=3357&keyframe=1&sid=640746989782612d6cc70&ev=1&type=flv&ep=dCaUHU2LX8YJ4ivdjj8bMyqxJ3APXP8M9BiCiNRiANQnS%2B24&oip=2043219268"];    MPMoviePlayerViewController *player = [[MPMoviePlayerViewController alloc] initWithContentURL:url];        [self presentMoviePlayerViewControllerAnimated:player];    }
#pragma mark - 視頻下載
- (IBAction)downloadStreamingMedia:(id)sender {        UIButton *downloadButton = sender;        // 擷取本地Library/Cache路徑    NSString *localDownloadsPath = [kLibraryCache stringByAppendingPathComponent:kPathDownload];    // 擷取視頻本地路徑    NSString *filePath = [localDownloadsPath stringByAppendingPathComponent:@"XNjUxMTE4NDAw/movie.m3u8"];    NSFileManager *fileManager = [NSFileManager defaultManager];        // 判斷視頻是否緩衝完成,如果完成則播放本機快取    if ([fileManager fileExistsAtPath:filePath]) {        [downloadButton setTitle:@"已完成" forState:UIControlStateNormal];        downloadButton.enabled = NO;        }else{        M3U8Handler *handler = [[M3U8Handler alloc] init];        handler.delegate = self;        // 解析m3u8視頻地址        [handler praseUrl:@"http://pl.youku.com/playlist/m3u8?vid=162779600&ts=1407469897&ctype=12&token=3357&keyframe=1&sid=640746989782612d6cc70&ev=1&type=flv&ep=dCaUHU2LX8YJ4ivdjj8bMyqxJ3APXP8M9BiCiNRiANQnS%2B24&oip=2043219268"];                // 開啟網路指標        [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];    }}
#pragma mark - 播放本機快取視頻
- (IBAction)playVideoFromLocal:(id)sender {        NSString * playurl = [NSString stringWithFormat:@"http://127.0.0.1:12345/XNjUxMTE4NDAw/movie.m3u8"];    NSLog(@"本地視頻地址-----%@", playurl);        // 擷取本地Library/Cache路徑    NSString *localDownloadsPath = [kLibraryCache stringByAppendingPathComponent:kPathDownload];    // 擷取視頻本地路徑    NSString *filePath = [localDownloadsPath stringByAppendingPathComponent:@"XNjUxMTE4NDAw/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];    }}#pragma mark -#pragma mark - 視頻解析完成-(void)praseM3U8Finished:(M3U8Handler*)handler{    handler.playlist.uuid = @"XNjUxMTE4NDAw";    self.downloader = [[VideoDownloader alloc]initWithM3U8List:handler.playlist];    [self.downloader addObserver:self forKeyPath:@"currentProgress" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil]; // 設定觀察者用來得到當前下載的進度    [self.downloader addObserver:self forKeyPath:@"clearCaches" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil]; // 判斷是否清理緩衝    self.downloader.delegate = self;    [self.downloader startDownloadVideo]; // 開始下載}

#pragma mark - 通過觀察者監控下載進度顯示/緩衝清理

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{    if ([keyPath isEqualToString:@"clearCaches"]) {        self.downloadButton.enabled = YES;        [self.downloadButton setTitle:@"下載" forState:UIControlStateNormal];        self.clearButton.enabled = NO;        [[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithBool:NO] forKey:@"isDownload"];        [[NSUserDefaults standardUserDefaults] synchronize];        self.progressView.progress = 0.0;        self.progressLabel.text = [NSString stringWithFormat:@"%.2f%%", 0.0];    }else{        self.progressLabel.text = [NSString stringWithFormat:@"%.2f%%", 100 * [[change objectForKey:@"new"] floatValue]];        self.progressView.progress = [[change objectForKey:@"new"] floatValue];        if (self.progressView.progress == 1) {            [[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithBool:YES] forKey:@"isDownload"];            [self.downloadButton setTitle:@"已完成" forState:UIControlStateNormal];            [[NSUserDefaults standardUserDefaults] synchronize];            self.clearButton.enabled = YES;            self.downloadButton.enabled = NO;        }    }    }
#pragma mark - 視頻解析失敗-(void)praseM3U8Failed:(M3U8Handler*)handler{    NSLog(@"視頻解析失敗-failed -- %@",handler);    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"噢,NO~   

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.