问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何开发一个 AVPlayer iPad 程序

发布网友 发布时间:2022-05-12 20:01

我来回答

1个回答

热心网友 时间:2023-07-31 15:50

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
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
初中英语语法讲解:名词所有格 关于名词所有格一问 暗区突围画面怎么设置最好-暗区突围画面设置推荐 暗区突围打开的箱子怎么关上 保险箱关闭攻略 暗区突围 暗区突围画面设置怎么弄最佳? 暗区突围 暗区突围光影怎么调? 暗区突围 暗区突围中间白点怎么设置? 暗区突围灵敏度怎么调最稳 暗区突围灵敏度最佳设置方法 我的WIN7 64位系统无法安装打印机HP1136,请支持啊,急。驱动下载也没用... win7电脑连接不上惠普打印机Win7系统安装不了惠普HP1007打印机 铜线发黑怎么处理呀 不锈钢产品氮化会变形吗? 我在好期贷上借钱但找不到借钱软件了怎么办? 铸钢球阀阀体材料一般是什么? 球墨铸铁缺陷(缩松、小气孔)如何修复,要求修复后几乎看不出痕迹,修复完毕后表面镀镍处理,请大侠指点 DIV+CSS做的网站容易被搜索引擎收录还是? 真心技术小白, ULED和OLED中的U、O分别指什么?有什么区别?百度的结果完全不懂,懂的大神请简单介绍 我的电脑玩英雄联盟很卡 怎么解决啊! 我家电脑网速很好,但是玩LOL非常卡,电脑配置绝对没问题,就是很卡,怎么办? 电脑运行英雄联盟特别卡 下载什么东西可以提速? 知识产权贯标流程 知君袖里有丽珠是什么意思 知君袖里有骊珠,生不逢辰亦强图。可叹头颜已如许,而今方的贵人扶 求 知君袖里有广寒BY蓬岛客txt 知君袖里有广寒txt 谁有呀!求! 男js是什么意思 饭圈js是什么意思 CPU,显卡,内存,超频时电压怎么设置最好? 金士顿DDR2 667内存超频到800需要增加电压吗,增加多少合适? 2013年江西理工大学赣州校区可不可以修工程管理及会计学双学位,假如一个是文史类另一个是理工类,可不可 2017年和2018年的公需课为什么学习了没有更新到学技网 中国四大网络中,表示中国科学技术网的是() 怎么在山东科学技术官网上下载鲁科版三年级下册英语同步练习册的听力 在云南省科学技术网站上有一个科技型中小企业认定的系统登录页面,为什么我的电脑点了注册按钮没有反应? 为什么我的家在南京市中山门,而我显示的IP地址查到的确是北京市中国科学技术网?求各位高人帮忙???谢谢了 中国教育和科研计算机网、中国公用计算机互联网、中国科学技术网。这些是ISP还是网站还是一个 什么网可学技术 上班时间比较空闲。有哪些技能学习网站推荐? 学技术上什么网 请问下有什么网站,可以学技术的,我想做有技术的生意,吃手艺的饭,因为现在什么都不会,想学了技术然后 五笔打字非常难用英语怎么翻译 用五笔打字的高手来翻译一下 五笔翻译成汉字,Daisy麻烦了 五笔打字fanyi 上海静安慕舍好不好? 上海静安慕舍优劣势? 上海静安慕舍什么情况? 静安慕舍目前是什么情况? 上海静安慕舍具体信息? 静安慕舍现在什么价格?