我有一个从SHOUTcast服务器播放流音频的应用程序.当应用程序在前台并且禁用自动锁定时,一切正常.该应用程序还可以在后台播放音频,此功能在iOS 6和iOS 7上一直运行正常.但是现在我的用户报告说,在升级到iOS 8后约10分钟后,背景音频会停止.

我可以通过在iOS 8上运行应用程序自己来重现问题.由于应用程序本身很复杂,所以我做了一个简单的演示来显示问题.我使用Xcode 6,Base SDK设置为iOS 8.我已经在我的Info.plist中添加了uibackgroundmodes的音频.有人知道下面的代码有什么问题吗?

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    NSURL *streamingURL = [NSURL URLWithString:@"http://www.radiofmgold.be/stream.PHP?ext=pls"];

    AVPlayerItem *playerItem = [AVPlayerItem playerItemWithURL:streamingURL];
    [self setPlayerItem:playerItem];

    AVPlayer *player = [AVPlayer playerWithPlayerItem:playerItem];
    [player setAllowsExternalPlayback:NO];

    [self setPlayer:player];
    [player play];

    [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
    [[AVAudioSession sharedInstance] setActive: YES error: nil];

    return YES;
}

解决方法

我在iOS 8.0.2下遇到了同样的问题.我的远程音频源在mp3播放.
似乎内部错误导致AVAudioSession重新启动.你可以用不同的方式来处理它:

您可以观察AVPlayerItem的状态.

void* YourAudioControllerItemStatusContext = "YourAudioControllerItemStatusContext";
...
@implementation YourAudioController
...
- (void)playStream {
    ...
    AVPlayerItem *item = [[AVPlayerItem alloc] initWithURL:streamUrl];
    [item addobserver:self forKeyPath:@"status" options:0 context:MJAudioControllerItemStatusContext];
}

- (void)observeValueForKeyPath:(Nsstring *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
    if (context == YourAudioControllerItemStatusContext) {
        AVPlayerItem *item = object;
        if (item.status == AVPlayerItemStatusFailed) {
            [self recoverFromError];
        }
    }

这种方式看起来不是可靠的,因为在AVPlayerItem的状态发生变化之前可能会有很大的时间延迟 – 如果它改变了.

我通过observeValueForKeyPath调试,发现AVPlayerItem的状态更改为AVErrorMediaServicesWereReset,并且具有错误代码-11819设置.

由于我经历了AVErrorMediaServicesWereReset错误,我研究了什么导致这个错误 – 这是AVAudioSession疯了.参考Apple的Technical Q&A,您应该注册AVAudioSessionMediaServicesWereResetNotifications.把你的代码放在某个地方:

[[NSNotificationCenter defaultCenter] addobserver:self selector:@selector(audioSessionWasReset:) name:AVAudioSessionMediaServicesWereResetNotification object:nil];

然后添加这个方法:

- (void)audioSessionWasReset:(NSNotification *)notification {
    [self recoverFromError];
}

在recoverFromError方法中,尝试以下方法之一:

>显示一条警告,描述在iOS 8下的问题,流需要重新启动
>通过再次设置AVAudioSession激活流并通过新的AVPlayerItem实例化一个新的AVPlayer实例

在这个时刻,我知道如何处理它的唯一方法.问题是为什么AudioSession正在重新启动.

UPDATEiOS 8.1接缝的发布已经解决了这个问题.

10分钟后,iOS 8将在后台停止流式传输音频的更多相关文章

  1. 如何使用多对等连接将摄像头从一个iOS设备流式传输到另一个设备

    我们如何在iOS7中使用蓝牙或wifi有效地将摄像头源从一个iOS设备传输到另一个iOS设备.下面是获取流缓冲区的代码.在这里,我们可以获得iOS相机捕获的图像.我们是否可以使用多个对等方将样本缓冲区信息直接发送到另一个设备,或者是否有任何有效的方法将数据传输到其他iOS设备?

  2. 在下载iOS时流式传输视频

    有人知道可能导致这个问题吗?我知道一些文件系统支持“文件大小”和“磁盘大小”作为两个不同的属性…不知道如果iOS有这样的东西?

  3. ios – 如何执行硬件加速的H.264编码和解码流式传输?

    我可以从相机获取RGBA帧数据,我想以H.264格式进行编码.我使用FFmpeg对H.264视频进行编码和解码,但是在640×480的帧大小中,我的需求太慢了.我想使用硬件加速来加快编码和解码,那么我该怎么做呢?此外,我需要能够通过网络流式传输编码的视频,并在另一端进行解码.如何才能做到这一点?

  4. 10分钟后,iOS 8将在后台停止流式传输音频

    我有一个从SHOUTcast服务器播放流音频的应用程序.当应用程序在前台并且禁用自动锁定时,一切正常.该应用程序还可以在后台播放音频,此功能在iOS6和iOS7上一直运行正常.但是现在我的用户报告说,在升级到iOS8后约10分钟后,背景音频会停止.我可以通过在iOS8上运行应用程序自己来重现问题.由于应用程序本身很复杂,所以我做了一个简单的演示来显示问题.我使用Xcode6,BaseSDK设置为iOS8.我已经在我的Info.plist中添加了uibackgroundmodes的音频.有人知道下面的代码有

  5. 在外部蓝牙设备和Android手机之间流式传输音频

    我正在考虑构建一个Android应用程序,允许通过蓝牙与Android手机之间传输音频.我之前在Stackoverflow上读过类似的问题,并且基于我的理解,A2DP不能用作Android不能成为A2DP接收器.从理论上讲,我认为像HFP或HFPAG这样的配置文件应该允许双向音频流.在AndroidAPI中,有没有办法强制蓝牙配对跟随此配置文件,或者OS是否决定使用哪个配置文件?

  6. android – Galaxy s3上的媒体播放器1004错误

    我有一个视频视图,显示来自网络的内容.当我使用Android4.2玩nexus7时它工作正常,但是当我在GS3上播放时,会返回错误1004IO错误.有谁知道为什么会这样?

  7. 在android中,将相机预览流式传输到视图上

    我想将Android摄像头的摄像头预览流式传输到视图上.目的是使用onDraw()在视图中添加各种内容.我不需要在任何时候实际捕获图像.它不必是每秒最高质量或最大帧数.有谁知道如何做到这一点?解决方法将此添加到您的xml:进入你的活动班:的onCreate-方法:和预览类:

  8. 如何从android流式传输到ffserver

    我需要从一个Android摄像头/文件流到一个远程ffserver,它将播放我的视频.我可以通过发出如下命令在ubuntu的桌面上执行此操作:或流式传输这样的文件:所以基本上我希望能够从android做到以上.经过几次搜索,这是我到目前为止所做的–我遇到了这个链接http://bambuser.com/opensource,我从中下载了ffmpeg源并构建了它.构建输出几件事:1.共享库[liba

  9. ANDROID:是否有免费的第三方媒体播放器用于流式传输MPEG4视频?

    附带androidSDK的原生媒体播放器不会播放大多数MPEG4格式的视频文件.我可以使用其他第三方媒体播放器吗?如果是,我怎么用呢?它是一个jar我可以添加到我的lib目录或shd将用户重定向到AndroidMarket并要求他们安装免费的应用程序?

  10. 在Windows上使用FFMPEG从图像流式传输视频

    只要逻辑工作流程保持不变,替代解决方案也是可接受的.在NickvanTilborg的评论之后,我最终使用了FFmpeg的image2pipe.此功能允许将图像数据简化为FFmpeg,而不是同时访问同一文件的两个进程.下面是我写的C代码.它可能没有完全优化,但它完成了工作.它是在Windows7上使用VisualStudio2012编译和测试的.

随机推荐

  1. iOS实现拖拽View跟随手指浮动效果

    这篇文章主要为大家详细介绍了iOS实现拖拽View跟随手指浮动,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  2. iOS – genstrings:无法连接到输出目录en.lproj

    使用我桌面上的项目文件夹,我启动终端输入:cd然后将我的项目文件夹拖到终端,它给了我路径.然后我将这行代码粘贴到终端中找.-name*.m|xargsgenstrings-oen.lproj我在终端中收到此错误消息:genstrings:无法连接到输出目录en.lproj它多次打印这行,然后说我的项目是一个目录的路径?没有.strings文件.对我做错了什么的想法?

  3. iOS 7 UIButtonBarItem图像没有色调

    如何确保按钮图标采用全局色调?解决方法只是想将其转换为根注释,以便为“回答”复选标记提供更好的上下文,并提供更好的格式.我能想出这个!

  4. ios – 在自定义相机层的AVFoundation中自动对焦和自动曝光

    为AVFoundation定制图层相机创建精确的自动对焦和曝光的最佳方法是什么?

  5. ios – Xcode找不到Alamofire,错误:没有这样的模块’Alamofire’

    我正在尝试按照github(https://github.com/Alamofire/Alamofire#cocoapods)指令将Alamofire包含在我的Swift项目中.我创建了一个新项目,导航到项目目录并运行此命令sudogeminstallcocoapods.然后我面临以下错误:搜索后我设法通过运行此命令安装cocoapodssudogeminstall-n/usr/local/bin

  6. ios – 在没有iPhone6s或更新的情况下测试ARKit

    我在决定下载Xcode9之前.我想玩新的框架–ARKit.我知道要用ARKit运行app我需要一个带有A9芯片或更新版本的设备.不幸的是我有一个较旧的.我的问题是已经下载了新Xcode的人.在我的情况下有可能运行ARKit应用程序吗?那个或其他任何模拟器?任何想法或我将不得不购买新设备?解决方法任何iOS11设备都可以使用ARKit,但是具有高质量AR体验的全球跟踪功能需要使用A9或更高版本处理器的设备.使用iOS11测试版更新您的设备是必要的.

  7. 将iOS应用移植到Android

    我们制作了一个具有2000个目标c类的退出大型iOS应用程序.我想知道有一个最佳实践指南将其移植到Android?此外,由于我们的应用程序大量使用UINavigation和UIView控制器,我想知道在Android上有类似的模型和实现.谢谢到目前为止,guenter解决方法老实说,我认为你正在计划的只是制作难以维护的糟糕代码.我意识到这听起来像很多工作,但从长远来看它会更容易,我只是将应用程序的概念“移植”到android并从头开始编写.

  8. ios – 在Swift中覆盖Objective C类方法

    我是Swift的初学者,我正在尝试在Swift项目中使用JSONModel.我想从JSONModel覆盖方法keyMapper,但我没有找到如何覆盖模型类中的Objective-C类方法.该方法的签名是:我怎样才能做到这一点?解决方法您可以像覆盖实例方法一样执行此操作,但使用class关键字除外:

  9. ios – 在WKWebView中获取链接URL

    我想在WKWebView中获取tapped链接的url.链接采用自定义格式,可触发应用中的某些操作.例如HTTP://我的网站/帮助#深层链接对讲.我这样使用KVO:这在第一次点击链接时效果很好.但是,如果我连续两次点击相同的链接,它将不报告链接点击.是否有解决方法来解决这个问题,以便我可以检测每个点击并获取链接?任何关于这个的指针都会很棒!解决方法像这样更改addobserver在observeValue函数中,您可以获得两个值

  10. ios – 在Swift的UIView中找到UILabel

    我正在尝试在我的UIViewControllers的超级视图中找到我的UILabels.这是我的代码:这是在Objective-C中推荐的方式,但是在Swift中我只得到UIViews和CALayer.我肯定在提供给这个方法的视图中有UILabel.我错过了什么?我的UIViewController中的调用:解决方法使用函数式编程概念可以更轻松地实现这一目标.

返回
顶部