Извлечение видеокадров в Android - PullRequest
5 голосов
/ 26 января 2010

Я хотел знать, можно ли извлечь кадры из запущенного видео в Android? Мне нужно регулярно извлекать кадры и отправлять их для дальнейшей обработки.

Может ли кто-нибудь найти ответ для меня?

Спасибо

Аби

Ответы [ 3 ]

11 голосов
/ 05 декабря 2011

Вы можете использовать MediaMetadataRetriever: http://developer.android.com/reference/android/media/MediaMetadataRetriever.html

Я сейчас использую его, позвонив: mediaMetadataRetriever.getFrameAtTime(timeUs,MediaMetadataRetriever.OPTION_CLOSEST);

Я получаю bitmap.

кадра

Обратите внимание, что это поддерживается только с: API Level 10.

2 голосов
/ 25 августа 2016

Вы можете использовать код ниже:

String SrcPath="/sdcard/Pictures/Video Task/";

MediaMetadataRetriever mediaMetadataRetriever = new MediaMetadataRetriever();

mediaMetadataRetriever.setDataSource(SrcPath);
String METADATA_KEY_DURATION = mediaMetadataRetriever
        .extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);

Bitmap bmpOriginal = mediaMetadataRetriever.getFrameAtTime(0);
int bmpVideoHeight = bmpOriginal.getHeight();
int bmpVideoWidth = bmpOriginal.getWidth();

Log.d("LOGTAG", "bmpVideoWidth:'" + bmpVideoWidth + "'  bmpVideoHeight:'" + bmpVideoHeight + "'");

byte [] lastSavedByteArray = new byte[0];

float factor = 0.20f;
int scaleWidth = (int) ( (float) bmpVideoWidth * factor );
int scaleHeight = (int) ( (float) bmpVideoHeight * factor );
int max = (int) Long.parseLong(METADATA_KEY_DURATION);
for ( int index = 0 ; index < max ; index++ )
{
    bmpOriginal = mediaMetadataRetriever.getFrameAtTime(index * 1000, MediaMetadataRetriever.OPTION_CLOSEST);
    bmpVideoHeight = bmpOriginal == null ? -1 : bmpOriginal.getHeight();
    bmpVideoWidth = bmpOriginal == null ? -1 : bmpOriginal.getWidth();
    int byteCount = bmpOriginal.getWidth() * bmpOriginal.getHeight() * 4;
    ByteBuffer tmpByteBuffer = ByteBuffer.allocate(byteCount);
    bmpOriginal.copyPixelsToBuffer(tmpByteBuffer);
    byte [] tmpByteArray = tmpByteBuffer.array();

    if ( !Arrays.equals(tmpByteArray, lastSavedByteArray))
    {
        int quality = 100;
        String mediaStorageDir="/sdcard/Pictures/Video Task/";
        File outputFile = new File(mediaStorageDir , "IMG_" + ( index + 1 )
                + "_" + max + "_quality_" + quality + "_w" + scaleWidth + "_h" + scaleHeight + ".png");
        Log.e("Output Files::>>",""+outputFile);
        OutputStream outputStream = null;
        try {
            outputStream = new FileOutputStream(outputFile);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }

        Bitmap bmpScaledSize = Bitmap.createScaledBitmap(bmpOriginal, scaleWidth, scaleHeight, false);

        bmpScaledSize.compress(Bitmap.CompressFormat.PNG, quality, outputStream);

        try {
            outputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

        lastSavedByteArray = tmpByteArray;
    }
}
capturedImageView.setImageBitmap(bmpOriginal);
mediaMetadataRetriever.release();
0 голосов
/ 07 марта 2010

Предполагая, что вы используете MediaPlayer, я считаю, что невозможно извлечь видео (или аудио) кадры. Медиаплеер запускает свой собственный процесс [mediaplayerservice]. И только этот процесс имеет доступ к этим кадрам. Это считается нарушением безопасности, если необработанные кадры доступны другим процессам. Например, вы воспроизводите контент, защищенный авторскими правами, поэтому предоставление доступа к этим фреймам не должно быть разрешено.

...