我的应用程序捕获视频片段并将其保存为 .mp4 文件。我想从该视频中提取一帧并将其保存到文件中。由于我没有找到更好的东西,所以我决定使用MediaMetadataRetriever.getFrameAtTime()
它。它发生在从 AsyncTask 继承的类中。这是我的代码的样子doInBackground()
:
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 从视频中提取的。第二个是在三星 Galaxy S6 上使用上面的代码提取的。在我使用的每台 Android 设备上,结果看起来都差不多。
有人能告诉我如何提高导出图片的质量吗?