[英]android get screenshot of current videoview
我已經看到很多關於這個的老問題,也許現在有一些解決方案。 我想截取我的視頻的當前幀的截圖。 Videoview使用rtsp-stream顯示實時視頻。
我嘗試采用位圖,但它始終是黑色的
public static Bitmap loadBitmapFromView(View v) {
Bitmap b = Bitmap.createBitmap(v.getLayoutParams().width , v.getLayoutParams().height, Bitmap.Config.ARGB_8888);
Canvas c = new Canvas(b);
v.layout(0, 0, v.getLayoutParams().width, v.getLayoutParams().height);
v.draw(c);
return b;
}
編輯: MediaMetadataRetriever
不能與流網址一起使用,也許適用於視頻文件。 在此鏈接上使用lib(它是啟用rtsp協議輸入的MediaMetadataRetriever
包裝器)我可以保存一幀視頻,但實時視頻視圖有10秒的延遲,因為它必須與流服務器建立新連接。
我沒有測試ThumbnailUtils
,但在Api中我讀到輸入只是文件路徑
使用TextureView代替VideoView。 TextureView有getBitmap()方法。 以下是TextureView作為videoView的用法
public class TextureVideoActivity extends Activity implements TextureView.SurfaceTextureListener {
private static final String FILE_NAME = "myVideo.mp4";
private static final String TAG = TextureVideoActivity.class.getName();
private MediaPlayer mMediaPlayer;
private TextureView mPreview;
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.activity_texture_video);
mPreview = (TextureView) findViewById(R.id.textureView);
mPreview.setSurfaceTextureListener(this);
}
public Bitmap getBitmap(){
return mPreview.getBitmap();
}
public void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int width, int height) {
Surface surface = new Surface(surfaceTexture);
try {
mMediaPlayer = new MediaPlayer();
mMediaPlayer
.setDataSource(this, Uri.parse(FILE_NAME));
mMediaPlayer.setSurface(surface);
mMediaPlayer.setLooping(true);
// don't forget to call MediaPlayer.prepareAsync() method when you use constructor for
// creating MediaPlayer
mMediaPlayer.prepareAsync();
// Play video when the media source is ready for playback.
mMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mediaPlayer) {
mediaPlayer.start();
}
});
} catch (IllegalArgumentException e) {
Log.d(TAG, e.getMessage());
} catch (SecurityException e) {
Log.d(TAG, e.getMessage());
} catch (IllegalStateException e) {
Log.d(TAG, e.getMessage());
} catch (IOException e) {
Log.d(TAG, e.getMessage());
}
}
@Override
protected void onDestroy() {
super.onDestroy();
if (mMediaPlayer != null) {
// Make sure we stop video and release resources when activity is destroyed.
mMediaPlayer.stop();
mMediaPlayer.release();
mMediaPlayer = null;
}
}
@Override
public void onSurfaceTextureSizeChanged(SurfaceTexture surfaceTexture, int i, int i2) {
}
@Override
public boolean onSurfaceTextureDestroyed(SurfaceTexture surfaceTexture) {
return false;
}
@Override
public void onSurfaceTextureUpdated(SurfaceTexture surfaceTexture) {
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.