swift 屏幕旋转事件avplayer 为什么显示在其他屏幕

[swift]iOS 8,AVPlayer 背景音乐在播放,remoteControlReceivedWithEvent 不会调用
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.
我想要播放声音在我的应用程序 (使用 swift ),在 didFinishLaunchingWithOptions 我写这个的功能
AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback, error: nil)
AVAudioSession.sharedInstance().setActive(true, error: nil)
我有 UIView 包含 AVPlayer 。
UIApplication.sharedApplication().beginReceivingRemoteControlEvents()
self.becomeFirstResponder()
和 remoteControlReceivedWithEvent 函数。当应用程序进入背景时,声音继续发挥,但当我单击暂停按钮 (我们用来播放和暂停声音从外部应用程序) remoteControlReceivedWithEvent 永远不会被调用!
解决方法 1:
在我的项目: 我把这个叫做UITabbarViewController
-(BOOL)canBecomeFirstResponder{
return YES;
-(void)viewWillAppear:(BOOL)animated
[super viewWillAppear:animated];
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
[self becomeFirstResponder];
请确保它可以成为第一个响应。
不被称为 AVAudio remoteControlReceivedWithEventThe page is temporarily unavailable
nginx error!
The page you are looking for is temporarily unavailable.
Please try again later.
Website Administrator
Something has triggered an error on your
This is the default error page for
nginx that is distributed with
It is located
/usr/share/nginx/html/50x.html
You should customize this error page for your own
site or edit the error_page directive in
the nginx configuration file
/etc/nginx/nginx.conf.16.Swift 播放视频
16.Swift 播放视频
在播放音频时,就了解到了官方不推荐使用MPMoviePlayerViewController,并且9.0以后将要废弃,是因为要主推AVPlayerViewController。
其实AVPlayerViewController是可以播放视频的,苹果这么做,也是为了统一播放媒体的API
var avPlayerViewController:AVPlayerViewController!
@IBAction func playVideo(sender: AnyObject) {
let url:NSURL = NSBundle.mainBundle().URLForResource(AngelBeats, withExtension: mp4)!
NSLog((url))
// 实例化AVPlayer
let player = AVPlayer(URL: url)
// 实例化AVPlayerViewController
self.avPlayerViewController = AVPlayerViewController()
// 设置AVPlayerViewController的AVPlayer
self.avPlayerViewController.player = player
// Controller跳转
self.presentViewController(self.avPlayerViewController, animated: true){
() -& Void in
// 调用AVPlayerViewController的AVPlayer进行播放
self.avPlayerViewController.player?.play()
(window.slotbydup=window.slotbydup || []).push({
id: '2467140',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467141',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467143',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467148',
container: s,
size: '1000,90',
display: 'inlay-fix'从前&&不。我在
从事一个为 Hyundai(现代) 进行的项目,当进入某个场景时,两个视频需要同时播放,以便用户能够看到当汽车是否存在某种特性(比如电子稳定控制系统)时会如何运作。作为一名经验丰富的开发者,我立即告诉客户我们应该合并两个视频,以便能在 iOS 上&同时播放&。我向他解释了,为了在 iOS 上播放视频,苹果已经在很久之前发布了 MediaPlayer.framework,根据(并且实际上 :P )在同一时间不能够播放一个以上的视频(尽管你可以有两个 MPMoviePlayerController 实例)。
他说好的,然后我们就像之前那样做了播放功能。但是,需求发生了改变,并且我们不得不添加一个在循环播放的背景视频&& 结果我在如何协调多个视频时遇到了问题,我要同时只播放一个视频并且不引起用户的注意。
幸运的是在这个星期一, 把派我到在巴西圣保罗瓜鲁柳斯机场举行的 ,我加入了 Media Technologies Evangelist 讨论中,
以及 MediaPlayer.framework (又称 MPMoviePlayerController )是如何用它来播放视频的。在伴随着红酒和奶酪的交谈后,我开始和 Eryk 讲述我的问题并向他阐述准备如何解决这个问题。他的回答类似于&当然!大胆去干! iOS 肯定能在同一时间播放多个视频的!&&呃&&大约 4 个是极限。&这个回答让我很高兴并感到好奇,所以我又问他,既然不受框架限制,为什么 MediaPlayer.framework 不能同时播放多个视频&&他告诉我 MPMoviePlayerController 之前是被用来在游戏中做场景切换的。。。这就是为什么之前的 iOS 版本只能全屏播放,该局限是个历史遗留问题。
当我回到我的笔记本前,我用 AVFoundation.framework 写了一个非常基础的视频播放版本。显然,当我回到公司后,我需要写一个更加详细的版本才能用在项目中。
好了,故事讲完了。让我们回到工作中来!
AVFoundation 框架提供了 AVPlayer 对象来实现单视频或多视频播放的控制器和用户接口。由 AVPlayer 对象生成的可视结果可以显示在 AVPlayerLayer 类的 CoreAnimation 层上。 在 AVFoundation 中,AVAsset 对象用来表示定时影音媒体,比如视频和音频。根据,每个资源包含一个用来一起呈现或处理的轨道集合,每个统一媒体类型,包括不仅限于音频、视频、文本、隐藏式字幕、字幕。因为定时影音媒体的性质,在成功初始化一个资源后,某些或全部键值可能不会立即可用。为了避免阻塞主线程,你可以在特定键注册你感兴趣的内容,以在可用时被通知到。
考虑到这一点,继承 UIViewController 并命名为 VideoPlayerViewController。就像 MPMoviePlayerController ,让我们添加一个 NSURL 属性,用于告诉我们应该从哪里抓取视频。就像上面描述的那样,添加下面的代码,一旦 URL 被赋值 AVAsset 就会被加载。
#pragma mark - Public methods
- (void)setURL:(NSURL*)URL {
[_URL release];
_URL = [URL copy];
AVURLAsset *asset = [AVURLAsset URLAssetWithURL:_URL options:nil];
NSArray *requestedKeys = [NSArray arrayWithObjects:kTracksKey,
kPlayableKey, nil];
[asset loadValuesAsynchronouslyForKeys:requestedKeys
completionHandler: ^{ dispatch_async(
dispatch_get_main_queue(), ^{
[self prepareToPlayAsset:asset
withKeys:requestedKeys];
- (NSURL*)URL {
return _URL;
所以,一旦视频的 URL 被赋值后,创建一个资源来检查被指定的URL引用的源并且异步的加载这个资源的 &tracks& 和 &playable& 键值。等加载结束后,我们就可以在主线程操作 AVPlayer(当播放状态动态改变时,主线程可以确保安全的获取播放器的非原子属性)。
#pragma mark - Private methods
- (void)prepareToPlayAsset: (AVURLAsset *)asset withKeys:
(NSArray *)requestedKeys {
for (NSString *thisKey in requestedKeys) {
NSError *error =
AVKeyValueStatus keyStatus = [asset
statusOfValueForKey:thisKey
error:&error];
if (keyStatus == AVKeyValueStatusFailed) {
if (!asset.playable) {
if (self.playerItem) {
[self.playerItem removeObserver:self forKeyPath:kStatusKey];
[[NSNotificationCenter defaultCenter] removeObserver:self
name:AVPlayerItemDidPlayToEndTimeNotification
object:self.playerItem];
self.playerItem = [AVPlayerItem playerItemWithAsset:asset];
[self.playerItem addObserver:self forKeyPath:kStatusKey
options:NSKeyValueObservingOptionInitial |
NSKeyValueObservingOptionNew
AVPlayerDemoPlaybackViewControllerStatusObservationContext];
if (![self player]) {
[self setPlayer:[AVPlayer playerWithPlayerItem:self.playerItem]];
[self.player addObserver:self forKeyPath:kCurrentItemKey
options:NSKeyValueObservingOptionInitial |
NSKeyValueObservingOptionNew
AVPlayerDemoPlaybackViewControllerCurrentItemObservationContext];
if (self.player.currentItem != self.playerItem) {
[[self player] replaceCurrentItemWithPlayerItem:self.playerItem];
在资源所有需要的键值加载完成后,我们检查是否加载成功以及该资源是否可以播放。如果这样,我们初始化一个 AVPlayerItem (用来表示能被 AVPlayer 对象播放的资源的表示状态)和一个 AVPlayer 来播放的资源。请注意,我在这一点上没有添加任何错误处理。在这里,我们应该创建一个委托并让视图控制器或正在使用你的播放器的用户,决定如何以最好的方式来处理可能出现的错误。
我们也添加了一些键值监听以便于当我们的视图被绑定到播放器时和 AVPlayerItem 准备好播放时收到通知。
#pragma mark - Key Valye Observing
- (void)observeValueForKeyPath: (NSString*) path
ofObject: (id)object
change: (NSDictionary*)change
context: (void*)context {
if (context == AVPlayerDemoPlaybackViewControllerStatusObservation
Context) {
AVPlayerStatus status = [[change objectForKey:
NSKeyValueChangeNewKey] integerValue];
if (status == AVPlayerStatusReadyToPlay) {
[self.player play];
} else if (context == AVPlayerDemoPlaybackViewControllerCurrentItem
ObservationContext) {
AVPlayerItem *newPlayerItem = [change objectForKey:
NSKeyValueChangeNewKey];
if (newPlayerItem) {
[self.playerView setPlayer:self.player];
[self.playerView setVideoFillMode:
AVLayerVideoGravityResizeAspect];
[super observeValueForKeyPath:path ofObject: object
change:change context:context];
一旦 AVPlayerItem 设置好后,我们可以自由的将 AVPlayer 添加到用来展示可视输出的播放器层。我们也会确保保留视频的长宽比和适合视频图层的边界内。
一旦 AVPlayer 准备好了,就让它开始播放!让 iOS 来完成艰巨的任务 :)
正如我前面所说,为了播放资源可视组件,您需要一个包含 AVPlayerLayer 的视图,来指挥 AVPlayer 对象的输出。下面演示了如何子类化 UIView 来满足要求︰
@implementation VideoPlayerView
+ (Class)layerClass {
return [AVPlayerLayer class];
- (AVPlayer*)player {
return [(AVPlayerLayer*)[self layer] player];
- (void)setPlayer: (AVPlayer*)player {
[(AVPlayerLayer*)[self layer] setPlayer:player];
- (void)setVideoFillMode: (NSString *)fillMode {
AVPlayerLayer *playerLayer = (AVPlayerLayer*)[self layer];
playerLayer.videoGravity = fillM
到这里就结束了!
当然,我没有贴上所有用来编译和运行的项目代码,但我不会让你失望 !转到
并下载完整的源代码 !
Copyright &
All Rights Reserved &&&&&&

我要回帖

更多关于 swift 屏幕旋转事件 的文章

 

随机推荐