如何开发一个 AVPlayer iPad 程序

如何开发一个 AVPlayer iPad 程序,第1张

AirPlay 并不是新东西,它在 iOS 43 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 selfplayerallowsAirPlayVideo=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 selfplayerallowsAirPlayVideo=airplayMode;

}

为视频的输出指定图层(AVPLayerLayer)时,可以指定任意数量的图层,只要能方便控制内容显示。比如说处理音频和视频之间的时间同步。通过setDisplayMode,你可以设置用于显示的图层,先创建一个 AVPlayerLayer 对象作为显示图层,然后修改它的属性。默认是AVLayerVideoGravityResizeAspect 属性,另外也可以设置 AVLayerVideoGravityResizeAspectFill 属性和AVLayerVideoGravityResize 属性。 AVLayerVideoGravityResizeAspect 保持视频的宽高比并使播放内容自动适应播放窗口的大小。AVLayerVideoGravityResizeAspectFill 和前者类似,但它是以播放内容填充而不是适应播放窗口的大小。最后一个值会拉伸播放内容以适应播放窗口。

Player 类的完整代码如下:

#import <UIKit/UIKith>

#import <AVFoundation/AVFoundationh>

@class AVPlayer;

@interface Player : UIView

@property(nonatomic, strong) AVPlayer player;

-(BOOL) setAirPlay:(BOOL) airplayMode;

@end

#import "Playerh"

#import <AVFoundation/AVFoundationh>

@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 selfplayerallowsAirPlayVideo=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 类中进行。

打开 klViewControllerh 文件,加入 @class Player 和 @class AVPlayer 语句并导入 AVFoundation 框架和 Playerh。源代码见下:

#import <UIKit/UIKith>

#import <AVFoundation/AVFoundationh>

#import "Playerh"

@class Player;

@class AVPlayer;

@interface klViewController : UIViewController

声明一个 AVPlayer 属性,用于加载到 Palyer 视图中。

声明一个 NSURL 属性。然后是 Switch 控件的 IBOutlet(用 Assistant Editor创建)。

kvLiewControllerh 文件代码如下:

#import <UIKit/UIKith>

#import <AVFoundation/AVFoundationh>

#import Playerh

@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 对象。如下列代码所示:

selfmyPlayer = [AVPlayer playerWithURL:avContentUrl];

[airPlayView setPlayer:[self myPlayer]];

现在,要实现两个按钮的视频播放和暂停功能,以及 Switch 控件的 AirPlay 开关功能。播放按钮的 action 方法代码如下所示:

- (IBAction)PlayVideo:(id)sender {

[selfmyPlayer play];

}

暂停按钮的 action 方法代码如下所示:

- (IBAction)PauseVideo:(id)sender {

[selfmyPlayer pause];

}

Switch 控件的 action 方法代码如下所示:

- (IBAction)isAirPlayOn:(id)sender {

AirPlaySwitch = (UISwitch ) sender;

if (AirPlaySwitchon) {

[airPlayView setAirPlay:NO];

}else

{

[airPlayView setAirPlay:YES];

}

}

结尾

另一个与 AirPlay 有关的属性是 usesAirPlayVideoWhileAirPlayScreenIsActive ,它用于自动在在播放期间将 AVPlayer 切换到 AirPlay,当然仅仅是在 AirPlay 已开启的情况下。默认是 false 的。

要运行本示例程序,需要在 iPad 上进行,并将 iPad 连接至 Apple TV 同一 wifi 网络,然后视频资源的 URL 必须是有效的。在模拟器中AirPlay 是无效的。

klViewControllerh 文件

#import <UIKit/UIKith>

#import <AVFoundation/AVFoundationh>

#import "Playerh"

@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

klViewControllerm 文件

#import "klViewControllerh"

@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:@" selfmyPlayer = [AVPlayer playerWithURL:avContentUrl];

[airPlayView setPlayer:[self myPlayer]];

[selfmyPlayer play];

}

- (void)viewDidUnload

{

[self setAirPlayView:nil];

[super viewDidUnload];

// Release any retained subviews of the main view

// eg selfmyOutlet = 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 {

[selfmyPlayer play];

}

- (IBAction)PauseVideo:(id)sender {

[selfmyPlayer pause];

}

- (IBAction)isAirPlayOn:(id)sender {

AirPlaySwitch = (UISwitch ) sender;

if (AirPlaySwitchon) {

[airPlayView setAirPlay:NO];

}else

{

[airPlayView setAirPlay:YES];

}

}

@end

中文生日歌

>

其实很简单,只要你对类的构造函数和析构函数了解的差不多。

首先说第一个问题:

/////为什么会突然出现"string t(p)"//

在函数 string::operator+(const charp)中,它接受一个字符指针p,返回一个string类对象,这个你懂吧?这就好办了,这个函数想返回一个string类对象,必须先建立一个对象吧?所以有string t(p);利用了

string(const chats)

{ptr=new char[strlen(s)+1];

strcpy(ptr,s);

}

这个构造函数,即把指针p传给构造函数,新建一个对象。

然后第二个:t=this+t; /////为什么会有两个t,它们各表示什么//

第一个t是等待被赋值的string类对象,this就是当前对象的内容,也就是谁调用了string::operator+(const charp),this就是谁(这里是另一个string对象)。然后this+t就是把两个string类对象相加,最后赋给对象t。

给你举个例子:

#include <iostreanh>

#include<stringh>

int main()

{

char s[20]="kkk is a good man";

string mystring("kkk is No1 ");

mystring=mystring+s;//调用运算符+即

//string::operator+ //(const

//charp)

return 0;

}

这个程序就调用了重载运算符,使string类对象内容变为“kkk is N01 kkk is a good man”

呵呵,到这你应该懂了一点吧?

/////////"t(p)"表示什么,为什么P在括号内//

我这个还用说吗?这是新建一个string类对象,以字符指针p作为参数,所以要在括号内。

{char temp[4096]; ///temp[4096]是什么///

你应该知道数组吧?比如int myint[10]就是建立一个整数变量数组,而且大小为10个整数的大小,同理,

char temp[4096]就是建立一个字符数组(和指针类似,就是有大小限定,指针没有限定),该字符数组的大小为4096个字符。

in>>temp; ///in>>是什么意思///

这是输入流的一个 *** 作符,意思是从键盘输入的内容(流)送入到计算机内供处理。这个 *** 作符被重载了,所以你可以从键盘上直接输入一个string类对象,比如这样cin>>mystring;就可以实现了。(mystring就是一个string类对象)

out<<sptr; //"out<<"是什么意思///

这是输出流的一个 *** 作符,意思是程序输出内容(流)送入屏幕等输出设备。这个 *** 作符重载后你就可以这样写程序了:cout<<mystring;

呵呵,简单吧

">>" 与 "<<"有什么作用

我就不用说这个了吧?

以上就是关于如何开发一个 AVPlayer iPad 程序全部的内容,包括:如何开发一个 AVPlayer iPad 程序、祝你生日快乐歌曲在哪里能下载、建立一个大小为10的数组;数组的初始值为 1.3.5...13;输入三个数插入到数组中, 并使数组保持有序,等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/zz/10084408.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-05
下一篇2023-05-05

发表评论

登录后才能评论

评论列表(0条)

    保存