AVPlayer 类事件
Posted
技术标签:
【中文标题】AVPlayer 类事件【英文标题】:AVPlayer class events 【发布时间】:2011-08-30 15:13:42 【问题描述】:AVPlayer 类中有委托方法吗?我需要处理诸如电话等中断。AVAudioPlayer 支持。如果 AVPlayer 不支持,如何使用 AVAudioPlayer 流式传输音频?
【问题讨论】:
【参考方案1】:AVPlayer
没有您想要的方法,但您可以改用AVAudiosession
对象
1) 选择AVAudioSession
对象(例如[AVAudioSession sharedInstance]
)
2) 通过调用setActive:error:
方法将其设置为活动
3)设置它的委托(类实现AVAudioSessionDelegate
协议)
4) 实现委托的方法如
-(void)beginInterruption;
-(void)endInterruptionWithFlags:(NSUInteger)flags;
-(void)endInterruption;
【讨论】:
【参考方案2】:编辑
我在AVPlayer class 中看不到任何可用的代表
那么如何使用 AVAudioPlayer 流式传输音频?因为我们不知道您需要如何流式传输它,最重要的是从哪里,提供一些灵感 查看相关问题:
stopping an AVAudioPlayer Reusing an AVAudioPlayer for a different sound avaudioplayer playingsong Streaming with an AVAudioplayer http://blog.guvenergokce.com/avaudioplayer-on-iphone-simulator/57/ http://www.iphonedevsdk.com/forum/iphone-sdk-development/15991-sample-code-avaudioplayer.html和教程
http://mobileorchard.com/easy-audio-playback-with-avaudioplayer/AVAudioPlayerDelegate 协议参考 http://developer.apple.com/library/ios/#documentation/AVFoundation/Reference/AVAudioPlayerDelegateProtocolReference/Reference/Reference.html#//apple_ref/doc/uid/TP40008068
响应声音播放完成 – audioPlayerDidFinishPlaying:成功:
响应音频解码错误 – audioPlayerDecodeErrorDidOccur:error:
处理音频中断 – audioPlayerBeginInterruption: – audioPlayerEndInterruption: – audioPlayerEndInterruption:withFlags:
【讨论】:
我知道这件事。我在我的问题中写了它:) “AVAudioPlayer 支持它”,我对 AVPlayer 很感兴趣【参考方案3】:我认为 AVPlayer 不会让你到达那里。看看 AVAudioPlayerDelegate,audioPlayerBeginInterruption 将是您正在寻找的委托方法。
这是我用于 AVAudioPlayer 的代码示例(我假设您已经知道如何构建您的 url):
// Instantiates the AVAudioPlayer object, initializing it with the sound
NSError * errAV = nil;
AVAudioPlayer *newPlayer = [[AVAudioPlayer alloc] initWithContentsOfUrl: mUrl error: &errAV];
if (newPlayer == nil)
NSString * msg = [[NSString alloc] initWithFormat:@"An internal error has occured: %@", [errAV localizedDescription]];
UIAlertView *uiav = [[UIAlertView alloc] initWithTitle:@"Play Sound"
message:msg delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
[uiav show];
[uiav release];
[msg release];
else
self.appSoundPlayer = newPlayer;
[newPlayer release];
// "Preparing to play" attaches to the audio hardware and ensures that playback
// starts quickly when the user taps Play
[appSoundPlayer prepareToPlay];
[appSoundPlayer setVolume: 1.0];
[appSoundPlayer setDelegate: self];
[appSoundPlayer play];
【讨论】:
对不起,错过了那部分!不,我不认为你可以用 AVPlayer 做到这一点。使用 AVAudioPlayer 进行流式传输非常简单——我将在我的主要内容中弹出一些代码,我认为我不能将代码放在我的评论中! 有时您必须使用 AVPlayer,但...例如,AVAudioPlayer 无法播放人的 iTunes 库中的音频。【参考方案4】:即使在使用 AVAudioPlayer 时,您也可以初始化音频会话,您可以在其中指定您将执行的播放(或录制,就此而言)类型,以及用于处理电话等中断的回调。
看看AudioSessionInitialize()
,它是第三个参数,一个处理中断的回调函数。在您的回调中,您可以同时处理中断的开始和结束。
使用 AudioSession 和依赖 AVAudioPlayer 回调之间的显着区别在于前者发生在较低级别,可能在调用后者的委托方法之前。因此,我认为使用 AudioSession 回调,您可以进行更好的控制,但是您可能需要做更多的事情,这取决于您的应用音频设置的复杂性。
【讨论】:
【参考方案5】:问题发布已经很久了。不过,为了完整起见,我想补充一点:AVPlayer 可以通过添加 TimeObserver 来处理中断,如下所示:
初始化 AVPlayer 时:
AVPlayer *_aplayer;
id _aplayerObserver;
_aplayer = [[AVPlayer alloc] initWithURL:mediaURL];
_aplayerObserver = [_aplayer addPeriodicTimeObserverForInterval:CMTimeMake(1.0, 1.0) queue:NULL usingBlock:^(CMTime time)
if (((time.value/time.timescale) >= (_aplayer.currentItem.asset.duration.value/_aplayer.currentItem.asset.duration.timescale))
// media file played to its end
// you can add here code that should run after the media file is completed,
// thus mimicing AVAudioPlayer's audioPlayerDidFinishPlaying event
else
if (_aplayer.rate == 0)
// audio player was interrupted
如果您选择此解决方案,请注意addPeriodicTimeObserverForInterval
的文档中所说的内容:
您必须保留返回的值 [即_aplayerObserver] 只要您希望播放器调用时间观察器。此方法的每次调用都应与对 removeTimeObserver 的相应调用配对:。
【讨论】:
以上是关于AVPlayer 类事件的主要内容,如果未能解决你的问题,请参考以下文章
Swift,如何在 AVPlayer 上播放视频期间获得事件点击完成按钮?
访问 iPod 库以使用 AVAudioPlayer 或使用 AVPlayer 远程控制事件