Android: как получить видео миниатюру файла, который является частным для вашего приложения? - PullRequest
15 голосов
/ 22 декабря 2011

Вопрос:

Как получить миниатюру видео для личного файла приложения? В частности, есть ли способ извлечения видеокадров из файла .mpeg напрямую?

Справочная информация:

  1. Мое приложение включает в себя камеру, которая может записывать видео.
  2. По причинам, связанным с продуктом, видеофайл изначально создается и записывается в приватном режиме в каталог личных данных приложения, что делает его закрытым для приложения. Это делается с помощью: Context#openFileOutput(fileName, Context.MODE_PRIVATE) - типичный путь к файлу выглядит следующим образом: /data/data/[package.name]/files/[fileName].mp4 - FYI Я уже пытался использовать Context.MODE_WORLD_READABLE вместо Context.MODE_PRIVATE, но это не помогло.
  3. Даже если видео может в конечном итоге оказаться во внешнем хранилище (при перемещении файла в Environment#getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES)) , миниатюра должна отображаться , пока видео находится в частном приложении хранение.
  4. Кажется, что ThumbnailUtils.createVideoThumbnail(String, int) отлично работает для файла после его перемещения в общедоступный каталог (независимо от добавления его в MediaStore), но молча завершается ошибкой (возвращает null) когда файл находится во внутренней памяти.

    • Примечание. Пока видеофайл находится в частном хранилище приложения, он не добавляется в MediaStore (поставщик изображений и видео на устройстве, входящем в галерею). Только после перемещения видео на внешнее хранилище я добавляю его в MediaStore. Это решение, связанное с продуктом, которое я не могу обойти; если только нет способа добавить видео в хранилище мультимедиа, чтобы оно не было видно другим приложениям ... Интересно, можно ли добавить видео в хранилище частных приложений в хранилище мультимедиа, и оно останется частным для приложений, но получит все бесплатные "услуги? "предоставлено медиа-магазином, таким как создание миниатюр.

Ответы [ 4 ]

3 голосов
/ 02 января 2012

Конечно, вы не можете использовать MediaStore для личных медиа. Я бы использовал библиотеку обработки изображений, если это вообще возможно. Я знаю, OpenCV может легко это сделать, извлекая / изменяя размер фрейма. - пожалуйста, посмотрите на среднюю часть страницы 2.

2 голосов
/ 04 января 2012

Большинство медиа-API являются просто связующим клиентом медиа-сервера, который работает в своем собственном процессе. Вы можете попытаться сделать файл общедоступным временным.

1 голос
/ 04 января 2012

пробовали ли вы использовать приведенный ниже API,

MediaMetadataRetriever :: getFrameAtTime (), см. Android-разработчик-страница-MediaMetadataRetriever

пример кода:

MediaMetadataRetriever retriever = new MediaMetadataRetriever();
try {
retriever.setDataSource(filePath);
bitmap = retriever.getFrameAtTime(0, MediaMetadataRetriever.OPTION_CLOSEST);
} catch (IllegalArgumentException ex) {
// Assume this is a corrupt video file
} catch (RuntimeException ex) {
// Assume this is a corrupt video file. }

Вышеупомянутый кусок кода работал для меня! но мой файл доступен в общих папках.

0 голосов
/ 20 апреля 2014

Это работает на Gingerbread и выше:

try {
    Uri location = Uri.fromFile(context.getFileStreamPath(filePath));
    MediaMetadataRetriever media = new MediaMetadataRetriever();
    ParcelFileDescriptor parcel = ParcelFileDescriptor.open(new File(location.getPath()),ParcelFileDescriptor.MODE_READ_ONLY);
    media.setDataSource(parcel.getFileDescriptor());
    Bitmap thumb = media.getFrameAtTime(0 , MediaMetadataRetriever.OPTION_CLOSEST );
    thumbnail.setImageBitmap(thumb);
} catch (FileNotFoundException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
...