如何開發一個 AVPlayer iPad 程式

來源:互聯網
上載者:User

AirPlay 並不是新東西,它在 iOS 4.3 SDK 中就存在了。但AirPlay API 中不斷有新的東西加入。其中一個有趣新特性是 iPad 程式能通過 Apple TV 2 播放來自 iOS 裝置上的內容,或者鏡像iPad 2 上的螢幕內容。

簡而言之,AirPlay 就是將媒體內容投放到高清顯示器(電視)或高清音效系統上。Apple TV 2 則是用於串連 iOS 裝置或 iTunes與高清裝置之間的橋樑。

隨著 iOS 5 的出現,任何使用 AV Foundation 類的程式都能從程式中投放音視頻內容到 Apple TV。你可以用MPMoviewPlayerController 通過 AirPlay 將當前現正播放的內容投影到高清電視或其它高清顯示裝置上。另一個進步是從UIWebView 投放視頻,這是激動人心的改進,因為這意味著我們可以直接從 web 上將線上的音視頻投影到電視或者 Apple TV 2 上。

使用 AVFoundation 投影視頻內容
要在應用程式中使用 AVFoundation,需要實現 AVPlayer 並設定 allowsAirPlayVideo 為 YES 以開啟 AirPlay,或者設定為NO 以關閉 AirPlay,如以下代碼所示:

-(BOOL)setAirPlay:(BOOL)airplayMode{

   return self.player.allowsAirPlayVideo=airplayMode;

}
 

編寫應用程式
為了示範如何建立 AVPlayer 應用程式以及實現 AirPlay,我們將建立一個 Single View Application(注意勾選 UseStoryboards),建立一個 AVPlayer 類並實現 AirPlay 特性。

 建立一個 Single View Application。目標類型可以選擇 iPhone、iPod 或者 iPad。建立項目之後,再匯入 AV Foundation 架構。
接著建立一個新 class,命名為 Player,並繼承 UIView 類。在標頭檔中,加入 AVPlayer 類並增加一個 AVPlayer 屬性。如下列代碼所示。
@class AVPlayer;

@interface Player : UIView

@property(nonatomic, strong) AVPlayer * player;
 

接下來就是實現 Player 類。
我們實現了最基本的 AVPlayer 需要實現的最起碼的 4 個方法,同時還提供了一個方法作為我們的 AirPlay 開關。
首先我們需要一個 AVLayer 類的封裝類。該類是一個 CALayer 子類,用於對媒體的可視內容進行管理。建立封裝類的代碼如下:
+ (Class)layerClass {

    return [AVPlayerLayer class];

}
 

然後為需要一個方法,執行個體化一個 AVPlayer 對象(我們在標頭檔中定義的)。如下列代碼所示。
-(AVPlayer *) player{

    return [(AVPlayerLayer *)[self layer] player];

}
 

在 setPlayer 方法中,如下列代碼所示,有一個 AVPlayer 參數,用於將一個 AVPlayer 執行個體添加到 UIView。這個 UIView 子類,將用在主 View Controller 中。
- (void)setPlayer:(AVPlayer*)player {

    [(AVPlayerLayer*)[self layer] setPlayer:player];

}
 

這個類的最後一個方法是 setAirPlay 方法。其參數將用於指定 AVPlayer UIView (Player)的allowsAirPlayVideo 屬性。如以下代碼所示。
-(BOOL)setAirPlay:(BOOL)airplayMode{

   return self.player.allowsAirPlayVideo=airplayMode;

}
 

為視頻的輸出指定圖層(AVPLayerLayer)時,可以指定任意數量的圖層,只要能方便控制內容顯示。比如說處理音頻和視頻之間的時間同步。通過setDisplayMode,你可以設定用於顯示的圖層,先建立一個 AVPlayerLayer 對象作為顯示圖層,然後修改它的屬性。預設是AVLayerVideoGravityResizeAspect 屬性,另外也可以設定 AVLayerVideoGravityResizeAspectFill 屬性和AVLayerVideoGravityResize 屬性。 AVLayerVideoGravityResizeAspect 保持視頻的寬高比並使播放內容自動適應播放視窗的大小。AVLayerVideoGravityResizeAspectFill 和前者類似,但它是以播放內容填充而不是適應播放視窗的大小。最後一個值會展開播放內容以適應播放視窗。

Player 類的完整代碼如下:

#import <UIKit/UIKit.h>

#import <AVFoundation/AVFoundation.h>

@class AVPlayer;

@interface Player : UIView

@property(nonatomic, strong) AVPlayer * player;

-(BOOL) setAirPlay:(BOOL) airplayMode;

@end

#import "Player.h"

#import <AVFoundation/AVFoundation.h>

@implementation Player

+ (Class)layerClass {

    return [AVPlayerLayer class];

}

-(AVPlayer *) player{

    return [(AVPlayerLayer *)[self layer] player];

}

- (void)setPlayer:(AVPlayer*)player {

    [(AVPlayerLayer*)[self layer] setPlayer:player];

}

//Enable or disable AirPlay mode

-(BOOL)setAirPlay:(BOOL)airplayMode{

   return self.player.allowsAirPlayVideo=airplayMode;

}

@end
 

在程式中使用 Player (UIView子類)
上述程式碼封裝括了Player (AVPlayer 的 UIView 子類)的.h檔案和.m 檔案。

要在一個 UIViewController 中使用這個 AVPlayer 視圖,開啟 Xcode 的故事板(storyboard,前提是建立項目時使用了“useStoryboard”選項)。選中UIView(不是 UIViewController)並將它的類修改為 Player。你可以在 Identity 面板的 customeclass 欄位輸入,也可以從它的下拉式清單中選擇。

開啟 Assistant Editor ,為 UIView 子類 Player 建立一個 IBOutlet,從 view 用右鍵拖到右邊的標頭檔中即可。如所示。

建立IBActions 和 IBOutlets  串連

建立一個委託到  klViewController 。在 Player 上右鍵,從 IBOutlet 拖一個連接線到  klViewController (dock 上的黃色方塊) ,如所示。

添加委託串連  klViewController

在故事版中,加一個 Toolbar 。在 Toolbar 是加入兩個按鈕,分別將標籤文本設定為 Play 和 Pause。然後加一個 Switch,用於切換AirPlay 開關狀態。為這 3 個控制項建立相應的 IBAction(可以用 Assistant Editor)。剩下的事情在 klViewController 類中進行。

開啟 klViewController.h 檔案,加入 @class Player 和 @class AVPlayer 語句並匯入 AVFoundation 架構和 Player.h。原始碼見下:
 
#import <UIKit/UIKit.h>

#import <AVFoundation/AVFoundation.h>

#import "Player.h"

@class Player;

@class AVPlayer;

@interface klViewController : UIViewController
 

聲明一個 AVPlayer 屬性,用於載入到 Palyer 視圖中。
聲明一個 NSURL 屬性。然後是 Switch 控制項的 IBOutlet(用 Assistant Editor建立)。
kvLiewController.h 檔案代碼如下:
#import <UIKit/UIKit.h>

#import <AVFoundation/AVFoundation.h>

#import Player.h

@class Player;

@class AVPlayer;

@interface klViewController : UIViewController

@property(nonatomic, strong) AVPlayer * myPlayer;

@property(nonatomic, strong) NSURL * avContentUrl;

@property (strong, nonatomic) IBOutlet Player *airPlayView;

@property (nonatomic, retain) IBOutlet UISwitch * AirPlaySwitch;

- (IBAction)PlayVideo:(id)sender;

- (IBAction)PauseVideo:(id)sender;

- (IBAction)isAirPlayOn:(id)sender;

@end
 

接下來是類的實現檔案。在 viewDidLoad 方法中,用一個視頻檔案的 URL 地址初始化 avContentUrl:
avContentUrl = [[NSURL alloc] initWithString  

然後用 avContentUrl 初始化一個 AVPlayer ,用於給標頭檔中定義的 myPlayer 屬性賦值。將 myPlayer 賦給 airPlayView 的 player 屬性,airPlayerView 是一個 Player 對象。如下列代碼所示:
self.myPlayer = [AVPlayer playerWithURL:avContentUrl];

[airPlayView setPlayer:[self myPlayer]];
 

現在,要實現兩個按鈕的視頻播放和暫停功能,以及 Switch 控制項的 AirPlay 開關功能。播放按鈕的 action 方法代碼如下所示:
- (IBAction)PlayVideo:(id)sender {

    [self.myPlayer play];

}
 

暫停按鈕的 action 方法代碼如下所示:
- (IBAction)PauseVideo:(id)sender {

    [self.myPlayer pause];

}
 

Switch 控制項的 action 方法代碼如下所示:
- (IBAction)isAirPlayOn:(id)sender {

    AirPlaySwitch = (UISwitch *) sender;

    if (AirPlaySwitch.on) {

        [airPlayView setAirPlay:NO];

    }else

    {

        [airPlayView setAirPlay:YES];

    }

}
 

結尾
另一個與 AirPlay 有關的屬性是 usesAirPlayVideoWhileAirPlayScreenIsActive ,它用於自動在在播放期間將 AVPlayer 切換到 AirPlay,當然僅僅是在 AirPlay 已開啟的情況下。預設是 false 的。

要運行本樣本程式,需要在 iPad 上進行,並將 iPad 串連至 Apple TV 同一 wifi 網路,然後視頻資源的 URL 必須是有效。在模擬器中AirPlay 是無效的。

klViewController.h 檔案
#import <UIKit/UIKit.h>

#import <AVFoundation/AVFoundation.h>

#import "Player.h"

@class Player;

@class AVPlayer;

@interface klViewController : UIViewController

@property(nonatomic, strong) AVPlayer * myPlayer;

@property(nonatomic, strong) NSURL * avContentUrl;

@property (strong, nonatomic) IBOutlet Player *airPlayView;

@property (nonatomic, retain) IBOutlet UISwitch * AirPlaySwitch;

 - (IBAction)PlayVideo:(id)sender;

 - (IBAction)PauseVideo:(id)sender;

 - (IBAction)isAirPlayOn:(id)sender;

 @end
 

klViewController.m  檔案
#import "klViewController.h"

 @implementation klViewController

@synthesize airPlayView;

@synthesize avContentUrl, myPlayer, AirPlaySwitch;

  - (void)didReceiveMemoryWarning

{

    [super didReceiveMemoryWarning];

    // Release any cached data, images, etc that aren't in use.

}

 #pragma mark - View lifecycle

 - (void)viewDidLoad

{

    [super viewDidLoad];

     //This is an Apple sample video

    avContentUrl = [[NSURL alloc] initWithString:@"     self.myPlayer = [AVPlayer playerWithURL:avContentUrl];

    [airPlayView setPlayer:[self myPlayer]];

     [self.myPlayer play];

}

 - (void)viewDidUnload

{

     [self setAirPlayView:nil];

    [super viewDidUnload];

    // Release any retained subviews of the main view.

    // e.g. self.myOutlet = nil;

}

 - (void)viewWillAppear:(BOOL)animated

{

    [super viewWillAppear:animated];

}

 - (void)viewDidAppear:(BOOL)animated

{

    [super viewDidAppear:animated];

}

 

- (void)viewWillDisappear:(BOOL)animated

{

    [super viewWillDisappear:animated];

}

 - (void)viewDidDisappear:(BOOL)animated

{

    [super viewDidDisappear:animated];

}

 - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation

{

    // Return YES for supported orientations

    return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);

}

 - (IBAction)PlayVideo:(id)sender {

    [self.myPlayer play];

 

}

 

- (IBAction)PauseVideo:(id)sender {

    [self.myPlayer pause];

 }

 - (IBAction)isAirPlayOn:(id)sender {

    AirPlaySwitch = (UISwitch *) sender;

    if (AirPlaySwitch.on) {

        [airPlayView setAirPlay:NO];

    }else

    {

         [airPlayView setAirPlay:YES];

    }

}

 @end
 

 

 

聯繫我們

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