Iphone iOS游戏中心、AVAsset和音频流

Iphone iOS游戏中心、AVAsset和音频流,iphone,objective-c,ios,ipad,Iphone,Objective C,Ios,Ipad,我从设备iTunes库中获得一首歌曲,并将其放入AVAsset: - (void)mediaPicker: (MPMediaPickerController *)mediaPicker didPickMediaItems:(MPMediaItemCollection *)mediaItemCollection { NSArray *arr = mediaItemCollection.items; MPMediaItem *song = [arr objectAtIndex:0]

我从设备iTunes库中获得一首歌曲,并将其放入AVAsset:

- (void)mediaPicker: (MPMediaPickerController *)mediaPicker didPickMediaItems:(MPMediaItemCollection *)mediaItemCollection
{
    NSArray *arr = mediaItemCollection.items;

    MPMediaItem *song = [arr objectAtIndex:0];

    AVAsset *songAsset = [AVAsset assetWithURL:[song valueForProperty:MPMediaItemPropertyAssetURL]];
}
然后我有一个游戏中心接收数据的方法:

- (void)match:(GKMatch *)match didReceiveData:(NSData *)data fromPlayer:(NSString *)playerID
我很难弄清楚如何通过GameCenter发送此AVAsset,然后在接收设备上播放

我通读了:

我只是迷路了。信息过载

我用Love的音频流代码实现了Cocoa,但我不知道如何将通过GameCenter接收到的NSData放入他的代码中。


有人能帮我弄清楚吗?谢谢

据我所知,《阿瓦塞特》不是真正的歌曲。因此,如果您想发送所选歌曲的实际数据,您需要尝试以下方法:

- (void)mediaPicker: (MPMediaPickerController *)mediaPicker didPickMediaItems:(MPMediaItemCollection *)mediaItemCollection
{
    NSArray *arr = mediaItemCollection.items;
    MPMediaItem *song = [arr objectAtIndex:0];
    NSData *songData = [NSData dataWithContentsOfURL:[song valueForProperty:MPMediaItemPropertyAssetURL]];
    // Send the songData variable trough GameCenter
}
在另一台设备上,现在您需要将接收到的NSData写入磁盘的某个位置,然后使用其新的URL创建一个AVAsset。像这样:

- (void)match:(GKMatch *)match didReceiveData:(NSData *)data fromPlayer:(NSString *)playerID
{
    NSString *url = NSTemporaryDirectory();
    [url stringByAppendingPathComponent:<#audio_file_name#>];

    // Make sure there is no other file with the same name first
    if ([[NSFileManager defaultManager] fileExistsAtPath:url]) {
        [[NSFileManager defaultManager] removeItemAtPath:url error:nil];
    }

    [data writeToFile:url atomically:NO];

    AVURLAsset *urlAsset = [AVURLAsset URLAssetWithURL:[NSURL fileURLWithPath:url] options:nil];

    // Do whatever you want with your new asset
}
-(void)match:(GKMatch*)match did从player:(NSString*)playerID接收数据:(NSData*)数据
{
NSString*url=NSTemporaryDirectory();
[url stringByAppendingPathComponent:];
//首先确保没有其他同名文件
如果([[NSFileManager defaultManager]fileExistsAtPath:url]){
[[NSFileManager defaultManager]removiteMatPath:url错误:nil];
}
[数据写入文件:url原子:否];
AVURLAsset*urlAsset=[AVURLAsset URLAssetWithURL:[NSURL fileURLWithPath:url]选项:无];
//你想用你的新资产做什么就做什么
}

让我知道这是否有效

Mihai,我很欣赏这里的代码,但我确实知道如何通过游戏中心发送文件,但我的问题是,假设一首歌的容量为3兆字节,我不想等到整个文件发送完毕后再开始播放,我希望第二台设备能够流式播放。所以我想我需要发送数据块(包括整首歌),然后解析这些数据块并在接收设备上播放它们。你知道我的意思吗?我明白你的意思了。我唯一确定的是,你不能直接发送
AVAsset
,因为它不包含实际的歌曲数据。因此,我认为整个GameCenter方法不足以满足您的需要。试着看看是否可以帮助你在两部iPhone之间建立一个套接字流,并像那样发送歌曲数据。。。这对你来说是一个选择还是GameCenter是唯一的选择?我也发现这听起来有点有希望。。。看看你能用它做什么!我不使用游戏中心也可以,但我最大的障碍是找到并连接到其他设备。我甚至不知道从哪里开始。