如何开发一个 AVPlayer iPad 程序
来源:互联网 发布:icmp ping 端口 编辑:程序博客网 时间:2024/06/06 01:56
原文:http://klanguedoc.hubpages.com/hub/iOS-How-To-Implement-AirPlay-in-an-AVPlayer-iPAD-Application
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:@"
http://somedomain.yourvideo.mp4"];
- 然后用 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:@"
http://somedomain.yourvideo.mp4"];
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
- 如何开发一个 AVPlayer iPad 程序
- 如何开发一个程序
- iOS开发 - 用AVPlayer封装一个播放器
- iOS开发 - 用AVPlayer封装一个视频播放器
- 如何检测程序运行在ipad上
- iPhone/iPad程序 如何 禁止自动休眠
- 关于iPad程序如何强制横屏
- AVPlayer开发笔记
- iOS AVPlayer音频开发
- iOS 开发 AVPlayer 深入浅出
- IPad程序开发概要-Xcode4版本
- iPad平板电脑程序开发基础规则
- 如何新建Cocos2d开发iPad版项目
- ipad开发
- iPad开发
- iPad开发
- iOS 开发:AVPlayer播放视频
- iOS开发中 AVPlayer 深入浅出
- web.xml文件中<mime-mapping>
- Xshell 双击鼠标左键 换行的问题
- python 异常处理
- OpenGL 颜色混合函数 glBlendFunc() 及cocos2d中的战争迷雾效果
- 从eclipse中直接下载工程
- 如何开发一个 AVPlayer iPad 程序
- IOS 应用开发中, Universal 版坐标问题的一点研究
- Qt线程间的信号与槽 以及 QThread
- Oracle包被锁定的原因分析及解决方案
- redis主从的配置和使用 :不同机器
- java基础知识点
- Araxis Merge 中文乱码问题的解决
- C语言指针未初始化情况
- Linux Find 命令使用详解