Где и как Android MediaPlayer кэширует прогрессивные загрузки

Мне нужно знать, где и как MediaPlayer кэширует аудио/видеоконтент, когда он "потоковое" через прогрессивную загрузку по умолчанию.

Мы оцениваем варианты приложения для медиаплеера Android. Одной из проблем является предотвращение копирования контента (насколько это возможно). Прогрессивная загрузка имеет много преимуществ, но мы должны быть уверены, что предпринимаем разумные шаги для защиты носителя. Должно быть, я неправильно ищу в неправильных местах, потому что я не смог найти никаких подробностей об этом. Я просмотрел файловую систему нашего тестового устройства, пытаясь найти какие-либо кешированные файлы из нашего тестового приложения с последовательной загрузкой — безрезультатно (что потенциально хорошо для наших целей).


person Chuck Spencer    schedule 08.03.2013    source источник


Ответы (1)


В Android MediaPlayer — это класс верхнего уровня, который абстрагирует базовые механизмы проигрывателя. В MediaPlayer общая обработка разделена на 3 основных компонента:

MediaTrack ==> OMXCodec / ACodec ==> Sink

Где MediaTrack — это конкретная реализация трека, основанная на MediaExtractor, который является механизмом синтаксического анализатора.

MediaExtractor инициализируется DataSource, который абстрагирует источник ввода. Для вашей прогрессивной загрузки основное внимание будет уделяться реализации DataSource, так как это обеспечит буферы для нижестоящих компонентов. Поскольку платформа Android работает по модели pull, DataSource будет контролировать скорость предоставления данных.

В AOSP вы можете сослаться на пример реализации, как в http://androidxref.com/4.2.2_r1/xref/frameworks/base/media/java/android/media/MediaPlayer.java#2132 . Дополнительную информацию о реализации HTTPSource можно найти по адресу http://androidxref.com/4.2.2_r1/xref/frameworks/av/media/libstagefright/HTTPBase.cpp#47

person Ganesh    schedule 08.03.2013
comment
Большое спасибо за ответ. Это определенно указало мне на некоторые полезные направления. Я прошелся по коду MediaPlayer в отладчике, чтобы попытаться получить некоторое представление о реализации DataSource. К сожалению, я попал в тупик, когда MediaPlayer в конечном итоге вызывает собственную версию setDataSource - person Chuck Spencer; 08.03.2013
comment
Из JNI, т.е. android_media_mediaplayer, вызовы обычно попадают в MediaPlayer.cpp. Начиная с MediaPlayer.cpp, вызовы player->setDataSource обычно реализуются движком игрока, который может быть либо StagefrightPlayer, либо NuPlayer. В случае потокового воспроизведения звонки будут обрабатываться NuPlayer. - person Ganesh; 09.03.2013
comment
Спасибо еще раз. К сожалению, мне не удалось найти никакой документации по NuPlayer или StagefrightPlayer. Если бы у меня было время настроить linux dev rig и просмотреть код ASOP, я бы так и сделал. Но, к сожалению, не знаю. Я установил простое мультимедийное приложение на чистый в остальном телефон, воспроизвел mp3 через прогрессивную загрузку, а затем провел довольно исчерпывающий поиск в файловой системе через DDMS. Я не нашел ни опознаваемой, ни восстановимой копии аудиозаписи. Это приводит меня к выводу, что проигрыватель либо кэширует в памяти, либо кэширует в файловой системе каким-то сильно запутанным образом. Этого может быть достаточно. - person Chuck Spencer; 12.03.2013
comment
Я смог подтвердить через журналы, что AwesomePlayer используется. Awesomeplayer использует NuCachedSource2 для своего кеша см. здесь . И быстрый взгляд на NuCachedSource2 подтверждает что он использует систему кэширования страниц. Спасибо Ганеше за то, что направил меня в этом направлении. - person Chuck Spencer; 12.03.2013
comment
@ChuckSpencer Спасибо за подтверждение. Просто чтобы добавить свой предыдущий комментарий, я наблюдал NuPlayer в своих настройках для потоковой передачи RTSP. Однако для потоковой передачи https я мог наблюдать аналогичный путь, как вы упомянули. - person Ganesh; 12.03.2013