Создать демультиплексор для MPEG 2 TS в android

У меня есть требование, когда мне нужно извлечь теги ID3 из MPEG2 TS (HLS STREAM). MPEG2 имеет ограниченную поддержку в Android в отношении воспроизведения файла. Но меня беспокоит извлечение тегов ID3 ​​(воспроизведение файла не требуется). Поэтому меня не интересуют кодеки (кодирование и декодирование).

Я изучил следующие варианты:

libstagefright и OpenMax: движок воспроизведения, реализованный Google на базе Android 2.0. В нем есть MediaExtractor, отвечающий за получение данных трека и соответствующий мета данные из базовой файловой системы или http-потока. Но согласно этому сообщению Добавление видеокодека в Android, мне нужно создать моя собственная прошивка или мой собственный медиаплеер. Надеюсь, мне не придется идти по этому пути. Более подробную информацию о stagefright и openMax можно найти здесь:

Обзор проигрывателя Stagefright

Архитектура Android Stagefright Media Player

Интеграция пользовательского кодека оболочки в Android

Как интегрировать декодер в мультимедийную среду

Компиляция и использование FFMPEG: полное кроссплатформенное решение для записи, преобразования и потоковой передачи аудио и видео. Мы можем демультиплексировать ts-файлы с помощью этой библиотеки, как упоминалось здесь:

FFmpeg - извлечение видео и аудио из файла транспортного потока (. ts).

Но я не уверен, что смогу извлечь теги ID3 из HLS Stream. libavformat может это сделать, но мне все еще нужно придумать механизм для передачи сигналов о прочитанных метаданных моему приложению.

Компиляция vlc для Android: я скомпилировал vlc для Android и сделал несколько модификации внутри транспортного модуля в компоненте демультиплексирования для извлечения тегов, но он не может воспроизводить все потоки, которые я ему предоставляю.

После просмотра этих вариантов я все еще не понимаю, как этого добиться. Я не хочу создавать медиаплеер, так как я не буду воспроизводить файлы и не хочу создавать свою собственную прошивку. Использование ffmpeg кажется наиболее жизнеспособным вариантом, но я хочу попробовать это без использования какой-либо сторонней библиотеки или библиотеки с открытым исходным кодом. Мои вопросы:

Можно ли вообще с нуля создать демультиплексор, который будет работать на android?

Если возможно, то как это сделать?

Какие-то варианты, которые я пропустил?

Я новичок в этом. Любая помощь будет принята с благодарностью .. Спасибо


person anz    schedule 11.11.2013    source источник


Ответы (1)


В android есть поддержка извлечения ID3 тегов. Дополнительные сведения см. В ID3 module.

Интеграцию ID3 в MP3 extractor можно найти здесь .

Проведя быструю проверку, я обнаружил, что ID3 поддерживается начиная с Froyo.

person Ganesh    schedule 11.11.2013
comment
Спасибо за ответ .. Я видел эти файлы раньше, но предоставляет ли SDK для Android эти файлы в java? Я видел класс MediaMetaDataRetriever, но он не работает с файлами MPEG 2 TS. - person anz; 12.11.2013
comment
есть ли Java-интерфейс для MPEG2TSExtractor.cpp, расположенный в frameworks / base / media / libstagefright / mpeg2ts в исходном дереве Android - person anz; 13.11.2013
comment
@anz .. извините за задержку. Существует Java интерфейс для создания MediaExtractor, который можно найти здесь: androidxref.com/4.4_r1/xref/frameworks/base/media/java/android/. Точный экстрактор будет создан как часть setDataSource, как можно увидеть здесь: androidxref.com/4.4_r1/xref/frameworks/base/tests/Camera2Tests/. Надеюсь, эти ссылки помогут вам. - person Ganesh; 13.11.2013
comment
Еще одна полезная ссылка для MPEG2-TS находится здесь: androidxref. com / 4.4_r1 / xref / frameworks / av / media / libstagefright / - person Ganesh; 13.11.2013
comment
Спасибо за помощь ... Я видел ваш опыт в этой области и признателен за вашу помощь ... Обновите здесь, как только я что-то найду - person anz; 14.11.2013
comment
Я наконец-то нашел решение проблемы ... Я загружаю m3u8, разбираю его содержимое, загружаю ts-файлы по отдельности в локальное хранилище, запускаю HTTP-сервер на устройстве Android, чтобы сделать файлы доступными для mediaplayer ... воспроизведение отдельных файлов ts работает нормально, но когда я передаю локальный файл m3u8 (теперь все хранится локально), медиаплеер выдает ошибку (1, -1010) .. пожалуйста, помогите мне здесь - person anz; 26.11.2013
comment
@anz .. Судя по вашей ошибке Error (1, -1010), я чувствую, что вы получаете ERROR_UNSUPPORTED из основных компонентов проигрывателя (Ссылка: androidxref.com/4.4_r1/xref/frameworks/av/include/media/) возможно отсюда: androidxref.com/4.4_r1/xref/frameworks/av/media/ . Если вы можете включить журналы в NuPlayer и связанных модулях, я могу вам больше помочь. - person Ganesh; 26.11.2013
comment
спасибо за ответ .. игроки, такие как mx player, могут проигрывать локальные файлы m3u8, но не медиаплеер .. Это связано с какой-то внутренней реализацией ?? Как мне включить логи в NuPlayer? - person anz; 26.11.2013
comment
@anz .. Я не уверен, почему MediaPlayer не воспроизводит ваш файл. ИМХО, я считаю, что это скорее проблема конфигурации, чем реализация. Чтобы включить журналы, проверьте мой ответ здесь: stackoverflow.com/questions/19923412/ - person Ganesh; 26.11.2013
comment
Как я могу перекомпилировать libStageFright.so. Я здесь работаю только на уровне приложений .. Спасибо - person anz; 26.11.2013
comment
Я реализовал локальный http-сервер на своем устройстве для воспроизведения некоторых локально сохраненных файлов ts и извлечения тегов id3 ... Теперь я изучаю фреймворк android mediaplayer, чтобы выяснить их реализацию HLS. Но я не могу найти точный исходный код C ++, где это было сделано ... Было бы очень полезно, если бы вы могли указать на это ... Спасибо - person anz; 12.12.2013
comment
@anz .. Не могли бы вы уточнить, что вы ищете? Это HLS реализация или что-то другое? - person Ganesh; 12.12.2013
comment
@anz .. Я полагаю, это должно помочь: androidxref.com/ 4.4_r1 / xref / frameworks / av / media / libstagefright / - person Ganesh; 16.12.2013
comment
Извините за повторный вопрос ... но где этот код вызывается из java - person anz; 20.12.2013
comment
можно ли использовать libstagefright.so в нашем приложении, не создавая исходный код Android с нуля ... что-то вроде включения файла заголовка, который мне нужен, и создания оболочки jni вокруг него ... - person anz; 26.12.2013
comment
@anz .. libstagfright.so уже вызывается напрямую из приложения. Эта библиотека имеет встроенные реализации MediaPlayer, MediaRecorder, MediaExtractor, MediaCodec, MediaMuxer и т. д. Я не мог понять ваш запрос, когда вы говорите, что хотели бы использовать то же самое из JNI .. Я отвечу на ваш предыдущий вопрос в ближайшее время - person Ganesh; 26.12.2013