Intereting Posts
Откройте URL-адрес браузера, хотя мое приложение зарегистрировало для него фильтр намерений Фон из PreferenceActivity не применяется к экрану Sub-PreferenceScreen Пустая страница при запуске SetOnKeyListener не отвечает Проверка подписи на покупку приложения с помощью PHP openssl Откройте еще одну активность на Android с помощью кнопки Пользовательский текстовый просмотр с поворотом, масштабированием, уменьшением масштаба и перемещением по прикосновению в андроиде? Какой лучше дизайн пакета? Возможно, вместо xpdf можно будет использовать библиотеку poppler для Android-приложения (NDK)? В чем разница между drawableLeft и drawableStart в EditText? Улавливать экран раньше, слишком поздно Log.wtf против необработанного исключения Android: последствия наличия targetSDK> BuildTarget Какова цель годовых репозиториев git в .repo / projects /, созданных сценарием репо Android? Проблемы с Vimeo Player в веб-приложении Android App

Android Создать видео Thumbnail в определенное время

Мне уже удалось создать миниатюру из моего видео. Код выглядит так:

videoGalleryThumbnails.add(ThumbnailUtils.extractThumbnail(ThumbnailUtils.createVideoThumbnail( videoFile.getAbsolutePath(), MediaStore.Images.Thumbnails.MINI_KIND), 500, 200)); 

Но созданное миниатюром действительно плохое время. Это точно, когда видео черное. Теперь я не использую полностью черный Thumbnail.

Как я могу взять миниатюру моего видео в определенное время? Например, в 00:31 или в 01:44?

Или это невозможно?

Я также пытался использовать MediaMetadataRetriever, но я получаю только белое изображение. Код выглядит так

 File tempVideoList[] = (Environment.getExternalStoragePublicDirectory(PATH_VIDEO_GALLERY)) .listFiles(); MediaMetadataRetriever retriever = new MediaMetadataRetriever(); Bitmap myBitmap=null; for (File videoFile : tempVideoList) { if (videoFile.isFile()) { //from here try { retriever.setDataSource(videoFile.getAbsolutePath()); myBitmap = retriever.getFrameAtTime(11); //at 11th second } catch (Exception ex) { Log.i("MyDebugCode", "MediaMetadataRetriever got exception:" + ex); } videoGalleryThumbnails.add(myBitmap); //to here } 

Если я заменю код, помеченный как «отсюда» до «здесь» с верхним первым кодом, он работает. Я также попробовал MediaMetadataRetriever.OPTION_CLOSEST и OPTION_CLOSEST_SYNC и OPTION_NEXT_SYNC.

Ладно, я понял. MediaMetadataRetriever был абсолютно правильным способом. Проблема в том, что он рассчитывает время в микросекундах, а не в секундах. Решение выглядит так:

 try { retriever.setDataSource(videoFile.getAbsolutePath()); int timeInSeconds = 30; myBitmap = retriever.getFrameAtTime(timeInSeconds * 1000000, MediaMetadataRetriever.OPTION_CLOSEST_SYNC); } catch (Exception ex) { Log.i("MyDebugCode", "MediaMetadataRetriever got exception:" + ex); } videoGalleryThumbnails.add(myBitmap); 

Я не знаю, действительно ли OPTION_CLOSEST_SYNC нужен, но похоже, что это лучший способ программирования.

Спасибо Уильяму Райли за то, что он указал мне в правильном направлении.

Для этого кода мало изменений:

 try { MediaMetadataRetriever retriever = new MediaMetadataRetriever(); 

// нужно управлять версией для setDataSource

  if (Build.VERSION.SDK_INT >= 14) retriever.setDataSource(video_path, new HashMap<String, String>()); else retriever.setDataSource(video_path); int timeInSeconds = 5; Bitmap thumb = retriever.getFrameAtTime(timeInSeconds * 1000000, MediaMetadataRetriever.OPTION_CLOSEST_SYNC); imageViewThumb.setImageBitmap(thumb); } catch (Exception ex) { ex.printStackTrace(); } 

Если мы не будем контролировать версию для « setDataSource », тогда мы получим исключения. Для меня он не работал до контроля версий.