Я разработал небольшое приложение, которое может воспроизводить видео с сервера потоковой передачи 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.