超级快速的 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
),应用可以从锁定屏幕接收播放/暂停动作(使用AVAudiosessionDelegate
和remoteControlReceivedWithEvent
方法)。
这部分没问题。
问题
用户启动应用程序。加载第一个屏幕时,用户点击“播放”按钮。现在,在我的代码中,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 层播放