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之间切换. 幸福.
当我尝试将其连接到汽车时会出现问题.我有两个经验:
有人可以向我解释为什么音频可以流式传输到一个蓝牙设备而不是另一个吗?
我的应用程序配置文件中是否遗漏了某些内容(权利?),以便通过蓝牙将音频流式传输到汽车上?
我很确定 MPVolumeView 只能寻址符合较新的低功耗蓝牙规范的蓝牙设备...(蓝牙低功耗或 BLE)...
我知道手机应用程序不使用 MPVolumeView,可能其他音频播放器也不使用..您可能需要研究 CoreBluetooth 并实现您自己的:(祝你好运。github 上可能有一个解决方案