使用AVPlayer处理流媒体事件

Que*_*yot 19 xcode stream avfoundation ios avplayer

我正在构建一个播放音频流的应用程序(来自webradio).

我正在使用AVPlayer它.

1)我想知道AVPlayer's当连接速度很慢或用户点击"播放"时你将如何处理"缓冲".我想检测出AVPlayer"缓冲"来显示UIActivityIndicatorView.

2)在后台运行时的同样问题.如果在这种情况下缓冲,我该怎么办?

谢谢 !

sci*_*sxp 27

对于第一个问题

你可以参考我对这个主题的回答ios avplayer触发器流是缓冲区

第二个

以下是我解决同样问题的方法:

在处理缓冲区空事件的内部添加以下代码:

    if (object == playerItem && [keyPath isEqualToString:@"playbackBufferEmpty"])
    {
        if (playerItem.playbackBufferEmpty) {
            [[NSNotificationCenter defaultCenter] postNotificationName:@"message" object:@"Buffering..."];

            if([[UIApplication sharedApplication] applicationState] == UIApplicationStateBackground)
            {
                task = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^(void) {
                }];
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

现在,您必须在缓冲区准备好再次运行后停止此后台任务:

if (object == playerItem && [keyPath isEqualToString:@"playbackLikelyToKeepUp"])
{
    if (playerItem.playbackLikelyToKeepUp)
    {
        [player play];

        if([[UIApplication sharedApplication] applicationState] == UIApplicationStateBackground)
        {
            [[UIApplication sharedApplication] endBackgroundTask:task];
            task = 0;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

ps:任务在我的.h文件中声明为 UIBackgroundTaskIdentifier task;

  • 发生这种情况的原因是,当您的应用程序处于后台时,由于某种原因,您的流将暂停,iOS将终止您的播放器,一旦您再次开始接收流式传输,您将无法继续.因此,我们可以在iOS上作弊,让它认为您的播放器仍在使用. (5认同)

Nir*_*Nir 10

我找到了解决这个问题的方法.

if (self.avPlayer.currentItem.playbackLikelyToKeepUp == NO) 
{
    // Show activity indicator
}
Run Code Online (Sandbox Code Playgroud)

  • 你把它放在什么方法? (3认同)