iOS Audio Streaming仅适用于**某些**蓝牙设备?

Fuz*_*ers 6 iphone audio streaming bluetooth ios

我正在开发iOS应用程序,它将与iOS 6/7兼容并从网站流式传输音频.mp3文件.

已经使用以下代码将其工作:

-(NSString*)documentsFolder
{
    NSString* dataPath =  [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];
    if (![[NSFileManager defaultManager] fileExistsAtPath:dataPath])
        [[NSFileManager defaultManager] createDirectoryAtPath:dataPath withIntermediateDirectories:NO attributes:nil error:NULL];
    return dataPath;
}

-(NSString*)createURLFile:(NSString*)songURL
{
   NSString* M3U_FILE = @"song.m3u";
   NSString* path = [NSString stringWithFormat:@"%@",[[self documentsFolder] stringByAppendingPathComponent:M3U_FILE]];
    if([[NSFileManager defaultManager] createFileAtPath:path contents:nil attributes:nil])
    {
      NSFileHandle* outFile = [NSFileHandle fileHandleForWritingAtPath:path];
        if(outFile != nil)
      {
         NSData* buffer = [songURL dataUsingEncoding:NSUTF8StringEncoding];
         [outFile writeData:buffer];
         return path;
      }
   }
    return nil;
}


- (void)createStreamer
{
    // Remove any previous references.
    [[NSNotificationCenter defaultCenter] removeObserver:self];
    // Create a new player.
    NSString* fileURL = [self createURLFile:self.aSong.songpath];
    self.songPlayer = [[AVPlayer alloc]initWithURL:[NSURL fileURLWithPath:fileURL]];
    NSAssert(self.songPlayer != nil, @"NIL AVPlayer Created!!!");
    // Observer for when the song ends...
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(playerItemDidReachEnd:)
                                                 name:AVPlayerItemDidPlayToEndTimeNotification
                                               object:[self.songPlayer currentItem]];
    [[UIApplication sharedApplication] setIdleTimerDisabled: YES];
}
Run Code Online (Sandbox Code Playgroud)

我将.mp3文件的url存储在本地.m3u文件中,并使用它来加载AVPlayer.在早期版本的iOS中,我被告知AVPlayer会首先加载歌曲然后播放它,而不是立即播放它.虽然这在iOS 6/7中似乎不是这样(歌曲几乎立即开始流式传输),但是正在创建.m3u文件以防万一由于没有以这种方式完成而产生任何问题.

有了这个,一个循环正在监视AVPlayer的状态,几秒钟后,音频开始播放手机没有问题.

出于测试目的,我在播放歌曲的页面上设置了一个MPVolumeView:

MPVolumeView *volumeView = [[[MPVolumeView alloc] initWithFrame:CGRectMake(0, 0, 310, 20)] autorelease];
volumeView.center = CGPointMake(160,62);
[volumeView sizeToFit];
[self.view addSubview:volumeView];
Run Code Online (Sandbox Code Playgroud)

这样做的原因是音量滑块还会显示一个指示灯,如果蓝牙连接为音频输出源,并允许我更改手机和蓝牙设备之间的音频路径.到现在为止还挺好.

我通过蓝牙将手机连接到我的Jawbox Jambone,在一首歌上启动AVPlayer,然后歌曲按照预期从Jawbox中传出.音量控制有一个小的"带箭头的矩形"表示我可以切换音频输出,实际上,在播放歌曲时,我可以在手机和Jawbox之间切换. 幸福.

当我尝试将其连接到汽车时会出现问题.我有两个经验:

  1. 该车已与手机配对,可拨打/接听电话.当我上车时,手机甚至表示它已配对.但是,当我使用相同的代码播放相同的音频文件时,它们只能从手机中取出.音量滑块根本不显示"蓝牙路线"指示器(就像它不能将汽车识别为音频输出路线一样).
  2. 在另一辆车中,音频从另一个应用程序(一些无线电流媒体应用程序)流式传输.另一个应用程序停止了,这个开始了.音频开始播放上面测试的同一首歌,但在一两秒后停止播放.同样,此时蓝牙连接的音量滑块上没有指示器.

有人可以向我解释为什么音频可以流式传输到一个蓝牙设备而不是另一个吗?

我的应用程序配置文件中是否遗漏了某些内容(权利?),以便通过蓝牙将音频流式传输到汽车上?

Jef*_*Jef 0

我很确定 MPVolumeView 只能寻址符合较新的低功耗蓝牙规范的蓝牙设备...(蓝牙低功耗或 BLE)...

我知道手机应用程序不使用 MPVolumeView,可能其他音频播放器也不使用..您可能需要研究 CoreBluetooth 并实现您自己的:(祝你好运。github 上可能有一个解决方案