Работа с мультимедийными данными в 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.
Способов устранить эту проблему несколько, но, к сожалению, все они выходя за рамки простых и красивых решений.