超级快速的 AVPlayer 初始化或如何在后台启动它?

Posted

技术标签:

【中文标题】超级快速的 AVPlayer 初始化或如何在后台启动它?【英文标题】:Super quick AVPlayer init or how to start it in background? 【发布时间】:2013-06-08 09:35:49 【问题描述】:

场景:

应用程序用于从广播电台流式传输音乐。我为此使用 AVPlayer。应用可以在后台播放音乐(plist 中的Required background modes),应用可以从锁定屏幕接收播放/暂停动作(使用AVAudiosessionDelegateremoteControlReceivedWithEvent 方法)。 这部分没问题。

问题

用户启动应用程序。加载第一个屏幕时,用户点击“播放”按钮。现在,在我的代码中,AVPlayer 已初始化,一旦此任务准备就绪,它就会开始播放音乐。 但即使在快速 Wi-Fi 上,此任务也会持续大约 3 到 5 秒。

当然,在这 3-5 秒内,用户可以点击主页按钮,应用程序将进入后台,AVPlayer 永远不会开始播放音频。

我该如何处理?我试图在dispatch_async 中运行[avplayer play],但它没有帮助。 我还尝试在 AppDelegate 中初始化 AVPlayer,现在音频加载速度更快,但用户可以更快...... 什么样的方法来解决这个问题是合适的?

更新 - 初始化播放器的代码

在头文件(MainViewController)中: //MyPlayer 是 AVPlayer 的子类

@property (nonatomic, strong) MyPlayer *playerBrain;

实现文件:

//lazy instantiation
- (MyPlayer*)playerBrain

    if (_playerBrain == nil) _playerBrain = [[MyPlayer alloc] initWithURL:[NSURL URLWithString:@"correct_URL_To_MP3_File"]];
    return _playerBrain;


- (IBAction)onOffSwitch:(UISwitch *)sender

    if (sender.isOn)
    
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^
            NSLog(@"inside block!");
            [self.playerBrain playRadio];
        );
    
    else
    
        [self.playerBrain pause];
    

//MyPlayer 实现内部

- (void)playRadio

     [self play]; //this is method from parent, AVPlayer

【问题讨论】:

你能显示你用来初始化播放器的代码吗? 是的,我更新了问题。 您是否还可以添加一些其他信息,例如您尝试播放的文件有多大/多长,“块内”的速度有多快!是否记录到控制台等? "inside block" 几乎立即打印(用户点击后不到 1 秒)。文件一直在流式传输(除非用户点击停止)所以我没有确定它的大小。我刚刚下载了类似的应用程序(itunes.apple.com/pl/app/polskie-radio/id441743093?mt=8),他们也没有解决这个问题。 如果您尝试在 iOS 设备上使用 Safari 从 URL 加载音频文件,那么它的启动速度有多快? 【参考方案1】:

我不确定这是否可行,尚未测试,但您能否播放本地存储在循环中的 1 秒静音,直到音频加载?然后你的应用应该仍然在后台运行,一旦加载,你就可以切换到真实的音频。

【讨论】:

如何确定加载真实音频的时刻? 您可以观察播放器上的status 属性。当它变为AVPlayerStatusReadyToPlay时,音频已经加载完毕。

以上是关于超级快速的 AVPlayer 初始化或如何在后台启动它?的主要内容,如果未能解决你的问题,请参考以下文章

当应用程序快速进入后台时,如何使用 AVLayer 继续将视频作为 VideoView 层播放

向上滑动(将应用程序置于后台)并且视频在自定义 AVPLayer 中播放时如何停止画中画?

无法将按钮绑定到 AVPlayer

如何首先在容器页面视图控制器中实例化任何视图?

无法使用自定义按钮暂停 AVPlayer

使用 AVPlayer 的 iOS 音频可视化