【问题标题】:Android: Bitmap.compress poor quality with PNG formatAndroid:Bitmap.compress 质量差,使用 PNG 格式
【发布时间】:2015-08-04 19:34:41
【问题描述】:

我的应用程序捕获视频片段并将其保存为 .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 设备上,结果看起来都差不多。

谁能告诉我如何提高导出图片的质量?

【问题讨论】:

  • 显然,PNG 压缩与此无关......它是MediaMetadataRetriever.getFrameAtTime 原因......所以选项:1.你应该忍受这个...... 2.在android上使用ffmpeg,太...
  • @Selvin 我的应用需要相当高质量的图片,所以我会寻找其他解决方案。另一方面,为这个功能结合 ffmpeg 似乎是一个很大的负担。谢谢你的回答:)

标签: android video bitmap mediametadataretriever


【解决方案1】:

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

【讨论】:

  • 嗨。我也遇到了这个问题,但我无法让它工作。主要问题是所有帧都已损坏(只是不同的水平线)。有什么想法吗?
猜你喜欢
  • 1970-01-01
  • 2016-04-22
  • 2020-12-01
  • 2019-12-05
  • 1970-01-01
  • 2015-02-16
  • 2013-07-09
  • 2020-11-10
  • 2011-08-18
相关资源
最近更新 更多