【问题标题】:android get screenshot of current videoviewandroid获取当前videoview的截图
【发布时间】:2014-02-11 09:35:33
【问题描述】:

我已经看到了很多关于这个的老问题,也许现在有一些解决方案。 我想截取我的视频视图的当前帧。 Videoview 使用 rtsp 流显示实时视频。

我尝试拍摄位图,但总是黑色

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 不适用于流 url,可能适用于视频文件。 在link 使用 lib(它是启用 rtsp 协议输入的MediaMetadataRetriever 的包装器)我可以保存一帧视频,但是对于实时视频视图有 10 秒的延迟,因为它必须与流服务器创建一个新连接。

我没有测试ThumbnailUtils,但在 Api 中我读到输入只是文件路径

【问题讨论】:

  • 希望that 的回答会有所帮助。
  • 谢谢,我编辑我的问题
  • 您从 youtube 播放的视频?
  • 不,不是。它是一个 ip 实时摄像头的流媒体服务器

标签: java android android-mediaplayer android-videoview


【解决方案1】:

使用 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) {

}
}

Playing video on TextureView

【讨论】:

  • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会失效。
  • 你有一个例子可以用textureview截取视频吗?
  • onSurfaceTextureAvailable方法mMediaPlayer.setSurface(surface)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-26
  • 2015-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多