- Потоковое видео в Android
- Конвертация видео
- Раздача видео
- Progressive streaming
- Pseudo streaming
- Live streaming
- Real Time Streaming Protocol (RTSP)
- Multicast
- Что выбрать
- Documentation:Android
- Contents
- Preliminary Notes
- Feature Overview
- Installation
- From the Play Store (recommended)
- From the F-Droid Repository
- From VideoLAN
- Be a Beta tester or try a Beta release
- Be a Beta tester
- Try a Beta release
- Install a Nightly Build
- Interface
- Playing Video
- Video browser view
- Video playback interface
Потоковое видео в Android
В этой заметке я хочу рассказать о некоторых подводных камнях, с которыми можно столкнуться при работе с потоковым видео в Android приложениях. Конкретно, речь пойдёт о конвертации видео и протоколах доставки/воспроизведения видео.
Сразу оговорюсь, что экспертом я в данной области не являюсь, а лишь хочу поделится недавно полученным опытом.
Представим, что перед вами стоит задача реализовать Android приложение, способное проигрывать множество файлов, заливаемых пользователями на ваш сервер. Написать свой youtube, с блекджеком и кодеками. Для этого вам придётся решить как минимум две задачи: конвертации видео к поддерживаемому на Android формате, воспроизведение видео с удалённого источника. Рассмотрим обе эти задачи более подробней.
Конвертация видео
И так, прежде чем воспроизвести какое-то видео нашем Android устройстве, надо это видео перекодировать в поддерживаемый формат. В документации к Android чётко обозначен список этих самых форматов.
Для того, что бы перекодировать файлы, заливаемые пользователями на ваш сервис, или же записать поток с TV-тюнера, вам потребуется помощь специальной утилиты ffmpeg, являющейся де-факто стандартом в отрасли. Подробную инструкцию по её установке можно найти на сайте одноимённого проекта.
Наиболее распространённым сейчас (на мой взгляд) способом хранения видео является контейнер MP4 с использованием кодека H.264 AVC. Их мы, собственно, и рассмотрим.
Первым делом обратите внимание, что Android поддерживает не все возможности кодека H.264, а только определённый набор — профиль, именуемый Baseline Profile(BP). Так, например, в BP не входят такие полезные фичи H.264 как CABAC или B-Frames.
Для нас это значит, что если мы будем использовать эти фичи при кодировании видео, то Android проигрывать это видео будет не обязан. Хотя и может, если ваш телефон достаточно мощный и вендор позаботился об установке и поддержке дополнительных кодеков. Так, например, видео в Main Profile без проблем проигрывается на Samsung Galaxy SII. На телефонах же обычного класса (например, Samsung Galaxy Ace) мы получим сообщение о невозможности воспроизведения видео и ошибку с кодом неверного кодека в logcat‘е.
Но перейдём от теории к практике. Для того, что бы пережать видео, необходимо выполнить следующую команду:
ffmpeg -i in.3gp -f mp4
-vcodec libx264 -vprofile baseline -b:v 1500K
-acodec libfaac -b:a 128k -ar 44100 -ac 2
-y out.mp4
Рассмотрим подробнее каждый из параметров:
- -i src входной (перекодируемый) файл;
- -f mp4 используемый видеоконтейнер;
- -vcodec libx264 используемый видеокодек;
- -vprofile baseline используемый профиль;
- -b:v 1500K bitrate;
- -acodec libfaac используемый аудиокодек;
- -b:a 128k аудио bitrate;
- -ar 44100 частота звука;
- -ac 2 количество аудиопотоков;
- -y флаг перезаписи выходного файла;
Так же стоит отметить, что можно обойтись и без указания профиля, а явно включить/отключить нужные опции кодека H.264 через параметр -x264opts, так что бы они удовлетворяли условиям BP. Но это же занятие для любителей.
Раздача видео
Самый простой способ воспроизвести видео с удалённого сервера — это скачать его во временное хранилище и воспроизвести локально. Однако, думаю всем понятно, что в виду размеров современных видеозаписей — это не вариант.
Как же быть? Платформа Android предлагает нам нативную поддержку следующих технологий/протоколов:
- HTTP/HTTPS progressive streaming;
- HTTP/HTTPS live streaming;
- RTSP (RTP, SDP);
Рассмотрим их по порядку.
Progressive streaming
Наиболее простой способ раздачи видео с помощью обычного web-сервера, сводящийся по сути к скачиванию заранее подготовленного файла по HTTP(S) протоколу. Вся соль в данном случае заключается в том, что воспроизведение файла начинается не по окончанию загрузки, а как только будет скачано достаточно данных (наполнен некоторый буфер).
Тут стоит уточнить, что при использовании контейнера MP4, необходимо сформировать файл так, что бы метаданные о видео потоке (moov atoms) располагались в начале файла (после атома ftyp), перед видеоданными (mdat atoms). Сделать это можно с помощью обработки файла утилитой qt-faststart:
Основной проблемой progressive streaming‘а является невозможность перемотки видео к нескачанному моменту, наличие достаточного количества свободного места на устройстве и необходимость поддержки большого числа «толстых» клиентов, скачивающих видео, на web-сервере.
Воспроизведение с помощью данной технологии поддерживается платформой Android нативно. Вы без проблем (если не считать канал связи, мощность девайса и наличие свободного места) сможете проиграть удалённый файл с помощью стандартного класса MediaPlayer.
Pseudo streaming
Данная технология является логическим расширением progressive streaming‘a и позволяет решить одну из его главных проблем — перемотки к ещё не скачанному фрагменту. Применима для контейнеров MP4/FLV с кодеком H.264/AAC.
Единственным отличием от progressive streaming‘a в данным случае является, тот факт, что вам потребуется специальный web-сервер, который с учётом временной метки в GET-запросе будет отдавать нужный вам фрагмент видео файла. Примером такого web-сервера естественно может служить православный NGINX с его ngx_http_mp4_module.
Мне не удалось найти какой-либо официальной информации относительно поддержки данного стандарта в Android. Однако, эмперическим путём было установлено, что она присутствует как минимум на устройствах HTC Desire и Samsung Galaxy SII. Однако, хочу обратить внимание, что да же в случае отсутствия нативной поддержки на вашем устройстве всегда можно воспользоваться сторонними плеерами типа MX Player, которые самостоятельно реализуют логику скачки и воспроизведения фрагментов видео с нужной временной меткой, что позволяет организовать перемотку.
Live streaming
Довольно нестандартный протокол передачи данных от компании Apple. Суть его сводится к тому, что раздаваемый файл «пилится» на множество небольших частей, объединяемых спецтальным файлом-playlist’ом формата M3U8. Передача данных происходит по протоколу HTTP(S).
Ни каких проблем с перемоткой и свободным местом на устройстве в данном случае не возникает. Более того, при некоторых условиях у вас появляется возможность выбирать качество проигрываемого видео.
Однако, появляются и проблемы. Для «распила» файла и создания playlist’а потребуется ресурсы процессора, время и место на сервере. Для вещания файла в сеть, как и в предыдущих примерах, потребуется HTTP сервер (без каких-либо дополнительных модулей).
«Распилить» видео файл можно использовать VLC:
Воспроизвести такой файл можно по URL localhost/pornofilm.m3u8.
Поддержка HTTP Live Streaming на нативном уровне в Android присутствует начиная с версии 3.0. С помощью сторонних плееров (DicePlayer, MX Player), судя по wiki, можно добиться поддержки с версии 2.2.
Real Time Streaming Protocol (RTSP)
Протокол прикладного уровня с поддержкой состояния, разработанный специально для передачи видео. Формат команд очень напоминает HTTP. Сами же команды напоминают кнопки на обычном кассетном магнитофоне: PLAY, PAUSE, RECORD и т.д.
В отличие от HTTP Live Streaming RTSP не требует разбиения фалов на мелкие части и составления playlist’ов. Нужные части файла будут генерироваться и отдаваться клиенту налету. В качестве RTSP сервера можно использовать VLC.
Стоит заметить, что сам протокол RTSP не определяет способ передачи данных, а делегирует это другим протоколам. Например, RTP. Для вещания файла по протоколу RTP нужно будет запустить VLC со следующими параметрами:
Однако, поднимать для каждого файла свой процесс с отдельным портом вне зависимости от наличия пользователей, желающих его просмотреть, было бы глупо.
Поэтому вернёмся к протоколу RTSP и воспроизведению видео по требованию (Vidoe On Demand). Для того, что бы использовать VLC в качестве RTSP сервера для проигрывания VOD необходимо прежде всего запустить VLC, указав атрибуты RTSP сервера и Telnet интерфейса:
vlc -vvv -I telnet —telnet-password 123 —rtsp-host 127.0.0.1 —rtsp-port 5554
После этого как сервер запущен, необходимо произвести его настройку. Делать это удобнее всего с помощью telnet‘a, так как такой подход даёт возможность настройки налету:
setup porno input /path/to/pornofilm.mpg
Для воспроизведения видео (в том числе и на платформе Android) необходимо запросить его по URL rtsp://localhost:5554/pornofilm.
Из недостатков можно отметить тот факт, что HTTP открыт зачастую на всех firewall’ах и проксях… с RTSP в случае политики Deny,Allow всё иначе.
Кроме того, при использовании RTSP-сервера для добавления/удаления файлов на сервере придётся обновлять его конфигурацию (список vod’ов). Да, для этого есть telnet, но это всё равно сложнее, чем просто заливать или удалять файлы из каталогов web-сервера.
Воспроизведение с помощью данной технологии поддерживается платформой Android нативно. Например, с помощью всё того же стандартного класса MediaPlayer.
Multicast
Многие считают, что multicast не работает в Android. Это не совсем так.
Во первых, в большинстве случаев он просто отключен по умлочанию, что бы не грузить ресурсы девайса лишней работой. Его можно просто включить.
Во вторых, да — на довольно внушительном количестве устройств он отключен во все или работает некорректно. В интернетах, поэтому поводу можно найти много слёз и даже некоторые решения.
Однако, как показывает практика, проигрывать multicast видео на Android всё можно. В моём случае с этой задачей удачно справился недавно вышедший VLC Beta для Android.
Кроме того с помощью VLC-сервера всегда можно свести воспроизведение multicast‘a к HLS:
new multicast-porno vod enabled
setup multicast-porno input udp://@192.168.20.1:1234
Попытать удачу с проигрыванием multicast’a на вашем устройстве вы можете, передав плееру URL вида udp://@192.168.20.1:1234.
Что выбрать
Если с форматом видео всё ясно (H.264 BP / MP4), то со спобом дистрибуции вопрос открыт. У каждого их них есть свои достоинства и недостатки.
Первым делом из рассмотрения я бы убрал обычный progressive streaming. Да он работает всегда и везде, но отсутствие перемотки и загрузка всего файла целиком — это уже слишком.
Следующим кандидатом на вылет является live streaming. Главным его недостатком является нативная поддержка в Android начиная с версии 3.0. А игнорирование более 80% пользователей c версией 2.x — не вариант. Хотя тут можно посмотреть на сторонний плеер, или заняться собственной реализацией (свободных наработок для поддержки HLS я, увы, не нашёл).
И последним я бы вычеркнул RTSP. Да, это протокол, разработанный специально для видео. Да, его использование идейно верно. Но есть два момента. Во первых — необходимо постоянно обновлять конфигурацию сервера. Во вторых, HTTP открыт всегда и везде, чего нельзя сказать о RTSP/RTP.
Лично я бы остановился на pseudo streaming. Он позволяет осуществлять перемотку и при этом не скачивать весь файл полностью. От нас требуется только немного донастроить web-сервер.
Источник
Documentation:Android
Here is the documentation of the Android port of VLC media player.
Contents
Preliminary Notes
VLC for Android is a little different from VLC on desktops. In some ways, you can do more; in other ways, you can do less. VLC for Android only does media playback. Active streaming or file / stream to file conversations are not supported for usability and performance reasons. This walk-through does only include screenshots of a phone interface for size reasons. However, all features are also available on tablets with a similar appearance.
Feature Overview
Feature | Version 1.0 | Version 1.6 | Version 2.0 | Version 2.5 | Version 3.0 | Version 3.1 |
---|---|---|---|---|---|---|
Opening Network Streams | No | Yes | Yes | Yes | Yes | Yes |
UPnP discovery and streaming | No | Yes | Yes | Yes | Yes | Yes |
Plex server discovery and streaming | No | Yes | Yes | Yes | Yes | Yes |
Password-protected Plex shares | No | No | No | No | No | No |
Downloads from UPnP multimedia servers | No | No | No | No | No | No |
FTP discovery, streaming | No | Yes | Yes | Yes | Yes | Yes |
Store FTP server bookmarks | No | No | No | Yes | Yes | Yes |
Audio Playback via Connector Cables | Yes | Yes | Yes | Yes | Yes | Yes |
Video Playback via Connector Cables | Yes | Yes | Yes | Yes | Yes | Yes |
Subtitles playback | Yes | Yes | Yes | Yes | Yes | Yes |
Subtitles Font Customization | No | No | Yes | Yes | Yes | Yes |
Closed Caption playback | Yes | Yes | Yes | Yes | Yes | Yes |
Teletext subtitles playback | No | No | Yes | Yes | Yes | Yes |
Multi-track audio handling | No | Yes | Yes | Yes | Yes | Yes |
Video Filtering incl. Screen Brightness | No | No | No | No | No | No |
Video Cropping and Aspect Ratio variation | Yes | Yes | Yes | Yes | Yes | Yes |
Deinterlacing | Yes | Yes | Yes | Yes | Yes | Yes |
Playback Speed control | Yes | Yes | Yes | Yes | Yes | Yes |
Audio/Subtitles delay control | No | No | Yes | Yes | Yes | Yes |
Repeated playback | Yes | Yes | Yes | Yes | Yes | Yes |
Gestures based playback control | Yes | Yes | Yes | Yes | Yes | Yes |
Playback of Audio-only media (mp3, m4a, flac, …) | Yes | Yes | Yes | Yes | Yes | Yes |
Audio Playback in Background | Yes | Yes | Yes | Yes | Yes | Yes |
Video Playback in Background | Yes | Yes | Yes | Yes | Yes | Yes |
Playback timer | Yes | Yes | Yes | Yes | Yes | Yes |
Chapter & title selection | No | No | Yes | Yes | Yes | Yes |
10-band equalizer | Yes | Yes | Yes | Yes | Yes | Yes |
Playback UI Lock | Yes | Yes | Yes | Yes | Yes | Yes |
Smart Media Library sorting for audio albums and TV shows | Yes | Yes | Yes | Yes | Yes | Yes |
Media Library Search | No | Yes | Yes | Yes | Yes | Yes |
Passcode Lock | No | No | No | No | No | No |
Voice search support | No | No | No | Yes | Yes | Yes |
Voice actions support | No | No | No | No | No | No |
Organize media in folders | No | No | No | No | No | No |
Use folders as playlists | No | No | Yes | Yes | Yes | Yes |
Loop playlists | Yes | Yes | Yes | Yes | Yes | Yes |
Playback control through headphones or lock screen | Yes | Yes | Yes | Yes | Yes | Yes |
Mediasession support (Wear, TV, etc…) | No | No | Partial | Yes | Yes | Yes |
Playback is paused when headphones are unplugged | Yes | Yes | Yes | Yes | Yes | Yes |
WiFi upload and HTTP downloads in background | No | No | No | No | No | No |
Support for password protected HTTP streams | No | No | No | No | No | No |
Sharing files with further apps | No | No | No | No | No | No |
Custom vlc:// protocol | No | No | Yes | Yes | Yes | Yes |
Support for x-callback-url | No | No | No | No | No | Yes |
Action mode | No | No | No | Yes | Yes | Yes |
Android TV | No | Yes | Yes | Yes | Yes | Yes |
Picture-in-Picture | No | No | Partial | Yes | Yes | Yes |
ChromeOS support | No | ARC | ARC | Yes | Yes | Yes |
Android Auto | No | No | No | Yes | No | Yes |
Sorting | No | No | Partial | Yes | Yes | Yes |
360° videos | No | No | No | Yes | Yes | Yes |
DayNight mode | No | No | No | Yes | Yes | Yes |
Chromecast | No | No | No | No | Yes | Yes |
Equalizer custom presets | No | No | No | No | Yes | Yes |
Audio boost | No | No | No | No | Yes | Yes |
Android 2.1 support | Yes | Yes | No | No | No | No |
Android 2.2 support | Yes | Yes | Yes | No | No | No |
Android 2.3 support | Yes | Yes | Yes | Yes | Yes | No |
Android 6 (Runtime permissions) | No | No | Yes | Yes | Yes | Yes |
Android 8 support | No | No | No | Partial | Partial | Yes |
Installation
There are many ways to install VLC on Android. This may be because you have a non-ARMv7 or x86 processor or do not wish to use the Play Store for whatever reason.
From the Play Store (recommended)
The normal way, for ARMv7 (and above) and x86 processors only. Don’t know your processor? Don’t worry, if you can download it, you have a compatible ARMv7 or an x86 processor.
From the F-Droid Repository
The F-Droid repository (https://f-droid.org) is a completely FOSS (Free and Open Source Software) equivalent to the Google Play Store. The F-Droid Repository and all apps within it are provided completely free of charge and licensed under open source licenses. The F-Droid repository can be downloaded directly from their website. The «Unknown Sources» setting must be turned on for Android devices (typically located in Settings -> Security) in order to install repositories other than the Google Play Store.
From VideoLAN
If you can’t download from the Play Store or just want to install the VLC .apk by yourself, follow these steps:
- Go to Android Settings → Security → Device Administration → Enable ‘Unknown Sources’
- Go to our download server, preferably from your device: http://get.videolan.org/vlc-android/2.0.6/
- Choose your processor architecture (ARMv7 or Intel x86) and grab the .apk file.
- Click on the .apk you just downloaded and install it.
Don’t really know your processor architecture? Try both. it’s not very clever, but it’s harmless.
None of the two work? It is possible that you have an older processor with the ARMv6 architecture. The solution for now is to install a Nightly Build release. See below.
Still doesn’t work? Really? Well, then you must have an exotic processor. Contact us, on the Android forum or directly at android-support@videolan.org.
Be a Beta tester or try a Beta release
You want want to know the future of VLC for Android? You want to help us and/or test if your issue is already fixed for the next release ?
Be a Beta tester
Just follow this link Be a Beta tester
Soon, Beta release will automatically install on our device.
Try a Beta release
You don’t want to be a Beta Tester but just try a Beta ? Follow these steps :
- Go to Android Settings → Security → Device Administration → Enable ‘Unknown Sources’
- Go to our server, preferably from your device, : http://get.videolan.org/testing/android/2.1.13/
- Choose your processor architecture (ARMv7, ARMv8, x86. )
Don’t really know your processor architecture? Try both. it’s not very clever, but it’s harmless - Download the chosen .apk on your device
- Click on the .apk you just download and install it.
Install a Nightly Build
You fear nothing and want our very last works on VLC ? Or you have an ARMv6 Processor and want VLC? Follow these steps:
- Go to Android Settings → Security → Device Administration → Enable ‘Unknown Sources’
- Go to our server, preferably from your device: http://nightlies.videolan.org/
- Choose your processor architecture (ARMv7, ARMv8, x86. )
- Grab the latest .apk
- Click on the .apk you just download and install it.
You may experience some weird issues but generally, it works fine. If not, please try an older nightly release, and contact us.
Interface
At first start, VLC scans all your device to find all your media files. This is the main interface after the scan :
|
|
Playing Video
Video browser view
This view displays all your videos present in your device, or in the directories you have specified (see Preferences). To play one, just click on it, like the video .
Note the difference with the video which is a group of videos : VLC automatically groups your videos with the 4 same starting letters.
|
Video playback interface
|
|
- You can change audio and/or subtitle track if there are any. If not, these icons won’t be displayed.
- The Video Menu icon is only displayed for iso video (a DVD iso for example)
Источник