iOS開發網路篇—實現一個視頻播放用戶端小應用(二)

來源:互聯網
上載者:User

標籤:

轉自:http://www.cnblogs.com/wendingding/p/3815211.html

一、實現視頻播放功能

實現效果:

啟動項目後,點擊對應的cell,即可播放視頻。

   

程式碼範例:

主控制器代碼如下:

  1 //  2 //  YYViewController.m  3 //  01-文頂頂用戶端  4 //  5 //  Created by apple on 14-6-29.  6 //  Copyright (c) 2014年 itcase. All rights reserved.  7 //  8   9 #import "YYViewController.h" 10 #import "MBProgressHUD+MJ.h" 11 #import "YYviodesModel.h" 12 #import "UIImageView+WebCache.h" 13 #import "YYCell.h" 14 #import <MediaPlayer/MediaPlayer.h> 15  16 @interface YYViewController () 17 @property(nonatomic,strong)NSArray *videos; 18  19 @end 20  21 @implementation YYViewController 22  23 - (void)viewDidLoad 24 { 25     [super viewDidLoad]; 26     //去掉底線 27     self.tableView.separatorStyle=UITableViewCellSeparatorStyleNone; 28      29     [MBProgressHUD showMessage:@"正在努力載入中"]; 30      31     //建立路徑 32  33     NSString  *[email protected]"http://192.168.1.53:8080/MJServer/video"; 34     NSURL *url=[NSURL URLWithString:urlStr]; 35      36     //建立請求 37     NSMutableURLRequest  *request=[NSMutableURLRequest requestWithURL:url];//預設為get請求 38     //設定最大的網路等待時間 39     request.timeoutInterval=20.0; 40      41     //擷取主隊列 42     NSOperationQueue *queue=[NSOperationQueue mainQueue]; 43     //發起請求 44    [NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { 45        //隱藏HUD 46         [MBProgressHUD hideHUD]; 47        if (data) {//如果請求成功,拿到伺服器返回的資料 48            //解析拿到的資料(JSON方式) 49            NSDictionary *dict=[NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil]; 50 //           NSArray *array=dict[@"video"]; 51            NSArray *array=dict[@"videos"]; 52             53            NSMutableArray *videos=[NSMutableArray array]; 54            for (NSDictionary *dict in array) { 55                YYviodesModel *model=[YYviodesModel viodesModelWithDict:dict]; 56                [videos addObject:model]; 57            } 58            self.videos=videos; 59             60            //重新整理表格 61            [self.tableView reloadData]; 62             63        }else//如果請求失敗,沒有拿到資料 64        { 65            [MBProgressHUD showError:@"網路繁忙,等稍後再試!"]; 66        } 67         68    }]; 69 } 70  71 #pragma mark-資料來源方法 72 -(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 73 { 74     return 1; 75 } 76 -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 77 { 78     return self.videos.count; 79 } 80 -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 81 { 82     static NSString *[email protected]"ID"; 83     YYCell *cell=[tableView dequeueReusableCellWithIdentifier:ID]; 84     if (cell==nil) { 85         cell=[[YYCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:ID]; 86     } 87      88     //擷取資料模型 89     YYviodesModel *model=self.videos[indexPath.row]; 90     cell.textLabel.text=model.name; 91     NSString *length=[NSString stringWithFormat:@"時間長度%d分鐘",model.length]; 92     cell.detailTextLabel.text=length; 93      94     // video.image == resources/images/minion_01.png 95     NSString *imageUrl = [NSString stringWithFormat:@"http://192.168.1.53:8080/MJServer/%@", model.image]; 96  97     //這裡使用了第三方架構 98     [cell.imageView  setImageWithURL:[NSURL URLWithString:imageUrl] placeholderImage:[UIImage imageNamed:@"placeholder"]]; 99     100     return cell;101 }102 103 //設定cell的行高104 -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath105 {106     return 70;107 }108 109 //播放視頻110 -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath111 {112     //取出資料模型113     YYviodesModel *model=self.videos[indexPath.row];114     115     //建立視屏播放器116  //   MPMoviePlayerController 可以隨意控制播放器的尺寸117     //MPMoviePlayerViewController只能全屏播放118     119         NSString *url = [NSString stringWithFormat:@"http://192.168.1.53:8080/MJServer/%@", model.url];120     NSURL *videoUrl=[NSURL URLWithString:url];121     MPMoviePlayerViewController *movieVc=[[MPMoviePlayerViewController alloc]initWithContentURL:videoUrl];122     //彈出播放器123     [self presentMoviePlayerViewControllerAnimated:movieVc];124     125 }126 @end

注意:要是有視頻播放功能,還需要匯入下面的架構。

在主控制器檔案中,匯入架構的主標頭檔。

 

二、實現螢幕方向的控制

說明:iphone支援三個方向的播放。

程式支援三個方向。(不支援向下顛倒-home鍵在上面)    如果要求只支援豎屏,那麼最直接的做法是直接在設定檔中把另外兩個勾去掉。實現螢幕控制的方法(supported)。
 1 #pragma mark-實現螢幕方向的控制 2 /** 3  *  控制當前控制器支援那些方向 4  * 5  *  傳回值是 UIInterfaceOrientationMask* 6  */ 7 -(NSUInteger)supportedInterfaceOrientations 8 {/** 9   *UIInterfaceOrientationMaskPortrait:豎屏(正常)10   *UIInterfaceOrientationMaskPortraitUpsideDown:豎屏(上下顛倒)11   *UIInterfaceOrientationMaskLandscapeLeft:橫屏向左12   *UIInterfaceOrientationMaskLandscapeRight:橫屏向右13   *UIInterfaceOrientationMaskLandscape:橫屏(左右都支援)14   *UIInterfaceOrientationMaskAll:所有都支援15   */16     return UIInterfaceOrientationMaskAll;17 }

說明:最外面的控制器不是tableviewcontrol控制器,而是導航控制器。如果要實現“視屏列表介面只支援豎屏方向,而播放介面只支援橫屏”的需求,那麼應該自訂一個導航控制器,重寫實現螢幕方向的方法。

(1)實現“視屏列表介面只支援豎屏方向

自訂一個YYNavigationController,其繼承自UINavigationController

 1 // 2 //  YYNavigationController.m 3 //  01-文頂頂用戶端 4 // 5 //  Created by apple on 14-6-29. 6 //  Copyright (c) 2014年 itcase. All rights reserved. 7 // 8  9 #import "YYNavigationController.h"10 11 @interface YYNavigationController ()12 13 @end14 15 @implementation YYNavigationController16 17 //視屏列表介面只支援豎屏方向18 #pragma mark-實現螢幕方向的控制19 /**20  *  控制當前控制器支援那些方向21  *22  *  傳回值是 UIInterfaceOrientationMask*23  */24 -(NSUInteger)supportedInterfaceOrientations25 {/**26   *UIInterfaceOrientationMaskPortrait:豎屏(正常)27   *UIInterfaceOrientationMaskPortraitUpsideDown:豎屏(上下顛倒)28   *UIInterfaceOrientationMaskLandscapeLeft:橫屏向左29   *UIInterfaceOrientationMaskLandscapeRight:橫屏向右30   *UIInterfaceOrientationMaskLandscape:橫屏(左右都支援)31   *UIInterfaceOrientationMaskAll:所有都支援32   */33     return UIInterfaceOrientationMaskPortrait;34 }35 @end

(2)實現播放介面只支援橫屏

自訂一個YYMoviePlayerViewController,其繼承自MPMoviePlayerViewController。

 1 // 2 //  YYMoviePlayerViewController.m 3 //  01-文頂頂用戶端 4 // 5 //  Created by apple on 14-6-29. 6 //  Copyright (c) 2014年 itcase. All rights reserved. 7 // 8  9 #import "YYMoviePlayerViewController.h"10 11 @interface YYMoviePlayerViewController ()12 13 @end14 15 @implementation YYMoviePlayerViewController16 17 18 //播放介面只支援橫屏19 #pragma mark-實現螢幕方向的控制20 21 -(NSUInteger)supportedInterfaceOrientations22 {23     return UIInterfaceOrientationMaskLandscape;24 }25 26 @end

主控制器中播放視頻部分的代碼修改如下:

匯入標頭檔

 1 //播放視頻 2 -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 3 { 4     //取出資料模型 5     YYviodesModel *model=self.videos[indexPath.row]; 6      7     //建立視屏播放器 8  //   MPMoviePlayerController 可以隨意控制播放器的尺寸 9     //MPMoviePlayerViewController只能全屏播放10     11         NSString *url = [NSString stringWithFormat:@"http://192.168.1.53:8080/MJServer/%@", model.url];12     NSURL *videoUrl=[NSURL URLWithString:url];13     YYMoviePlayerViewController *movieVc=[[YYMoviePlayerViewController alloc]initWithContentURL:videoUrl];14     //彈出播放器15     [self presentMoviePlayerViewControllerAnimated:movieVc];16 }

三、細節處理

1.問題:系統內建的MPMoviePlayerViewController,當程式進入背景時候就會自動銷毀。如何讓其保持狀態進入後台前的狀態?

原因:當系統進入背景時候會發出通知:UIApplicationDidEnterBackgroundNotification,而系統的MPMoviePlayerViewController會自動監聽該通知,當監聽到進入背景這個通知後,MPMoviePlayerViewController會調用方法銷毀。

解決方案:移除通知

    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationDidEnterBackgroundNotification object:nil];

//說明:移除self監聽的名稱為UIApplicationDidEnterBackgroundNotification的通知,參數為空白。

處理代碼:

 1 // 2 //  YYMoviePlayerViewController.m 3 //  01-文頂頂用戶端 4 // 5 //  Created by apple on 14-6-29. 6 //  Copyright (c) 2014年 itcase. All rights reserved. 7 // 8  9 #import "YYMoviePlayerViewController.h"10 11 @interface YYMoviePlayerViewController ()12 13 @end14 15 @implementation YYMoviePlayerViewController16 17 -(void)viewDidLoad18 {19     [super viewDidLoad];20     //移除程式進入背景通知21     [[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationDidEnterBackgroundNotification object:nil];22 }23 //播放介面只支援橫屏24 #pragma mark-實現螢幕方向的控制25 26 -(NSUInteger)supportedInterfaceOrientations27 {28     return UIInterfaceOrientationMaskLandscape;29 }30 31 @end

補充:1如果模擬器上的應用程式過多,可以把所有的應用程式都進行清除。

2在IOS中之支援一部分格式(通常支援MAC機上支援的格式,如MP4等)

如果要播放一些不支援的格式,可以藉助軟體解碼器。

通常要播放視頻,都需要進行解碼,解碼分為兩類:

(1)硬體解碼:硬體解碼更快,硬體裝置預設支援的格式

(2)軟體解碼:耗電大(通常不支援硬體解碼的只能通過軟體解碼的方式進行播放)如:VLC/ffmpeg(流媒體軟體解碼工具)

 

iOS開發網路篇—實現一個視頻播放用戶端小應用(二)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.