Потоковое аудио на другие устройства iOS (используя мультипир) И воспроизведение аудио через локальное устройство

В основном я передаю аудио на другие устройства iOS через многоточечное соединение. Я использую это руководство и прямо сейчас я могу транслировать музыку на другие устройства, и другие устройства будут воспроизводить музыку. Однако мой локальный хост устройства не воспроизводит музыку. Чтобы сделать это, я в основном пытался

- (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, все в порядке.)

Любое решение для этого двойного воспроизведения звука? Заранее спасибо.


person Spenciefy    schedule 25.01.2014    source источник
comment
вы нашли ответ на свой вопрос? Я ищу такое же решение. Спасибо!   -  person Eran Levi    schedule 20.09.2014
comment
Привет @Spenciefy. Я использовал тот же учебник, но он может воспроизводиться на одном хосте и одном госте, если я пробовал на 3 устройствах, он воспроизводит только одно устройство, которое подключено первым, как вы решили это? Заранее спасибо!   -  person Jason    schedule 15.02.2017
comment
@EranLevi У вас есть идеи по этому поводу?   -  person Jason    schedule 15.02.2017


Ответы (2)


Вы должны создать объект

TDAudioInputStreamer

на стороне клиента тоже.

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

Когда вы создаете поток вывода.

person fibnochi    schedule 10.08.2015

вы можете выбрать свою песню с помощью средства выбора медиа, а затем нужно преобразовать свои активы

**- (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]);
    }
}
person Neha    schedule 16.03.2016
comment
Я пробовал многопользовательское подключение, это нормально для передачи данных, но не для аудиопотока, если у нас подключено 3 устройства, так как это можно решить? - person Jason; 15.02.2017