2016-09-09 8 views
2

Мне нужно, чтобы воспроизводить аудио, используя только левый или правый канал. Я знаю, что AVAudioPlayer может воспроизводить аудио, используя любой канал, используя свойство панорамирования. Если AVSpeechSynthesizer не имеет возможности выполнить это, можно ли воспроизвести высказывание с использованием AVAudioPlayer, чтобы управлять каналами? Если бы я мог каким-то образом получить NSURL AVSpeechUtterance и сыграть, используя AVAudioPlayer?Привет, Есть ли способ, чтобы синтезатор AVSpeech воспроизводил звук с использованием любых каналов при воспроизведении звука с помощью гарнитуры?

Только предыдущий подобный вопрос: Any way to control which audio channel AVSpeechSynthesizer outputs to? У меня нет ответа, и я подошел пустой, пытаясь найти решение.

ответ

2

Да, вы можете сделать это, используя outputChannels property AVSpeechSynthesizer. Apple не размещала никакой документации для этого, но работает так же, как и свойство channelAssignmentsAVAudioPlayer. Это возвращает доступный для человека список доступных каналов:

- (NSArray *)getAudioChannelNames { 
    // return the name of each channel in each connected audio port 
    // examples: Headphones Left/Right, Speaker, DUO-CAPTURE 1/2 
    AVAudioSession *session = [AVAudioSession sharedInstance]; 
    AVAudioSessionRouteDescription *route = [session currentRoute]; 
    NSArray *outputPorts = [route outputs]; 
    NSMutableArray *channels = [NSMutableArray array]; 
    for (AVAudioSessionPortDescription *outputPort in outputPorts) { 
     for (AVAudioSessionChannelDescription *channel in outputPort.channels) { 
      [channels addObject:channel.channelName]; 
     } 
    } 
    return channels; 
} 

Вы или пользователь можете выбрать название канала для использования. Тогда это устанавливает AVSpeechSynthesizer использовать этот канал:

- (void)setSpeechSynthesizer:(AVSpeechSynthesizer *)speechSynthesizer toChannels:(NSArray *)channelNames { 
    AVAudioSession *session = [AVAudioSession sharedInstance]; 
    AVAudioSessionRouteDescription *route = [session currentRoute]; 
    NSArray *outputPorts = [route outputs]; 
    NSMutableArray *channelDescriptions = [NSMutableArray array]; 
    for (NSString *channelName in channelNames) { 
     for (AVAudioSessionPortDescription *outputPort in outputPorts) { 
      for (AVAudioSessionChannelDescription *channel in outputPort.channels) { 
       if ([channel.channelName isEqualToString:channelName]) { 
        [channelDescriptions addObject:channel]; 
       } 
      } 
     } 
    } 
    if ([channelDescriptions count]) { 
     speechSynthesizer.outputChannels = channelDescriptions; 
    } 
} 
+0

speechSynthesizer.outputChannels поддерживает с прошивки 10. * Есть ли возможность сделать это в прошивке 8.0 – Sridhar

+0

каждый раз, когда я выходные каналы, как, что массив каналов всегда пустой. Какие-нибудь подсказки, почему? (я использую Swift и ios 10) –

+0

@zo_chu Вы имеете в виду результат 'getAudioChannelNames' пуст? Вы используете 'AVAudioSessionCategoryMultiRoute' для своей аудио сессии? Я не знаю, что еще предложить. – arlomedia

 Смежные вопросы

  • Нет связанных вопросов^_^