将音频流式传输到其他 iOS 设备(使用多点)并通过本地设备播放音频

Posted

技术标签:

【中文标题】将音频流式传输到其他 iOS 设备(使用多点)并通过本地设备播放音频【英文标题】:Stream audio to other iOS devices (using multipeer) AND play audio through local device 【发布时间】:2014-01-25 20:12:03 【问题描述】:

基本上,我通过多点连接将音频流式传输到其他 ios 设备。我正在使用this tutorial,现在我可以将音乐流式传输到其他设备并让其他设备播放音乐。但是,我的本地设备主机不播放音乐。为了做到这一点,我基本上试过了

- (void)mediaPicker:(MPMediaPickerController *)mediaPicker didPickMediaItems:(MPMediaItemCollection *)mediaItemCollection

  self.outputStreamer = [[TDAudioOutputStreamer alloc] initWithOutputStream:[self.session outputStreamForPeer:peers[0]]];

        [self.outputStreamer streamAudioFromURL:[self.song valueForProperty:MPMediaItemPropertyAssetURL]];

        [self.outputStreamer start];
    self.player = [[AVAudioPlayer alloc] initWithContentsOfURL:[self.song valueForProperty:MPMediaItemPropertyAssetURL]error: NULL];
    [self.player play];

peers 是一组连接的对等点,一切正常。如果我注释掉最后两行(AVAudioPlayer),那么到其他设备的流式传输可以工作,反之亦然。似乎我只能做一个或另一个。 (self.player在.h中声明,没问题。)

这种双音频播放有什么解决方案吗?提前致谢。

【问题讨论】:

您找到问题的答案了吗?我正在寻找相同的解决方案.. 谢谢! 嗨@Spenciefy我使用了相同的教程,但它可以播放到一个主机和一个客人,如果我尝试3个设备,它只能播放一个首先连接的设备,你是如何解决这个问题的?提前致谢! @EranLevi 你对此有什么想法吗? 【参考方案1】:

你必须创建对象

TDAudioInputStreamer

也在客户端。

self.inputStream = [[TDAudioInputStreamer alloc] initWithInputStream:stream];
[self.inputstream start];

当你创建输出流时。

【讨论】:

【参考方案2】:

您可以使用媒体选择器选择您的歌曲,然后需要转换您的资产

**- (void)mediaPicker:(MPMediaPickerController *)mediaPicker didPickMediaItems:(MPMediaItemCollection *)mediaItemCollection
`


----------


-

`**
    [self dismissViewControllerAnimated:YES completion:nil];
    someMutableArray = [mediaItemCollection items];
    NSLog(@"%@",someMutableArray);
    MPMediaItem *song=[mediaItemCollection.items objectAtIndex:0];
    NSString * type = [song valueForProperty:MPMediaItemPropertyMediaType];
    NSURL * url = [song valueForProperty:MPMediaItemPropertyAssetURL];
    NSDictionary*dict=[[NSDictionary alloc] init];

    AVAsset *asset = [AVAsset assetWithURL:url];
    NSArray * metadata = [asset commonMetadata];
    NSArray * metadata1 = [asset metadata];
    NSArray * metadata2 = [asset availableMetadataFormats];

    NSMutableDictionary *info = [NSMutableDictionary dictionary];
    info[@"title"] = [song valueForProperty:MPMediaItemPropertyTitle] ? [song valueForProperty:MPMediaItemPropertyTitle] : @"";
    info[@"artist"] = [song valueForProperty:MPMediaItemPropertyArtist] ? [song valueForProperty:MPMediaItemPropertyArtist] : @"";
    NSNumber *duration=[song valueForProperty:MPMediaItemPropertyPlaybackDuration];

    int fullminutes = floor([duration floatValue] / 60); // fullminutes is an int
    int fullseconds = trunc([duration floatValue] - fullminutes * 60);  // fullseconds is an int

    info[@"duration"] = [NSString stringWithFormat:@"%d:%d", fullminutes, fullseconds];

    MPMediaItemArtwork *artwork = [song valueForProperty:MPMediaItemPropertyArtwork];

    UIImage *image = [artwork imageWithSize:CGSizeMake(150, 150)];
    NSData * data = UIImageJPEGRepresentation(image, 0.0);
    image = [UIImage imageWithData:data];

    if (image)
        self.songArtWorkImageView.image = image;
    else
        self.songArtWorkImageView.image = nil;

    self.songTitleLbl.text = [NSString stringWithFormat:@"%@ \n[Artist : %@]", info[@"title"], info[@"artist"]];
    [_session sendData:[NSKeyedArchiver archivedDataWithRootObject:[info copy]] toPeers:_session.connectedPeers withMode:MCSessionSendDataReliable error: nil];

    @try 
        if(_session && _session.connectedPeers && [_session.connectedPeers count] > 0)   
            for(int i=0;i<someMutableArray.count;i++)
                MPMediaItem *song = [someMutableArray objectAtIndex:i];
                for(int i=0;i<someMutableArray.count;i++)
                    MPMediaItem *song = [someMutableArray objectAtIndex:i];

                    AVURLAsset *asset = [AVURLAsset URLAssetWithURL:[song valueForProperty:MPMediaItemPropertyAssetURL] options:nil];

                    [self convertAsset: asset complition:^(BOOL Success, NSString *filePath) 
                        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC), dispatch_get_main_queue(), ^
                            if(Success) 
                                if(image)   
                                    [self saveImage: image withComplition:^(BOOL status, NSString *imageName, NSURL *imageURL) 
                                        if(status)  
                                            @try 
                                                [_session sendResourceAtURL:imageURL withName:imageName toPeer:[_session.connectedPeers objectAtIndex:0] withCompletionHandler:^(NSError *error) 
                                                    if (error) 
                                                        NSLog(@"Failed to send picture to %@", error.localizedDescription);
                                                        return;
                                                    
                                                    //Clean up the temp file
                                                    NSFileManager *fileManager = [NSFileManager defaultManager];
                                                    [fileManager removeItemAtURL:imageURL error:nil];
                                                ];
                                            
                                            @catch (NSException *exception) 

                                            
                                        
                                    ];
                                
                                @try 
                                    if(!self.outputStream)  
                                        NSArray * connnectedPeers = [_session connectedPeers];
                                        if([connnectedPeers count] != 0)    
                                            [self outputStreamForPeer:[_session.connectedPeers objectAtIndex:0]];
                                        
                                    
                                
                                @catch (NSException *exception) 

                                

                                if(self.outputStream)    
                                    if(!self.outputStreamer)    
                                        self.outputStreamer = [[TDAudioOutputStreamer alloc] initWithOutputStream:self.outputStream];
                                    

                                    [self.outputStreamer initStream:filePath];

                                    if(self.outputStreamer)    
                                        [self.outputStreamer start];
                                    
                                
                            
                            else    
                                [UIView showMessageWithTitle:@"Error!" message:@"Error occured!" showInterval:1.5];
                            


                        );
                    ];

                
            
        
    
    @catch (NSException *exception) 
        NSLog(@"Expection: %@", [exception debugDescription]);
    

【讨论】:

我尝试了多点连接,如果我们连接了 3 个设备,它可以用于数据传输,但不能用于音频流,那么如何解决?

以上是关于将音频流式传输到其他 iOS 设备(使用多点)并通过本地设备播放音频的主要内容,如果未能解决你的问题,请参考以下文章

iOS 7 多人连接流式音频

将音频流式传输到本地网络

用于从 iphone 麦克风流式传输音频的多点连接

iOS:如何将音频数据从客户端流式传输到服务器?

IOS - 流式传输和下载音频文件

将作品音频 rtp 流式传输到 android 设备