Мое приложение захватывает видеоматериалы и сохраняет его как файл .mp4. Я хотел бы извлечь один кадр из этого видео и сохранить его в файл. Поскольку я не нашел ничего лучшего, я решил использовать для этого MediaMetadataRetriever.getFrameAtTime()
. Это происходит внутри класса, который наследуется от AsyncTask. Вот как мой код выглядит моя doInBackground()
:Android: низкое качество Bitmap.compress с PNG-форматом
Bitmap bitmap1 = null;
MediaMetadataRetriever retriever = new MediaMetadataRetriever();
try {
retriever.setDataSource(src);
bitmap1 = retriever.getFrameAtTime(timeUs, MediaMetadataRetriever.OPTION_CLOSEST_SYNC);
if (Utils.saveBitmap(bitmap1, dst)) {
Log.d(TAG, "doInBackground Image export OK");
} else {
Log.d(TAG, "doInBackground Image export FAILED");
}
} catch (RuntimeException ex) {
Log.d(TAG, "doInBackground Image export FAILED");
} finally {
retriever.release();
if (bitmap1 != null) {
bitmap1.recycle();
}
}
И saveBitmap()
метод:
File file = new File(filepath);
boolean result;
try {
result = file.createNewFile();
if (!result) {
return false;
}
FileOutputStream ostream = new FileOutputStream(file);
bitmap.compress(Bitmap.CompressFormat.PNG, 100, ostream);
ostream.close();
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
Теперь проблема заключается в том, что качество экспортируемого изображения заметно хуже, чем качество видео. Я не думаю, что это должно произойти с форматом вывода PNG. Вы можете увидеть разницу ниже:
Первое изображение извлеченную из видео с помощью FFmpeg на моем рабочем столе. Второй был извлечен с использованием кода выше на Samsung Galaxy S6. Результат выглядит примерно так же на каждом устройстве Android, которое я использовал.
Может кто-нибудь сказать, как я могу улучшить качество экспортируемой картинки?
очевидно, сжатие PNG не имеет ничего общего с этим ... это 'MediaMetadataRetriever.getFrameAtTime' причина ... поэтому параметры: 1. вы должны жить с этим ... 2. использовать ffmpeg на android, тоже .. – Selvin
@Selvin Моему приложению нужны довольно качественные картинки, поэтому я буду искать какое-то другое решение. С другой стороны, включение ffmpeg для этой функции кажется большой перегрузкой. Спасибо за ответ :) –