Извлечение видеокадров в Android

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

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

Спасибо,

Абхи


person Abhishek Sharma    schedule 26.01.2010    source источник
comment
Дубликат: stackoverflow.com/questions /1893072/   -  person Alexander Stolz    schedule 27.01.2010
comment
Я отметил этот возможный дубликат, но другой вопрос кажется более ориентированным на камеру, чем на воспроизведение (этот вопрос). Они могут быть очень разными ... Кроме того, в ответах на другой вопрос не так много деталей.   -  person Marc Gravell    schedule 27.01.2010
comment
Под бегом вы имеете в виду во время записи или во время воспроизведения?   -  person rogerdpack    schedule 07.09.2018


Ответы (3)


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

В настоящее время я использую его, позвонив:

mediaMetadataRetriever.getFrameAtTime(timeUs,MediaMetadataRetriever.OPTION_CLOSEST);

Я получаю кадр bitmap.

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

person Oren Bengigi    schedule 05.12.2011

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

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();
person Nilesh Gangadhar    schedule 25.08.2016
comment
Просто к сведению, METADATA_KEY_DURATION возвращает длину видео в миллисекундах. Цикл for может работать какое-то время. - person RudyF; 29.10.2020

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

person user287989    schedule 06.03.2010