ThumbnailUtils.createVideoThumbnail() не может получить битмап.

Вопрос или проблема

Я тестирую многие форматы файлов, например, avi, flv, wmv…, но все они возвращают нулевой битмап:

String aviPath = "xxxx.avi";
Bitmap bitmap = ThumbnailUtils.createVideoThumbnail(aviPath, MediaStore.Images.Thumbnails.MINI_KIND);

и лог выглядит так:
java.io.IOException: Не удалось создать миниатюру, не удается открыть xxx.avi.

Означает ли это, что эти форматы файлов сейчас не поддерживаются? Или я использую их неверно?

Редактировать:

  1. Путь к файлу не имеет проблем с разрешением, это data/data/packagename/files/xxx.avi.
  2. Только файл .mp4 может получить ожидаемый битмап.
  3. Новый рекомендованный метод public static Bitmap createVideoThumbnail (File file, Size size, CancellationSignal signal) имеет ту же проблему.

Прежде всего, согласно документации, метод:

public static Bitmap createVideoThumbnail (String filePath, int kind)

устарел с API 29, и рекомендуется использовать метод:

public static Bitmap createVideoThumbnail (File file, Size size, CancellationSignal signal)

так как он позволяет лучше контролировать изменение размера миниатюры и отмену.

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

Вы не предоставили информацию о том, где находится этот файл, как он добавляется/создается в вашем приложении, и это может быть важно для понимания, где проблема.

Ответ или решение

Использование метода ThumbnailUtils.createVideoThumbnail() для получения миниатюры видео может вызвать ряд проблем, особенно если видеофайлы имеют разные форматы, такие как AVI, FLV и WMV. Ниже приведены основные аспекты, которые следует учитывать, чтобы решить проблему получения null битмапа при использовании этого метода.

1. Поддержка форматов видео

На самом деле, метод ThumbnailUtils.createVideoThumbnail() часто работает только с определенными форматами, и MP4 обычно является наиболее поддерживаемым. Если вы получаете java.io.IOException: Failed to create thumbnail, can't open xxx.avi, это может указывать на то, что указанный метод не может справиться с видеофайлом формата AVI или другими форматами, которые вы используете для тестирования.

2. Доступ и разрешения

Вы упомянули, что путь к файлу не имеет проблем с разрешениями, так как это data/data/packagename/files/xxx.avi. Тем не менее, убедитесь, что файл действительно существует по указанному пути и доступен для чтения. Проверьте, правильно ли вы указали путь к файлу и может ли ваше приложение получить к нему доступ. Если файл отсутствует или поврежден, это также может привести к исключению.

3. Депрецированный метод

Как вы уже отметили, метод createVideoThumbnail(String filePath, int kind) устарел с API 29. Рекомендуется использовать новый метод:

public static Bitmap createVideoThumbnail(File file, Size size, CancellationSignal signal)

Этот метод предоставляет больше контроля над размером миниатюры и возможностью отмены операции. Однако, если тот же файл формата AVI по-прежнему вызывает проблему с получением битмапа, это также свидетельствует о потенциальной несовместимости с указанным форматом.

4. Применение альтернативных библиотек

Если вы все еще не можете создать миниатюру видео после проверки всех вышеперечисленных пунктов, вы можете рассмотреть возможность использования сторонних библиотек, таких как FFmpeg или библиотек для работы с медиа, которые давно зарекомендовали себя и поддерживают широкий спектр форматов.

5. Диагностика и отладка

Для дальнейшей диагностики проблемы вам стоит:

  • Использовать логи, чтобы выяснить, действительно ли файл доступен перед вызовом метода.
  • Проверить, является ли файл действительным видеофайлом и не поврежден ли он. Попробуйте открыть его в плеере.
  • Рассмотреть использование MediaMetadataRetriever, который поддерживает извлечение информации и миниатюр для видеофайлов. Например:
MediaMetadataRetriever retriever = new MediaMetadataRetriever();
retriever.setDataSource(aviPath);
Bitmap bitmap = retriever.getFrameAtTime();

Заключение

Сложности с получением битмапа для видеофайлов в различных форматах обычно связаны с несовместимостью формата и проблемами с доступом. Регулярные обновления подхода и использование современных методов, таких как createVideoThumbnail(File file, Size size, CancellationSignal signal) и MediaMetadataRetriever, могут значительно упростить вашу задачу. Если все же возникают проблемы, имеет смысл попробовать варианты сторонних библиотек, которые поддерживают большее количество форматов.

Оцените материал
Добавить комментарий

Капча загружается...