2015-08-03 1 views
2

Мое приложение захватывает видеоматериалы и сохраняет его как файл .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. Вы можете увидеть разницу ниже:
enter image description here enter image description here

Первое изображение извлеченную из видео с помощью FFmpeg на моем рабочем столе. Второй был извлечен с использованием кода выше на Samsung Galaxy S6. Результат выглядит примерно так же на каждом устройстве Android, которое я использовал.

Может кто-нибудь сказать, как я могу улучшить качество экспортируемой картинки?

+1

очевидно, сжатие PNG не имеет ничего общего с этим ... это 'MediaMetadataRetriever.getFrameAtTime' причина ... поэтому параметры: 1. вы должны жить с этим ... 2. использовать ffmpeg на android, тоже .. – Selvin

+0

@Selvin Моему приложению нужны довольно качественные картинки, поэтому я буду искать какое-то другое решение. С другой стороны, включение ffmpeg для этой функции кажется большой перегрузкой. Спасибо за ответ :) –

ответ

0

Я нашел другое решение проблемы. Вы можете использовать bigflake's example для создания механизма для извлечения видео кадра. Единственное, что вам нужно добавить - это искать механизм. Это хорошо работает, сохраняет точное качество и не требует каких-либо сторонних библиотек. Единственный недостаток, который я заметил до сих пор, заключается в том, что это приведет к увеличению времени выполнения, чем исходная идея.