Android, RTSP и 10 секунд


Работа с мультимедийными данными в Android-е проработана довольно не плохо, но к сожалению существуют ряд определенных сложностей.
Например, для проигрывания потокового видео можно использовать VideoView или использовать напрямую низкоуровневый класс MediaPlayer.
Естественно, VideoView внутри использует тот же MediaPlayer.
Примеры работы с VideoView и MediaPlayer есть в стандартной поставке: ApiDemos
Примеры вполне пригодные для самообучения и достаточно подробные. Самое интересное возникает при работе в реальной жизни.

Например, при начале трансляции по протоколу RTSP может возникнуть более чем ~10 секундная задержка.
Причину ее можно узнать, скачав исходники Android-а и посмотрев код (С++ файл: frameworks\base\media\libstagefright\rtsp\MyHandler.h).
Это необходимо для того, чтобы понять как на самом деле реализована обработка RTSP протокола.

Легко видеть, что в исходном коде захардкодина константа:

46: // If no access units arrive for the first 10 secs after starting the
47: // stream, assume none ever will and signal EOS or switch transports.
48: static int64_t kStartupTimeoutUs = 10000000ll;

Исходный сишный код довольно простой и логику реализации разобрать не сложно.

Общеизвестно, что RTSP может работать как через UDP, так и через TCP. В данной версии реализации (Android 2.3) происходит попытка подключится через UDP и если через 10 секунд ничего не получили – происходит попытка сменить транспорт на TCP.
Поскольку некоторые интернет-провайдеры любят блокировать UDP пакеты, то в результате перед началом показа может произойти “зависание” до тех пор, пока не произойдет переключение транспорта.

В итоге, простого способа уменьшить 10 секундную задержку нет (хард кодинг). Отсутствуют также публичные методы, с помощью которых можно было явно указать использовать TCP, а не UDP.

Способов устранить эту проблему несколько, но, к сожалению, все они выходя за рамки простых и красивых решений.

Любое использование либо копирование материалов или подборки материалов сайта, элементов дизайна и оформления допускается лишь с разрешения правообладателя и только со ссылкой на источник: programador.ru

Телеграм канал: @prgrmdr
Почта для связи: vit [at] programmisty.com