Android:Bitmap.compress质量差的PNG格式

时间:2015-08-03 14:14:27

标签: android video bitmap mediametadataretriever

我的应用会捕获视频片段并将其另存为.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输出格式会发生这种情况。你可以看到以下差异:
enter image description here enter image description here

第一张图片是在桌面上使用ffmpeg从视频中提取的。第二个是使用三星Galaxy S6上面的代码提取的。在我使用的每个Android设备上,结果看起来几乎相同。

有人可以告诉我如何提高导出图片的质量?

1 个答案:

答案 0 :(得分:0)

我找到了解决这个问题的其他方法。您可以使用bigflake's example构建提取视频帧的机制。您必须添加的一件事是寻求机制。这很好用,保持准确的质量,不需要任何第三方库。到目前为止,我唯一注意到的缺点是它会导致比原始想法更长的执行时间。