【问题标题】:How to get current frame from a video in android Surfaceview?如何从 android Surfaceview 中的视频中获取当前帧?
【发布时间】:2019-10-09 05:55:42
【问题描述】:

我想创建一个正在播放实时视频的应用。单击按钮时必须捕获当前帧。 谢谢,

【问题讨论】:

    标签: java android frame surfaceview


    【解决方案1】:

    您可以使用MediaMetadataRetriever获取框架

    private fun getVideoFrame() {
        val retriever = MediaMetadataRetriever()
        retriever.setDataSource(VIDEO_PATH)
        val bitmap = retriever.getFrameAtTime(yourTime, MediaMetadataRetriever.OPTION_CLOSEST)
    }
    

    【讨论】:

    • 感谢您的宝贵时间。当我单击该按钮时,应用程序将崩溃并且错误如下... java.lang.IllegalArgumentException at android.media.MediaMetadataRetriever.setDataSource(MediaMetadataRetriever.java:76) at qc.yotm.mes.com.yo_qc。 MainActivity$3.onClick(MainActivity.java:306) at android.view.View.performClick(View.java:6608) at android.view.View.performClickInternal(View.java:6585) at android.view.View.access$3100 (View.java:785)
    • 表示你的路径无效。确保您的 VIDEO_PATH 正确显示
    • 视频正在播放
    • 我假设您从 url / uri 流式传输视频而不是从本地路径。所以在你的情况下使用这个 setDataSource (Context context, Uri uri)
    • 是的,它是一个 RTSP 链接。
    【解决方案2】:

    除了@Akshay Raiyani 回答,

    也许你遇到了this bug。如果是这样试试:

      public static Bitmap retriveVideoFrameFromVideo(String videoPath)
                    throws Throwable
            {
                Bitmap bitmap = null;
                MediaMetadataRetriever mediaMetadataRetriever = null;
                try
                {
                    mediaMetadataRetriever = new MediaMetadataRetriever();
                    if (Build.VERSION.SDK_INT >= 14)
                        mediaMetadataRetriever.setDataSource(videoPath, new HashMap<String, String>());
                        else
                            mediaMetadataRetriever.setDataSource(videoPath);
                    bitmap = mediaMetadataRetriever.getFrameAtTime();
                }
                catch (Exception e)
                {
                    e.printStackTrace();
                    throw new Throwable(
                            "Exception in retriveVideoFrameFromVideo(String videoPath)"
                                    + e.getMessage());
    
                }
                finally
                {
                    if (mediaMetadataRetriever != null)
                    {
                        mediaMetadataRetriever.release();
                    }
                }
                return bitmap;
            }
    

    【讨论】:

    • 感谢您与我分享宝贵的时间...我试过它显示以下 System.err: java.lang.RuntimeException: setDataSource failed: status = 0xFFFFFFEA 感谢 W/System.err:在 android.media.MediaMetadataRetriever._setDataSource(Native Method) 2019-10-09 12:58:40.860 10627-10627/qc.yotm.mes.com.yo_qc W/System.err: 在 android.media.MediaMetadataRetriever.setDataSource( MediaMetadataRetriever.java:102) W/System.err: 在 MainActivity$3.onClick(MainActivity.java:310) W/System.err: 在 android.view.View.performClick(View.java:6608)
    • 我添加了运行时权限
    • 是的,链接是 rtsp://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_115k.mov
    • 检查此issuetracker.google.com/issues/36952379#comment2 错误跟踪器并查看解决方案
    • 如果你得到 IllegalArgumentException 意味着路径无效
    猜你喜欢
    • 1970-01-01
    • 2013-07-20
    • 1970-01-01
    • 2019-05-14
    • 1970-01-01
    • 1970-01-01
    • 2016-06-16
    • 2020-06-07
    • 1970-01-01
    相关资源
    最近更新 更多