【问题标题】:Why isn't the seekbar moving as youtube video is playing in android?为什么在 android 中播放 youtube 视频时搜索栏不移动?
【发布时间】:2016-12-14 15:28:15
【问题描述】:

我在我的 android 项目中实现了一个 youtube 播放器(片段)。我正在尝试以无铬播放器风格播放视频,同时自己实现播放器控制。播放和暂停按钮工作正常,但是随着视频的进行,搜索栏没有移动。虽然,我可以通过它跳过视频(提前播放视频),但搜索栏并没有自行移动。我哪里做错了?

    @Override
        public void onInitializationSuccess(YouTubePlayer.Provider provider, YouTubePlayer youTubePlayer, boolean b) {
            if (!b) {
                YPlayer = youTubePlayer;
                displayCurrentTime();      // It displays current progress of video in --:-- format. It's working fine...
                YPlayer.loadVideo(id);     // id -> YouTube video id
                YPlayer.play();
                YPlayer.setPlayerStyle(YouTubePlayer.PlayerStyle.CHROMELESS);
                YPlayer.setPlayerStateChangeListener(new YouTubePlayer.PlayerStateChangeListener() {
                    @Override
                    public void onLoading() {
                    }

                    @Override
                    public void onLoaded(String s) {
                    }

                    @Override
                    public void onAdStarted() {
                    }

                    @Override
                    public void onVideoStarted() {
                        seekBar.setMax(YPlayer.getDurationMillis()/1000);
                    }

                    @Override
                    public void onVideoEnded() {
                    }

                    @Override
                    public void onError(YouTubePlayer.ErrorReason errorReason) {
                    }
                });

                YPlayer.setPlaybackEventListener(new YouTubePlayer.PlaybackEventListener() {
                    @Override
                    public void onPlaying() {
                        handler.postDelayed(runnable, 100);   //Handler's instance initialized as instance variable
                        displayCurrentTime();
                    }

                    @Override
                    public void onPaused() {
                        handler.removeCallbacks(runnable);
                    }

                    @Override
                    public void onStopped() {
                    }

                    @Override
                    public void onBuffering(boolean b) {
                        handler.postDelayed(runnable, 1000);
                    }

                    @Override
                    public void onSeekTo(int i) {
                        handler.removeCallbacks(runnable);
                    }
                });
                playerControl.setVisibility(View.VISIBLE);   //Layout with play (and pause) button, Seekbar (which isn't moving along with the video), and timer (string being returned by the above displayCurrentTime() method)
            }
        }

        @Override
        public void onInitializationFailure(YouTubePlayer.Provider provider, YouTubeInitializationResult youTubeInitializationResult) {
        }
    });
    seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
        @Override
        public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
            long lengthPlayed = (YPlayer.getDurationMillis() * progress) / 100;
            YPlayer.seekToMillis((int) lengthPlayed);
        }

        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {

        }

        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {

        }
    });

    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            while(YPlayer != null && seekBar.getMax() > YPlayer.getCurrentTimeMillis())
            {
                int videoProgressed = 0;
                try
                {
                    Thread.sleep(1000);
                    videoProgressed = YPlayer.getCurrentTimeMillis();
                }
                catch (Exception e)
                {
                    e.printStackTrace();
                }
                seekBar.setProgress(videoProgressed);
            }
        }
    });


    private void displayCurrentTime() {
        if (YPlayer != null) {
            String formattedTime = formatTime(YPlayer.getCurrentTimeMillis());
            playTime.setText(formattedTime);
        }
    }

    private String formatTime(int millis) {
        int seconds = millis / 1000;
        int minutes = seconds / 60;

        return String.format("%02d:%02d", minutes % 60, seconds % 60);
    }

    private Runnable runnable = new Runnable() {
        @Override
        public void run() {
            if(YPlayer != null) {
                displayCurrentTime();
            }
            handler.postDelayed(this, 1000);
        }
    };

【问题讨论】:

    标签: android youtube youtube-api


    【解决方案1】:

    使用此代码

    自定义 youtube 播放器 CHROMELESS 样式 - 设置 SeekBar Progress 和 Seek Bar TrackingTouch 前进/后退

    mSeekBar = (SeekBar) findViewById(R.id.video_seekbar);
    
    mSeekBar.setOnSeekBarChangeListener(mVideoSeekBarChangeListener)
    
    SeekBar.OnSeekBarChangeListener mVideoSeekBarChangeListener = new SeekBar.OnSeekBarChangeListener() {
        @Override
        public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
    
        }
    
        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {
        }
    
        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {
            long lengthPlayed = (mYouTubePlayer.getDurationMillis() * seekBar.getProgress()) / 100;
            mYouTubePlayer.seekToMillis((int) lengthPlayed);
        }
    };
    
    private Runnable runnable = new Runnable() {
        @Override
        public void run(){
            displayCurrentTime();
            mHandler.postDelayed(this, 100);
        }
    };
    
    
     private void displayCurrentTime() {
        if (null == mYouTubePlayer) return;
        String formattedTime = formatTime(mYouTubePlayer.getDurationMillis() - mYouTubePlayer.getCurrentTimeMillis());
        play_timetv.setText(formattedTime);
        playPercent = (int) (((float) mYouTubePlayer.getCurrentTimeMillis()/(float) mYouTubePlayer.getDurationMillis()) * 100);
        System.out.println("get youtube displayTime 2 : "+playPercent);
        // update live progress
        mSeekBar.setProgress(playPercent, true);
    }
    

    【讨论】:

      【解决方案2】:

      如果对您有帮助,请查看tutorial。本教程是关于 Android 构建音频播放器的全部内容。这里讨论了如何构建一个简单的音频播放器,其中包含播放、暂停、前进、后退、下一个、上一个、播放列表和搜索栏等基本控件。

      只需查看教程解释如何更新在后台线程中实现的进度条计时器的代码,该后台线程使用 Handler 在后台运行。您可以在此处查看搜索栏是如何实现的。

      欲了解更多信息,请查看相关SO question

      【讨论】:

        【解决方案3】:

        添加 youtubeSeekBar.setProgress(yPlayer.getCurrentTimeMillis()/100);在 play() 事件中

        YPlayer.setPlaybackEventListener(new YouTubePlayer.PlaybackEventListener() {
                        @Override
                        public void onPlaying() {
                            handler.postDelayed(runnable, 100);   //Handler's instance initialized as instance variable
                            displayCurrentTime();
        
        youtubeSeekBar.setProgress(yPlayer.getCurrentTimeMillis()/100); //this is your key of success
                        }
        
                        @Override
                        public void onPaused() {
                            handler.removeCallbacks(runnable);
                        }
        
                        @Override
                        public void onStopped() {
                        }
        
                        @Override
                        public void onBuffering(boolean b) {
                            handler.postDelayed(runnable, 1000);
                        }
        
                        @Override
                        public void onSeekTo(int i) {
                            handler.removeCallbacks(runnable);
                        }
                    });
                    playerControl.setVisibility(View.VISIBLE);   //Layout with play (and pause) button, Seekbar (which isn't moving along with the video), and timer (string being returned by the above displayCurrentTime() method)
                }
        

        【讨论】:

          猜你喜欢
          • 2011-05-24
          • 1970-01-01
          • 2017-12-29
          • 2011-04-23
          • 2012-05-27
          • 1970-01-01
          • 1970-01-01
          • 2013-07-13
          相关资源
          最近更新 更多