iOS: альтернатива MPVolumeView средства выбора Airplay

Я использую MPVolumeView, чтобы выбрать устройство для воспроизведения в эфире avplayer. Есть ли какая-либо возможная не-частная альтернатива API для этого, чтобы я мог предоставить свои собственные элементы управления пользовательским интерфейсом для выбора устройства для трансляции?

Говоря об API, я имею в виду, что все, что мне нужно, это:

  1. Возможность перенаправить звук на audioRoute для конкретного устройства трансляции.
  2. Получить имена устройств для трансляции. (получите все доступные audioRoutes, затем получите описания для audioRoutes трансляции)

Я знаю, что платформа AudioToolbox предоставляет дополнительный API для работы с AudioSession, но единственный способ перенаправить звук, который я нашел, - это AVAudioSession:

- (BOOL)overrideOutputAudioPort:(AVAudioSessionPortOverride)portOverride  error:(NSError **)outError`

который позволяет перенаправлять звук только на встроенные динамики. Может быть, есть какой-то другой способ, как его там добиться? (Я также нашел только способ получить имя AirplayDevice как описание currentAudioRoute - Получить имя устройства AirPlay с помощью AVPlayer)


person ambientlight    schedule 11.04.2014    source источник


Ответы (1)


Итак, точный ответ на мой вопрос:

(i) Невозможно программно переключать audioRoutes с помощью общедоступного API, за исключением переключения на встроенные динамики.

[[AVAudioSession sharedInstance] overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:nil];

(ii) Вы можете получить имя устройства airplay, только если оно активно AudioRoute. Получить имя устройства AirPlay с помощью AVPlayer

Таким образом, практическое решение для представления настраиваемых элементов управления пользовательского интерфейса для выбора трансляции будет следующим:

Чтобы настроить MPVolumeView, вы можете отключить volumeSliderи настроить routeButton. Однако у вас нет другого варианта, как выбрать airplayDevice среди списка совместимых с Apple беспроводных устройств (airPlay, Bluetooth и т. д.) в UIActionSheet, который появляется при нажатии на routeButton, но вы можете наблюдать, когда пользователь сделает выбор, подписавшись на audioRouteChangeNotification :

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(audioRouteHasChangedNotification:) name:AVAudioSessionRouteChangeNotification object:[AVAudioSession sharedInstance]];

(также обратите внимание, что если вы подключите / отключите наушники, это также вызовет это уведомление)

Если вам интересно, как получить все доступные audioRoutes и программно переключаться с помощью частного API:

MPMediaPlayer framework содержит закрытый класс MPAVRoutingController, который позволяет вам именно это:

Class MPAVRoutingController = NSClassFromString(@"MPAVRoutingController");
Class MPAVRoute = NSClassFromString(@"MPAVRoute");

id routingController = [[MPAVRoutingController alloc] init];
NSArray* availableRoutes = [routingController performSelector:@selector(availableRoutes)];
BOOL isSwitchSuccesful = [[routingController performSelector:@selector(pickRoute:) withObject:availableRoutes.lastObject] boolValue];

(если вы хотите затем получить доступ к информации audioRoute и проверить, является ли это Airplay: Обнаружение airplayRoute)

person ambientlight    schedule 31.07.2014
comment
У меня был похожий вопрос и мне было интересно, возможен ли даже обычный лист действий без настроек, не прибегая к частному API? - person Roberto Andrade; 06.08.2015
comment
Я не знаю, добавили ли они к нему какой-либо новый API, но кажется, что мы ничего не можем сделать с их ActionSheet (теперь он называется AlertController) напрямую. Вы можете попробовать поиграть с ним — например, попробовать получить доступ к его подпредставлениям и попробовать sendActionsForControlEvents, чтобы увидеть, можете ли вы программно подделывать пользовательские прикосновения, если вы можете, то вы, вероятно, можете программно переключать маршруты без частного API. - person ambientlight; 07.08.2015
comment
Можете ли вы проверить, работает ли MPAVRoutingController в iOS 11.3.1, у меня он больше не работает. - person Jas_meet; 09.05.2018