我遇到一些问题,一旦屏幕锁定/应用程序背景化,MPMoviePlayerController同时播放音频和视频以继续播放。
这是我尝试过的:
“必需的背景模式”是带有第一个条目的数组:[Item 0:App Plays Audio]。
另外,我的视图控制器有:
-(void)viewDidLoad {
[super viewDidLoad];
AVAudioSession *audioSession = [AVAudioSession sharedInstance];
NSError *setCategoryError = nil;
BOOL success = [audioSession setCategory:AVAudioSessionCategoryPlayback error:&setCategoryError];
if (!success) {
NSLog(@"DOH Could not set Category!");
}
NSError *activationError = nil;
success = [audioSession setActive:YES error:&activationError];
if (!success) {
NSLog(@"DOH Could not set Active!");
}
…
}
- (void)viewWillAppear:(BOOL)animated {
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
[self becomeFirstResponder];
}
- (void)remoteControlReceivedWithEvent:(UIEvent *)event {
switch (event.subtype) {
case UIEventSubtypeRemoteControlPlay:
NSLog(@"Play");
break;
case UIEventSubtypeRemoteControlPause:
NSLog(@"Pause");
break;
default:
break;
}
}
- (BOOL)canBecomeFirstResponder{
return YES;
}
我正在尝试修改的应用程序(用于所有意图和目的)LBYouTubeView的示例应用程序,它允许您通过确定流URL并使用MPMoviePlayerController播放来播放YouTube视频。上面的完整代码是on github - 它是一个修改过的LBYouTubeView项目。
音频/视频播放正常,但当应用程序最小化时(无论我尝试什么),MPMoviePlayerController都会暂停。
我仔细阅读了文档&所以解决方案,但无济于事。
注意:Apple的Technote“[在后台播放媒体](在后台播放媒体)”声明:
播放视频的应用程序无法在后台播放该视频。
但接着说:
注意:如果您禁用电影中的视频曲目,或将AVPlayerLayer与其关联的AVPlayer分离,它将允许电影音频继续在后台播放。
那么 - 有没有人对如何实现这一点有任何想法?我知道我可以将提取的YouTube网址提供给Matt Gallagher's Audio Streamer之类的内容,并获得完整的仅音频支持播放/暂停/手机锁定等功能,但不幸的是我仍然需要视频。感谢
P.S。重复一下:我正在尝试使用的代码是on github我的更改 - 它只是一个修改过的LBYouTubeView项目,除了我上面详述的内容之外,几乎没有什么变化。
编辑 Matt Gallagher已经written a post on CocoaWithLove解决了这个问题 - 当应用程序最小化时,他似乎决定切换到仅音频流,但他承认这有点不可靠,因为它导致几秒钟的静音(当最小化和恢复应用程序时),同时缓冲新流。不理想:(
答案 0 :(得分:0)
结束解决方法如下(用RubyMotion编写,但在语义上与obj-c相同):
将这些添加到您的init方法:
NSNotificationCenter.defaultCenter.addObserver(self, selector:'will_enter_foreground', name:UIApplicationWillEnterForegroundNotification, object:nil)
NSNotificationCenter.defaultCenter.addObserver(self, selector:'did_enter_background', name:UIApplicationDidEnterBackgroundNotification, object:nil)
然后:
def will_enter_foreground
unless @player.nil?
@player.currentItem.tracks.each do |track|
track.enabled = true if track.assetTrack.mediaType.eql?AVMediaTypeVideo
end
end
end
def did_enter_background
unless @player.nil?
@player.currentItem.tracks.each do |track|
track.enabled = false if track.assetTrack.mediaType.eql?AVMediaTypeVideo
end
end
end