【问题标题】:VideoView not playing Video from desired positionVideoView 未从所需位置播放视频
【发布时间】:2011-12-20 21:43:26
【问题描述】:

我正在使用 VideoView 和搜索栏,但是当我通过 seekBar 在所需位置上搜索到(..)时,它会从开始播放视频。

我正在尝试这段代码:

public void onProgressChanged(SeekBar seekBar, int progress, boolean fromTouch) { mVideoView.seekTo(进度); }

【问题讨论】:

  • @just 我有疑问所以我只想知道。VideoView 在模拟器中工作吗?或者您正在设备上进行测试?因为我听说 VideoView 在模拟器中不起作用?
  • 我正在尝试在两个视频视图中播放视频,但问题是 seekTo() 请帮助
  • 能否多发些代码,让我们了解问题所在。

标签: android


【解决方案1】:

使用我的方法就像魅力一样

    1) Take mediaPlayer
        
        MediaPlayer mediaPlayer;

    2) init mediaPlayer
        
        videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override
            public void onPrepared(MediaPlayer mp) {
                mediaPlayer = mp; 
            }
        });
                
    3) use seekTo method like this

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            mediaPlayer.seekTo((int) mStartPosition, MediaPlayer.SEEK_CLOSEST);
        } else {
            mediaPlayer.seekTo((int) mStartPosition);
        }

【讨论】:

    【解决方案2】:

    你应该使用

    mVideoView.seekTo(progress, SEEK_CLOSEST)

    【讨论】:

    • 这不适用于 VideoView。
    • VideoView 没有名为 Seekto 的方法,带有两个参数。可能是它的媒体播放器对象
    【解决方案3】:

    VideoView.seekTo() 的调用是对MediaPlayer.seekTo() 的包装。即使仍在执行实际搜索,此函数也几乎立即返回。因此,您要等待通过MediaPlayer.OnSeekCompleteListener 完成搜索。

    但是,正如 Reno 所提到的,标准 VideoView 不支持 OnSeekCompleteListener

    但您可以复制并在本地自定义 VideoView 类以自己添加此支持。

    首先,从VideoView.java 的副本开始。或者您可以克隆整个 frameworks/base 存储库,但警告它需要下载超过 1 gig 的数据。

    将 VideoView.java 复制到您的 Eclipse Android 项目中,它将开始构建但失败。这是我为编译它所做的:

    1. 更新 package 语句以匹配您的项目。
    2. 注释掉对MetaData 的引用。对此的修复在我的待办事项列表中。这些需要替换为对MediaMetadataRetriever 的调用。
    3. mContext 替换为对getBaseContext() 的调用

    现在您可以添加OnSeekCompleteListener 的代码了。实现类似于其他监听器,即OnCompletionListener

    public class VideoView extends SurfaceView
            implements MediaPlayerControl {
    
        // The client's listener which is the notification callback.
        private OnSeekCompleteListener mOnSeekCompleteListener;
    
        // Set up MediaPlayer to forward notifications to client.
        private MediaPlayer.OnSeekCompleteListener mSeekCompleteListener =
            new MediaPlayer.OnSeekCompleteListener() {
            public void onSeekComplete(MediaPlayer mp) {
                if (mOnCompletionListener != null) {
                    mOnCompletionListener.onCompletion(mMediaPlayer);
                }
            }
        };
    
        // API for client to set their listener.
        public void setOnSeekCompleteListener(OnSeekCompleteListener l)
        {
            mOnSeekCompleteListener = l;
        }
    }
    

    最后,更新你自己的代码:

    1. 更新对android.widget.VideoView 的引用以使用您自定义的VideoView
    2. 实现一个监听器并通过调用setOnSeekCompleteListener()来设置它。

    您的代码现在会在搜索真正完成时收到通知,然后它可以执行后续搜索。

    【讨论】:

    • 它仍然对我不起作用 - 我已经修改了 videoview 但监听器仍然在实际时间前大约 6 秒触发。知道为什么
    • 嗨 Slartibartfast,您是说在搜索实际完成前 6 秒调用侦听器吗?我很好奇你是如何测量这个的。
    • 抱歉,我需要对 MediaPlayer.METADATA_ALL、MediaPlayer.BYPASS_METADATA_FILTER、Metadata.PAUSE_AVAILABLE 等做什么? MediaPlayer 和 MediaMetadataRetriever 没有这些常量。
    • 嗨 anivaler,我不熟悉这些常量。但正如您所说,它们不是 MediaPlayer 和 MediaMetadataRetriever API 的一部分,因此应该可以使用它们。
    【解决方案4】:

    VideoView 没有OnSeekCompleteListener(),但您可以从VideoViewonPrepared 方法访问MediaPlayer,然后设置OnSeekCompleteListener,如下所示:

    mVideoView.setOnPreparedListener(new OnPreparedListener() {
        @Override
        public void onPrepared(MediaPlayer mp) {
    
            mp.setOnSeekCompleteListener(new OnSeekCompleteListener() {
                @Override
                public void onSeekComplete(MediaPlayer mp) {
                    //TODO: Your code here
                }
            });
    
        }
    });
    

    【讨论】:

    • 我认为这应该是首选的解决方案。与维护自己的 VideoView 分支相比,它的脏和麻烦要少得多
    • 谢谢!这显然是最干净、最可靠的解决方案。我所看到的其他一切都是一团糟。
    【解决方案5】:

    你必须等待搜索完成,不幸的是VideoView没有OnSeekCompleteListener()(为什么是谷歌?-_-)

    【讨论】:

    • 有时候 Google 的 api 真的很混乱,编码体验真的很差
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多