我想知道是否可以从Android中正在运行的视频中提取帧?我需要定期提取帧并发送它们进行进一步处理。
有人能为我找到答案吗?
谢谢,
ABHI
答案 0 :(得分:11)
您可以使用MediaMetadataRetriever: http://developer.android.com/reference/android/media/MediaMetadataRetriever.html
我正在使用它,通过调用:
mediaMetadataRetriever.getFrameAtTime(timeUs,MediaMetadataRetriever.OPTION_CLOSEST);
我得到了帧bitmap
。
请注意,它仅支持:API Level 10
。
答案 1 :(得分:2)
您可以使用以下代码:
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();
答案 2 :(得分:0)
假设您正在使用MediaPlayer,我相信无法提取视频(或音频)帧。媒体播放器运行它自己的进程[mediaplayerservice]。并且,只有此过程才能访问这些帧。如果原始帧可由其他进程访问,则将其视为安全违规。比如说你正在播放一些受版权保护的内容,那么就不应该允许访问这些帧。