Проблемы производительности воспроизведения потокового видео с фоновыми задачами на Android - PullRequest
2 голосов
/ 02 марта 2010

Я разработал небольшое приложение, которое может воспроизводить видео с сервера потоковой передачи rstp (в данном случае darwin, но это не актуально) с помощью виджета VideoView (я также пробовал подход Mplayer + SurfaceView). Я использую соединение Wi-Fi для этого.

Видео воспроизводится очень плавно, когда видео - единственная задача . Небольшое приложение должно одновременно выполнять другие задачи , такие как непрерывное обнаружение устройств Bluetooth и вызов удаленной веб-службы (для этого я использую Ksoap2). Когда эти фоновые такты запускаются одновременно с воспроизведением видео, производительность невероятно падает (изображение и звуки иногда останавливаются, и изображение искажается, показывая довольно большие квадраты вместо правильных кадров).

Это происходит даже с видео низкого качества (3gp при 50 кбит / с). Для обнаружения Bluetooth я использовал оба доступных метода без повышения производительности по сравнению друг с другом:

  • Используя способ обнаружения, предоставляемый SDK 5, и зарегистрируйте каждое найденное устройство Bluetooth.
  • Использование собственного вызова самописного метода scan (), который использует функцию hci_inquiry(), предоставляемую API Bluez.

Звонок на WS запрашивает адрес Bluetooth обнаруженных устройств. Вызов поступает после завершения обнаружения.

Я попытался использовать GLSurfaceView вместо SurfaceView, но, поскольку я довольно плохо знаком с платформой Android и не имею опыта программирования 3D-графики, я не смог заставить его работать, так как не смог найти ни одного примера использования OpenGL ES правильно воспроизводит видео и все еще может позволить Android API контролировать другие вещи, связанные с пользовательским интерфейсом (диалоги / меню / тосты). С другой стороны, я не знаю, может ли это действительно улучшить воспроизведение.

Какие-нибудь подсказки или советы, как я могу взять?

Редактировать : Я забыл сказать, что я работаю над Motorola Milestone

Редактировать 2 : Следуя рекомендациям CommonsWare и snctln, я попытался минимизировать использование памяти приложением, не пропуская при этом вызовы SOAP WS.

Теперь я пытаюсь кэшировать как можно больше объектов и выполнять вызов только при обнаружении новых BT-устройств (WS требует, чтобы BT-устройства были обнаружены как входные данные), чтобы минимизировать GC-вызовы. Видео по-прежнему ужасно воспроизводится только при активном обнаружении Bluetooth (никаких вызовов WS вообще).

Редактировать 3: Решение : Я изменил свое приложение, чтобы использовать соединение для передачи данных UMTS (3G) вместо Wi-Fi при сканировании устройств Bluetooth. Хотя устройство получает доступ к общедоступному Интернету (m.youtube.com), оно воспроизводит потоковое видео гораздо более плавно через 3G (с общедоступных интернет-серверов), чем через локальный Wi-Fi (с локального потокового сервера) . Производительность локального сервера потоковой передачи не является проблемой, поскольку потоковая передача на настольные ПК работает нормально. Я также обновил прошивку устройства до 2.0.1, а также ощутил некоторые улучшения с локальным подключением к Wi-Fi, но производительность воспроизведения 3G все еще выше, чем у Wi-Fi.

Я пришел к выводу, что это устройство должно иметь конфликтующие аппаратные средства (возможно, тот же набор микросхем) или проблемы с программным обеспечением при одновременной связи Wi-Fi / Bluetooth.

Ответы [ 2 ]

1 голос
/ 02 марта 2010

Одна вещь, которую вы можете сделать, это взглянуть на распределение памяти. Около года назад у меня возникали проблемы с производительностью дисплея в игре, каждые 2 секунды или около того возникало большое «отставание». Я отправил сообщение в группу Google android-develoeprs Google и получил несколько советов для отслеживания проблемы от одного из инженеров Android. Позже он собрал эту запись в блоге , в которой подробно описан процесс отслеживания распределения памяти, это важно отслеживать, потому что наблюдаемое мной отставание было напрямую связано со сборкой мусора. Теперь, когда я сократил свои ассигнования до минимума, это отставание происходит гораздо реже.

Также я согласен с Марком (CommonsWare): если вы можете сбросить мыло для облегченного протокола, вы можете увидеть улучшение производительности.

1 голос
/ 02 марта 2010

Пожалуйста, поймите, что Motorola Milestone имеет скорость процессора и оперативную память ПК примерно 12-15 лет назад.

Любые подсказки или советы, как я мог взять?

Создайте дамп SOAP и используйте упрощенный протокол веб-службы (например, JSON over REST). Понизьте приоритет потоков, выполняющих эту работу, чтобы они не мешали так сильно потокам, обрабатывающим воспроизведение видео. Добавьте как можно больше времени дыхания при сканировании Bluetooth, вместо того, чтобы постоянно выполнять код для обнаружения устройств.

Предполагая, что это не решает проблему, используйте traceview и аналогичные инструменты, чтобы попытаться оптимизировать фоновые потоки (возможно, без запуска видео).

...