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

Вопрос:

Как получить миниатюру видео для частного приложения? В частности, есть способ извлечь видео кадры из файла .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. Это решение, связанное с продуктом, которое я не могу совершить кругосветным путем; Если есть способ добавить видео в медиа-магазин, не будучи видимым для других приложений … Интересно, могут ли видео в приложении-частном хранилище быть добавлены в медиа-магазин и будут оставаться частным приложением, но получить все бесплатные «услуги» «Предоставленный медиа-магазином, например, создание миниатюр.

Solutions Collecting From Web of "Android: как получить миниатюру видео файла, который является приватным для вашего приложения?"

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

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

Вы пробовали с ниже 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. } 

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

Это работает на 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(); }