Кнопка «Воспроизведение/Пауза» на пульте Apple TV не работает, пока видео воспроизводится с помощью AVPlayerViewController.

Я воспроизводю видео через AVPlayerViewController в tvOS (Xamarin tvOS). Я приостанавливаю и возобновляю видео с помощью кнопки «Воспроизведение / Пауза» на пульте Apple TV. Я использую метод PressesBegan, чтобы получить событие при нажатии кнопки «Воспроизведение/Пауза». Это отлично работает на симуляторе, но не на реальных устройствах. На реальных устройствах мы не получаем события нажатия кнопки «Воспроизведение/Пауза». Мы пробовали это на Apple TV 4K (версия 12.11) и Apple TV (версия 11.4). Это происходит только при воспроизведении видео через AVPlayerViewController, в противном случае все работает нормально. Я пробовал метод UITapGestureRecognizer, PressesEnded, а также метод RemoteControlReceived. Но все равно помощи нет. Любая помощь будет высоко ценится.

https://github.com/lewixlabs/TvOS-PlayBack-Sample-App/blob/master/TvOS%20PlayBack%20Sample%20App/ViewController.cs


person Rishabh Shukla    schedule 02.01.2019    source источник
comment
Когда вы добавляете TapRecognizer в ViewController, вы можете запросить получение UIPressTypePlayPause в качестве разрешенных типов.   -  person SushiHangover    schedule 03.01.2019
comment
Да, я использовал команду NSNumber.FromLong((nint)Convert.ToInt32(UIPressType.PlayPause)) для получения запроса, но это не сработало.   -  person Rishabh Shukla    schedule 03.01.2019


Ответы (2)


Ваше приложение не будет получать события кнопки Пауза (или Воспроизведение/Пауза) при воспроизведении видео. Это ожидаемое и задокументированное поведение. Система перенаправляет действие обработчику приложения «Сейчас исполняется» (в данном случае это AVPlayerViewController).

Вы не сказали, почему вы пытались перехватить воспроизведение/паузу...

  • Если вы пытаетесь отключить паузу, вам следует использовать другой подход; например, вы можете отключить взаимодействие с пользователем в корневом представлении AVPlayerViewController (это отключит не только воспроизведение/паузу, но и почти все элементы управления). Вы также можете отключить элементы управления воспроизведением. Помните, что у пользователя есть несколько способов сделать паузу, включая щелчок по сенсорной поверхности, использование другого типа пульта дистанционного управления или команду Siri «приостановить», ни один из которых не приведет к обычным событиям кнопки паузы.

  • Если вы пытаетесь определить, когда видео поставлено на паузу, вы можете использовать ключ-значение для наблюдения за свойством "скорость" проигрывателя (скорость также может измениться на ноль по другим причинам, например, из-за того, что воспроизведение подошло к концу).

person Dan Wright    schedule 06.01.2019
comment
Спасибо за подробный ответ и предложения. Мы можем приостановить / воспроизвести видео другими способами, но я пытался воспроизвести / приостановить видео при нажатии кнопки воспроизведения / паузы на самом пульте телевизора. Но другой вопрос, как это работало на симуляторе? Я правильно получал события на симуляторе. Пожалуйста, помогите мне, если у вас есть какое-то решение, чтобы я мог приостановить/воспроизвести видео с самого пульта. - person Rishabh Shukla; 08.01.2019
comment
Если говорить о других приложениях Apple TV, таких как Netflix, Amazon Prime и HotStare, то они используют один и тот же AVPlayerController и могут воспроизводить и приостанавливать видео с помощью кнопки воспроизведения/паузы на пульте дистанционного управления. Поэтому я думаю, что должно быть решение. Пожалуйста, помогите мне. - person Rishabh Shukla; 08.01.2019
comment
AVPlayerViewController обрабатывает кнопку воспроизведения/паузы от имени клиентов. Ни одно из этих приложений не делает ничего особенного для обработки паузы. Если вы считаете, что обнаружили ошибку, вы можете сообщить об ошибке (bugreport.apple.com). Сначала воспроизведите ошибку, а затем запишите sysdiagnose для радара, как описано в download.developer .apple.com/iOS/tvOS_Logs/ (это поможет инженерам Apple отследить проблему, если они не смогут легко воспроизвести вашу проблему). - person Dan Wright; 12.01.2019
comment
...Например, если вы установили свойство userInteractionDisabled в корневом представлении AVPlayerViewController или если вы воспроизводите прямую трансляцию с незначительным диапазоном поиска. Однако я предполагаю, что все другие действия пользовательского интерфейса работают (например, коснитесь, чтобы отобразить панель транспорта, щелкните сенсорную поверхность Siri Remote, чтобы переключить воспроизведение). В частности, переключает ли воспроизведение нажатие на сенсорную поверхность Siri Remote? Если это не так, возможно, вы либо отключили элементы управления/взаимодействие с пользователем, либо представления AVPlayerViewController не имеют фокуса. - person Dan Wright; 12.01.2019
comment
Пример кода, который вы включили сюда, выглядит нормально (и видео не является прямой трансляцией), поэтому, если в вашем приложении есть ошибка, ее нет в этом файле. Предостережение: я не настроен на сборку/запуск проектов xamarin, поэтому я просто смотрю на исходный код. Наконец, что касается различий в Симуляторе: Симулятор делает все возможное, чтобы имитировать поведение устройства, но в редких случаях он не соответствует точно; это несоответствие является ошибкой в ​​Симуляторе (когда есть разница в поведении между Симулятором и устройством, это ошибка в Симуляторе). - person Dan Wright; 12.01.2019
comment
@DanWright, не могли бы вы указать мне, где задокументировано, что мы не будем получать события кнопки воспроизведения / паузы? Я пытаюсь использовать пользовательское UIView с AVPlayerLayer, и у меня та же проблема, что и на плакате: я добавил UITapGestureRecognizer, и я получаю события воспроизведения/паузы в симуляторе, но не на устройстве. - person NRitH; 21.07.2020

Добавьте UITapGestureRecognizer в ViewController и разрешите тип нажатия UIPressType.PlayPause.

var tap = new UITapGestureRecognizer(() =>
{
    Console.WriteLine("Remote PlayPause button pressed");
})
{
    AllowedPressTypes = new NSNumber[] { new NSNumber((long)UIPressType.PlayPause) }
};
this.View.AddGestureRecognizer(tap);
person SushiHangover    schedule 03.01.2019
comment
Благодаря вашему предложению, но я попробовал это решение, но оно не работает. Это происходит только тогда, когда я использую AVPlayerViewController. Если я использую UIViewController, то он работает нормально. - person Rishabh Shukla; 03.01.2019