Воспроизведение песни на нескольких устройствах через многоранговое подключение - PullRequest
0 голосов
/ 24 января 2019

Я бы хотел воспроизвести песню на нескольких устройствах вместе с помощью многорангового подключения, например, ampme app do. Так что я использовал эту библиотеку , но я столкнулся с некоторыми трудностями, как следующие.

1.) Хост приостановил песню, но все гости не получили действие паузы

2.) Иногда Voice Breaking

3.) Невозможно соединить устройства друг с другом

4.) Песни не воспроизводятся синхронно после действия паузы

5.) Песня не воспроизводилась в гостевой системе, но показывал, что она воспроизводит

6.) Устройства, отключающиеся во время воспроизведения песни

7.) Проблема с подключением устройства

8.) Кроме того, песня воспроизводится более чем на двух устройствах, тогда она будет воспроизводиться только на одном устройстве.

Вот код

Host Side

 - (void)mediaPicker:(MPMediaPickerController *)mediaPicker didPickMediaItems:(MPMediaItemCollection *)mediaItemCollection
{
    [self dismissViewControllerAnimated:YES completion:nil];

    if (self.outputStreamer) return;

    self.song = mediaItemCollection.items[0];

    NSMutableDictionary *info = [NSMutableDictionary dictionary];
    info[@"title"] = [self.song valueForProperty:MPMediaItemPropertyTitle] ? [self.song valueForProperty:MPMediaItemPropertyTitle] : @"";
    info[@"artist"] = [self.song valueForProperty:MPMediaItemPropertyArtist] ? [self.song valueForProperty:MPMediaItemPropertyArtist] : @"";

    MPMediaItemArtwork *artwork = [self.song valueForProperty:MPMediaItemPropertyArtwork];
    UIImage *image = [artwork imageWithSize:self.albumImage.frame.size];
    if (image)
        info[@"artwork"] = image;

    if (info[@"artwork"])
        self.albumImage.image = info[@"artwork"];
    else
        self.albumImage.image = nil;

    self.songTitle.text = info[@"title"];
    self.songArtist.text = info[@"artist"];

    [self.session sendData:[NSKeyedArchiver archivedDataWithRootObject:[info copy]]];

    NSArray *peers = [self.session connectedPeers];

    if (peers.count) {
        self.outputStreamer = [[TDAudioOutputStreamer alloc] initWithOutputStream:[self.session outputStreamForPeer:peers[0]]];
        [self.outputStreamer streamAudioFromURL:[self.song valueForProperty:MPMediaItemPropertyAssetURL]];
        [self.outputStreamer start];
    }
}

Гость на стороне пользователя

#pragma mark - TDSessionDelegate

- (void)session:(TDSession *)session didReceiveData:(NSData *)data
{
    NSDictionary *info = [NSKeyedUnarchiver unarchiveObjectWithData:data];
    [self performSelectorOnMainThread:@selector(changeSongInfo:) withObject:info waitUntilDone:NO];
}

- (void)session:(TDSession *)session didReceiveAudioStream:(NSInputStream *)stream
{
    if (!self.inputStream) {
        self.inputStream = [[TDAudioInputStreamer alloc] initWithInputStream:stream];
        [self.inputStream start];
    }
}
...