如何在Android中捕获VideoView的屏幕截图或视频帧

代码

我已经尝试过此博客中的以下教程(http://android-er.blogspot.kr/2013/05/get-current-frame-in-videoview-using.html),其中显示了如何捕获视频帧从视频源使用MediaMetadataRetriever。但是,仅当视频位于手机本地时才有效。

VideoView通过IP流传输视频时是否可以捕获视频帧

代码

我找到了解决此问题的方法。似乎由于使用SurfaceView时硬件GPU低级的原因,VideoView不允许这样做。

解决方案是使用TextureView并使用MediaPlayer在其中播放视频。该活动将需要实现TextureView.SurfaceTextureListener。使用此解决方案拍摄屏幕截图时,视频会停顿一会儿。此外,TextureView不会为播放进度栏(播放,暂停,FF / RW,播放时间等)显示默认的UI。那是一个缺点。如果您还有其他解决方案,请告诉我:)

解决方法如下:

public class TextureViewActivity extends Activity 
    implements TextureView.SurfaceTextureListener, 
                OnBufferingUpdateListener, 
                OnCompletionListener, 
                OnPreparedListener, 
                OnVideoSizeChangedListener 
{
    private MediaPlayer mp;
    private TextureView tv;
    public static String MY_VIDEO = "https://www.blahblahblah.com/myVideo.mp4";
    public static String TAG = "TextureViewActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_texture_view);

        tv = (TextureView) findViewById(R.id.textureView1);
        tv.setSurfaceTextureListener(this);
    }

    public void getBitmap(TextureView vv)
    {
        String mPath = Environment.getExternalStorageDirectory().toString() 
                + "/Pictures/" + Utilities.getDayTimeString() + ".png";   
        Toast.makeText(getApplicationContext(), "Capturing Screenshot: " + mPath, Toast.LENGTH_SHORT).show();

        Bitmap bm = vv.getBitmap();
        if(bm == null)
            Log.e(TAG,"bitmap is null");

        OutputStream fout = null;
        File imageFile = new File(mPath);

        try {
            fout = new FileOutputStream(imageFile);
            bm.compress(Bitmap.CompressFormat.PNG, 90, fout);
            fout.flush();
            fout.close();
        } catch (FileNotFoundException e) {
            Log.e(TAG, "FileNotFoundException");
            e.printStackTrace();
        } catch (IOException e) {
            Log.e(TAG, "IOException");
            e.printStackTrace();
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.media_player_video, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

    @Override
    public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) 
    {
        Surface s = new Surface(surface);

        try
        {
            mp = new MediaPlayer();
            mp.setDataSource(MY_VIDEO);
            mp.setSurface(s);
            mp.prepare();

            mp.setOnBufferingUpdateListener(this);
            mp.setOnCompletionListener(this);
            mp.setOnPreparedListener(this);
            mp.setOnVideoSizeChangedListener(this);

            mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
            mp.start();

            Button b = (Button) findViewById(R.id.textureViewButton);
            b.setOnClickListener(new OnClickListener(){

                @Override
                public void onClick(View v) 
                {
                    TextureViewActivity.this.getBitmap(tv);
                }
            });
        }
        catch (IllegalArgumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SecurityException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalStateException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }  
    }

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在Android中流式传输视频时如何捕获VideoView的屏幕截图

来自分类Dev

防止在VideoView Activity中捕获视频屏幕-Android

来自分类Dev

Android中的视频帧捕获

来自分类Dev

如何在 Xamarin Android 中裁剪屏幕并截取屏幕截图?

来自分类Dev

如何在Android videoview中播放VIMEO视频URL

来自分类Dev

如何在Android Studio VideoView中自动重播视频

来自分类Dev

如何在Android中播放视频时拍摄videoview的快照?

来自分类Dev

如何在Android中获取布局的屏幕截图

来自分类Dev

如何在 Unity 中为 FirstPersonCharacter 相机以 15fps 的速度捕获屏幕截图

来自分类Dev

如何裁剪捕获的屏幕截图?

来自分类Dev

如何在Xcode中设置屏幕截图?

来自分类Dev

如何在Flutter中拍摄屏幕截图?

来自分类Dev

如何在python中截取屏幕截图?

来自分类Dev

如何在Xcode中设置屏幕截图?

来自分类Dev

屏幕伪影,不存在于屏幕截图或视频捕获中

来自分类Dev

如何捕获从Android的视频录制的实时帧图像帧

来自分类Dev

如何使用js或jquery捕获html中的屏幕截图

来自分类Dev

如何用走狗在 Python 中捕获屏幕截图?

来自分类Dev

如何在Node JS中拍摄整个屏幕的屏幕截图?

来自分类Dev

如何在Android的videoview中播放下载的.mp4视频

来自分类Dev

使用appium捕获Android屏幕截图

来自分类Dev

在VideoView android中播放视频

来自分类Dev

在videoview android中播放视频

来自分类Dev

如何拍摄全屏视频的屏幕截图?

来自分类Dev

如何拍摄全屏视频的屏幕截图?

来自分类Dev

如何全屏拍摄YouTube视频的屏幕截图?

来自分类Dev

屏幕截图未显示视频中的图像

来自分类Dev

如何在Android虚拟设备中拍摄完整的应用程序屏幕截图?

来自分类Dev

如何在Android / iOS移动测试-C#中截取屏幕截图?

Related 相关文章

  1. 1

    在Android中流式传输视频时如何捕获VideoView的屏幕截图

  2. 2

    防止在VideoView Activity中捕获视频屏幕-Android

  3. 3

    Android中的视频帧捕获

  4. 4

    如何在 Xamarin Android 中裁剪屏幕并截取屏幕截图?

  5. 5

    如何在Android videoview中播放VIMEO视频URL

  6. 6

    如何在Android Studio VideoView中自动重播视频

  7. 7

    如何在Android中播放视频时拍摄videoview的快照?

  8. 8

    如何在Android中获取布局的屏幕截图

  9. 9

    如何在 Unity 中为 FirstPersonCharacter 相机以 15fps 的速度捕获屏幕截图

  10. 10

    如何裁剪捕获的屏幕截图?

  11. 11

    如何在Xcode中设置屏幕截图?

  12. 12

    如何在Flutter中拍摄屏幕截图?

  13. 13

    如何在python中截取屏幕截图?

  14. 14

    如何在Xcode中设置屏幕截图?

  15. 15

    屏幕伪影,不存在于屏幕截图或视频捕获中

  16. 16

    如何捕获从Android的视频录制的实时帧图像帧

  17. 17

    如何使用js或jquery捕获html中的屏幕截图

  18. 18

    如何用走狗在 Python 中捕获屏幕截图?

  19. 19

    如何在Node JS中拍摄整个屏幕的屏幕截图?

  20. 20

    如何在Android的videoview中播放下载的.mp4视频

  21. 21

    使用appium捕获Android屏幕截图

  22. 22

    在VideoView android中播放视频

  23. 23

    在videoview android中播放视频

  24. 24

    如何拍摄全屏视频的屏幕截图?

  25. 25

    如何拍摄全屏视频的屏幕截图?

  26. 26

    如何全屏拍摄YouTube视频的屏幕截图?

  27. 27

    屏幕截图未显示视频中的图像

  28. 28

    如何在Android虚拟设备中拍摄完整的应用程序屏幕截图?

  29. 29

    如何在Android / iOS移动测试-C#中截取屏幕截图?

热门标签

归档