Extract video frames in Android

I wanted to know if it is possible to extract frames from a running video in Android? I need to regularly extract frames and send them for further processing.

Can anyone find an answer for me?

Thanks,

Abi

+5
source share
3 answers

You can use MediaMetadataRetriever :

I am currently using this when calling:

mediaMetadataRetriever.getFrameAtTime(timeUs,MediaMetadataRetriever.OPTION_CLOSEST); 

I get a bitmap frame.

Please note that it is only supported with: API Level 10 .

+11
source

You can use the following code:

 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(); 
+3
source

Assuming you are using MediaPlayer, I find it impossible to extract video (or audio) frames. The media player starts its own process [mediaplayerservice]. And only this process has access to these frames. This is considered a security breach if raw frames are available to other processes. Say, for example, you are playing back some copyrighted content, and then sharing these frames should not be allowed.

0
source

Source: https://habr.com/ru/post/1299473/


All Articles