媒体播放器、进度条

     2023-02-25     41

关键词:

【中文标题】媒体播放器、进度条【英文标题】:MediaPlayer, ProgressBar 【发布时间】:2012-04-03 19:56:37 【问题描述】:

这是在播放媒体时更新 ProgressBar 的正确方法吗?我想在 MediaPlayer 中会有一个回调,但我找不到它。

mediaPlayer.start();
final SeekBar progress = (SeekBar) dialog.findViewById(R.id.seekBar1);
progress.setMax(mediaPlayer.getDuration());
new CountDownTimer(mediaPlayer.getDuration(), 250) 
  public void onTick(long millisUntilFinished) 
    progress.setProgress(progress.getProgress() + 250);
  
  public void onFinish() 
.start();

最好的问候。

【问题讨论】:

【参考方案1】:

就个人而言,我开始一个线程,每 200 毫秒左右检查一次 getCurrentPosition(),直到 onCompletion() 事件被触发:

private class MediaObserver implements Runnable 
  private AtomicBoolean stop = new AtomicBoolean(false);

  public void stop() 
    stop.set(true);
  

  @Override
  public void run() 
    while (!stop.get()) 
      progress.setProgress(mediaPlayer.getCurrentPosition());
      Thread.sleep(200);
    
  


private MediaObserver observer = null;

public void runMedia() 
  mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener
    @Override
    public void onCompletion(MediaPlayer mPlayer) 
      observer.stop();
      progress.setProgress(mPlayer.getCurrentPosition());
    
  );
  observer = new MediaObserver();
  mediaPlayer.start();
  new Thread(observer).start();

【讨论】:

计时器不会阻塞用户界面,所以我想它在另一个线程中。所以我想是一样的。我希望我足够聪明,能够弄清楚这些事情。 @pouzzler 倒计时计时器在另一个线程中运行,唯一的区别是它不使用实际进度。我会写一个线程示例 啊不用了,我明白了。谢谢:) 和以前一样的问题,我用了你的建议...... CountDownTimer:progress.setProgress(mediaPlayer.getCurrentPosition()); - 仍然不知道哪个是最好的 ;) 为我和我的哲学问题上床睡觉。 抱歉,我标记了另一个答案,因为它对每个人都更有用,尽管我现在会继续使用我的非 ICS 内容。【参考方案2】:

看看android.widget.MediaController,它有一个进度条。

如果合适,他们会使用递归调用自身的处理程序。您可以将延迟设置为您希望更新进度条的频率。

请注意,控制器可以显示或隐藏,也可以由用户拖动,当然,视频也可以停止。这些是在另一个递归调用更新栏之前进行各种检查 (!mDragging && mShowing && mVideoView.isPlaying()) 的原因。

protected Handler mHandler = new Handler()

    @Override
    public void handleMessage(Message msg)
    
        int pos;
        switch (msg.what)
        
            // ...

            case SHOW_PROGRESS:
                pos = setProgress();
                if (!mDragging && mShowing && mVideoView.isPlaying())
                
                    msg = obtainMessage(SHOW_PROGRESS);
                    sendMessageDelayed(msg, 1000 - (pos % 1000));
                
                break;

             // ...
        
    
;

要开始使用:

mHandler.sendEmptyMessage(SHOW_PROGRESS);

它会自行停止,但您应该使用以下命令取消最后一个待处理的请求:

mHandler.removeMessages(SHOW_PROGRESS);

【讨论】:

谢谢,正是我要找的东西。 @pouzzler - 不客气!查看 MediaController 类非常适合为您提供有关制作自定义控制器的想法。 第二个链接因 DMCA 删除而消失:github.com/OESF/OHA-Android-4.0.1_r1.0【参考方案3】:

最有效的方法是使用JRaymond的回答和EventBus

private class MediaObserver implements Runnable 
    private AtomicBoolean stop = new AtomicBoolean(false);
    public void stop() 
        stop.set(true);
    

    @Override public void run() 
        while (!stop.get()) 
            try 
              if (player.isPlaying())
                 sendMsgToUI(player.getCurrentPosition(),
                             player.getDuration());
             catch (Exception e)e.printStackTrace();
            try  
              Thread.sleep(100);
             catch (InterruptedException e)  e.printStackTrace(); 
        
    


private MediaObserver observer = null;

public void runMedia() 
    observer = new MediaObserver();
    new Thread(observer).start();


//handles all the background threads things for you
private void sendMsgToUI(int position) 
    ChangingEvent event = new ChangingEvent(position);
    EventBus.getDefault().post(event);

ChangingEvent 类看起来像这样:

public class ChangingEvent 
  private int position;

  public ChangingEvent(int position) 
      this.position= position;
  

  public int getPosition() 
      return position;
  

在你的 Activity 或 Fragment 中你所要做的就是

class YouClass extends Activity 
  private EventBus eventBus = EventBus.getDefault();


@Override protected void onCreate(Bundle savedInstanceState) 
    //your code
    eventBus.register(this);

//eventbus that updates UI
public void onEventMainThread(ChangingEvent event) 
    //seekbar or any other ui element
    seekBar.setProgress(event.getPosition());

【讨论】:

我喜欢这种方法,但我认为您忘记添加循环/while,这会使 run() 被多次执行 哦,是的,感谢您注意到这一点 - 我现在会更正它。

qml音乐播放器的进度条

进度条采用qml的Slider组件样式什么的,网上很多。我就不列举了。接下来主要说明,进度条是怎样按秒移动的。  Slider{                 id:control     &nbs 查看详情

第11章进度条媒体对象和well组件

...课我们主要学习一下Bootstrap的三个组件功能:Well组件、进度条组件、媒体对象组件。一.Well组件这个组件可以实现简单的嵌入效果。//嵌入效果<divclass="well">Bootstrap</div>//有lg和sm两种可选值<divclass="wellwell-lg">Bootstrap... 查看详情

播放器进度条组件

参考技术A播放器进度条由如下部分组成:中间的进度条由如下部分组成:根据以上的分析,首先我们需要知道歌曲播放的时长,以此来改变黄色进度条和进度条按钮的位置。歌曲播放使用的是audio控件,可以通过控件的timeupdate... 查看详情

基于jquery的音乐播放器进度条插件

  自己基于豆瓣FM的ui仿写qq音乐时,基于Jquery手写的进度条插件,效果图如下:    主要特色:    ①可自适应挂载元素的宽度,也可以自己设置进度条宽度;    ②支持部分默认参数修改(具体见使用说明);... 查看详情

运用java制作音乐播放器(多线程爬虫文件进度条)

待写中 查看详情

pythongui编程:音乐播放器(多线程爬虫进度条文件)(代码片段)

...GUI布局4.功能介绍5.代码实现1.程序运行结果Python实现音乐播放器(爬虫、多线程、进度条、文件)2.程序实现原理本音乐播放器GUI方面运用Python的tkinter实现,播放的音乐来自网络爬虫和本电脑已经有的。为了使整个程序运行起... 查看详情

阿里云aliplayer高级功能介绍:进度条标记(代码片段)

...时间和内容的获取,基本UI如下图所示:接口和属性介绍播放器提供了progressMakers属性,是一个数组类型,每一条记录包含offset时间和text打点的内容,还可以包含其他属性,此属性用于告诉播放器进度条打点记录,记录内容属性... 查看详情

b站进度条上面的波浪怎么关

...频播放页面,点击设置。在展开的选项中可以看到有FLASH播放器,点击选择它,选择FLASH播放器后,进度条就能够自动隐藏了。参考技术A视频进入全屏播放,点右下角的齿轮(设置),有一个高能进度条选项,取消勾选波浪就没... 查看详情

在wpf中怎么实现像windowsmeidaplayer播放器那样的隐藏进度条

...dowsmeidaplayer下方的进度条那样我的意思是像windowsmeidaplayer播放器这样,当鼠标移动进来的时候(进度条,暂停按钮这些)显示,移动出去时候就隐藏建议你用BLEND来做这个动画,通过自定义控件http://blog.csdn.net/klo220/article/details/17... 查看详情

mediaplayer音乐播放器上一首下一首播放停止自动下一首进度条

本文介绍MediaPlayer的使用。MediaPlayer可以播放音频和视频,另外也可以通过VideoView来播放视频,虽然VideoView比MediaPlayer简单易用,但定制性不如用MediaPlayer,要视情况选择了。MediaPlayer播放音频比较简单,但是要播放视频就需要Surfa... 查看详情

mfc编写一个flash播放器slider进度条的程序,在新建线程中,怎么实现进度条的更新

在新建线程中,我的想法是检测如果在播放,就读当前帧数,然后除以总帧数,乘以一个比例1000,即slider进度条的最大范围,然后得slider上面的位置,用SetPos得到当前的位置。然后Sleep()延迟一段时间,就这样不断循环。while(... 查看详情

mvc如何做到在网页上播放flash,最好有播放进度条,快进,暂停等???

最好有具体代码,,新手第三方组件也行,,找一个第三方的Flash播放器,嵌入页面即可。追问我想播放swf格式文件,带进度条……给个播放器链接??躲歇…………参考技术A播放器是用flash做的,和用什么架构没关系。 查看详情

vs2008中slider控件制作播放器的进度条,如何在视频播放时改变滑块位置

现在改变滑块位置来选择视频播放位置的功能已经实现,但是不知道在视频播放时怎么来实现滑块随视频播放在进度条上前进刚看了,就是SetPor(intpos);该函数可以定位Slider的任意位置。首先要用SetRange()实现Slider的最大值与最小... 查看详情

qt学习笔记——①进度条可拖动点击②有暂停按钮的视频播放器(代码片段)

一、配置文件更改用到多媒体的话,需要修改配置文件的第一行,后面加一句sqlmultimediamultimediawidgets修改后的配置文件前3行如下QT+=coreguisqlmultimediamultimediawidgets//下面都不用改greaterThan(QT_MAJOR_VERSION,4):QT+=widgetsC 查看详情

opencv+qt实现简易视频播放器——支持进度条拖动(代码片段)

OpenCV实现视频播放器,其思路大致就是在线程中使用OpenCV中的VideoCapture循环读取本地视频的每一帧Mat,然后发送到界面转换成QImage进行显示,而进度条拖动则用到了VideoCapture中的set函数,进度条则是使用Qslider࿱... 查看详情

delphixeandroid更改progressbar1进度条颜色

下面是安卓学习手册中实现各种进度条的截图:要想看各种进度条的实现代码和文档,直接去360手机助手中下载安卓学习手册,例子文档随便看。1、说明  在某些操作的进度中的可视指示器,为用户呈现操作的进度,还它有... 查看详情

android怎么自定义绘制如下图中这种进度条

下面是安卓学习手册中实现各种进度条的截图:要想看各种进度条的实现代码和文档,直接去360手机助手中下载安卓学习手册,例子文档随便看。1、说明  在某些操作的进度中的可视指示器,为用户呈现操作的进度,还它有... 查看详情

vue项目实现音乐播放器-------设计播放进度条+播放控制按钮(代码片段)

...各位,今天我们来进行一个很炫酷的页面开发——播放器控制页面(srccomponentsPlay.vue),如下图:                            ... 查看详情