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 远程控制事件

iOS开发:AVPlayer实现流音频边播边存

为啥我在 AppDelegate 中的 AVPlayer 类引用返回 nil?

iOS开发 - AVPlayer实现流音频边播边存

AVPlayer 缓冲后未恢复