我想从MediaPlayer的视频textureview每100毫秒帧和位图的颜色配置的截图(位图)应ARGB_8888为什么MediaPlayer.seekTo()和onSurfaceTextureUpdated()在循环内不起作用?
我认为onSurfaceTextureUpdated叫,每次我打电话mediaplayer.seekTo(时间表),和我可以在那里获得位图。
因此,我创建的活动,其中textureview一个按钮,像这样的活动应用上点击方法:
public void onViewClicked() {
float begin = starttimeframe; // starting point of analysis in timeframe
float end = endtimeframe; // ending point of analysis in timeframe
int f = round(begin);
status = 2;
while (f < round(end)) {
mediaplayer.seekTo(f);
currenttimeframe = f;
f += 100; // forward to next frame (100ms interval)
}
Toast.makeText(Extractor2Activity.this, "Done!", Toast.LENGTH_SHORT).show();
}
并添加代码时,表面纹理更新,这样捕捉textureview:
public void onSurfaceTextureUpdated(SurfaceTexture surface) {
Bitmap bitmap = Bitmap.createBitmap(tvWidth, tvHeight, Bitmap.Config.ARGB_8888);
textureView.getBitmap(bitmap);
File file = new File(Environment.getExternalStorageDirectory().toString(), "capture" + current timeframe + ".jpg");
OutputStream fout = null;
try {
fout = new FileOutputStream(file);
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fout);
fout.flush();
fout.close();
MediaStore.Images.Media.insertImage(this.getContentResolver(), file.getAbsolutePath(), file.getName(), file.getName());
} catch (IOException e) {
e.printStackTrace();
}
}
问题是,textureview上的视频不会更改,onSurfaceTextureUpdated在迭代期间不会被调用。
onSurfaceTextureUpdated()仅在Toast消息显示后才被调用,只有一次。
我想必须有一个解决方案,但我不擅长android编程,不知道如何解决这个问题。
如何使seekTo和onSurfaceTextureUpdated在循环时正常工作?
我试过:
使用MediaMetadataRetriever.getFrameAtTime,它可以捕捉到内循环所需的帧,但获得的位图的颜色配置是默认RGB565,不知道如何从获得ARGB_8888配置的图像getFrameAtTime。
等待帧缓冲,然后在每次seekTo()调用后渲染。 – Abbas
@Abbas,感谢您的快速评论!你能否向我提供一些示例代码如何做到这一点? –