android – 如何获取音频流的持续时间,并从任何点继续音频流

描述:

我有一个音频播放器的以下代码.我可以通过点击进度栏(0到to-mediaplayer.getDuration())之间的任何时间段继续音频播放.它对于音频播放工作正常.

音频流中的问题:

>当我从互联网服务器(比如s3-bucket)流式传输音频文件
它开始流正确.
>但是mediaPlayer.getDuration()和mediaPlayer.getCurrentPosition()
返回错误的值.在流媒体开始
mediaPlayer.getCurrentPosition()返回5小时.
>由于这个原因,我无法继续音频流
流(0到流持续时间)的指定持续时间.

问题:

>如何获取音频流的持续时间
>如何从指定的持续时间继续音频流.对于
例如,为10分钟的文件,我想从6开始流式传输
分钟.

码:

public class MyAudioPlayer extends Activity 
implements OnClickListener{


    MediaPlayer mediaPlayer = null;
    private boolean isPaused=false;
    private boolean isstop = true;

    String filePath = null;
    String productName = null;

    ImageButton btnPlay = null;
    ImageButton btnPause = null;
    ImageButton btnReset = null;
    ImageButton btnStop = null;

    AudioManager audioManager = null;
    SeekBar volControl = null;
    SeekBar progressControl = null;
    TextView progresstext = null;
    long durationInMillis = -1;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.ltd_audio_player);

        volControl = (SeekBar)findViewById(R.id.player_volume);
        progressControl = (SeekBar)findViewById(R.id.player_seekbar);
        progresstext = (TextView) findViewById(R.id.player_progress_text);

        btnPlay = (ImageButton) findViewById(R.id.ic_player_play); 

        btnPause = (ImageButton) findViewById(R.id.ic_player_pause);  

        btnReset = (ImageButton) findViewById(R.id.ic_player_reset); 

        btnStop = (ImageButton) findViewById(R.id.ic_player_stop);   

        btnPlay.setonClickListener(this);
        btnPause.setonClickListener(this);
        btnReset.setonClickListener(this);
        btnStop.setonClickListener(this);

        filePath = getIntent().getExtras().getString("localPath");

        this.setPlayer();
        this.resetAndStartPlayer();


    }

    @Override
    protected void onResume() {
        super.onResume();   
        isPaused=false;
        progresstext.postDelayed(onEverySecond,1000);
    }

    @Override
    protected void onPause() {
        super.onPause();

        isPaused=true;
    }
    private void setProgressControl() {
        int maxVolume = mediaPlayer.getDuration();
        int curVolume = mediaPlayer.getCurrentPosition();

        progressControl.setMax(maxVolume);
        progressControl.setProgress(curVolume);
        progressControl.setonSeekBarchangelistener(new SeekBar.OnSeekBarchangelistener() {

            @Override
            public void onProgressChanged(SeekBar seekbar,int progress,boolean fromUser) {
                mediaPlayer.seekTo(progress);
            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {
                // Todo Auto-generated method stub

            }

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {
                // Todo Auto-generated method stub

            }
        });     
    }
    @Override
    public void onClick(View v) {
        switch(v.getId()){
        case R.id.ic_player_play:
            if(isstop==true){
                try {
                    mediaPlayer.prepareAsync();
                } catch (Exception e) {
                    e.printstacktrace();
                }
            }else{
                mediaPlayer.start();
                isstop = true;
            }
            break;
        case R.id.ic_player_pause:
            mediaPlayer.pause();
            break;
        case R.id.ic_player_reset:
            mediaPlayer.seekTo(0);
            break;
        case R.id.ic_player_stop:
            isstop = true;
            progressControl.setProgress(0);
            mediaPlayer.stop();
            break;
        }

    }
    private void resetAndStartPlayer(){
        try {
            if(filePath!=null){
                mediaPlayer.setDataSource(filePath);
                mediaPlayer.prepareAsync();
            }
        } catch (Exception e) {
            e.printstacktrace();
        }
    }
    private void setPlayer(){

        getwindow().setFormat(PixelFormat.UNKNowN);
        mediaPlayer = new MediaPlayer();    

        mediaPlayer.setonBufferingUpdateListener(new OnBufferingUpdateListener() {

            @Override
            public void onBufferingUpdate(MediaPlayer mp,int percent) {
                progressControl.setSecondaryProgress((progressControl.getMax()/100)*percent);

            }
        });
        mediaPlayer.setonPreparedListener(new OnPreparedListener() {

            @Override
            public void onPrepared(MediaPlayer mp) {
                mediaPlayer.start();
                isstop=false;
                durationInMillis = mediaPlayer.getDuration();
                MyAudioPlayer.this.setProgressControl();
            }
        });
        mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
    }
    @Override
    protected void onDestroy() {
        // Todo Auto-generated method stub
        mediaPlayer.release();
        super.onDestroy();
    }
    protected void setProgresstext() {
        durationInMillis = mediaPlayer.getDuration();
        int curVolume = mediaPlayer.getCurrentPosition();
        long HOUR = 60*60*1000;
        if(progresstext!=null){
            if(durationInMillis>HOUR){
                progresstext.setText(String.format("%1$tH:%1$tM:%1$tS",new Date(curVolume))
                        +" / "+String.format("%1$tH:%1$tM:%1$tS",new Date(durationInMillis)));
            }else{
                progresstext.setText(String.format("%1$tM:%1$tS",new Date(curVolume))
                        +" / "+String.format("%1$tM:%1$tS",new Date(durationInMillis)));
            }
        }       
    }
    private Runnable onEverySecond=new Runnable() {
        public void run() {

            if (mediaPlayer!=null) {
                progressControl.setProgress(mediaPlayer.getCurrentPosition());

                MyAudioPlayer.this.setProgresstext();
            }

            if (!isPaused) {
                progresstext.postDelayed(onEverySecond,1000);
            }
        }
    };
}

时间显示在进度条上方.

时间:’当前持续时间’/’总持续时间’

解决方法

希望它可以解决你的问题.

1)音频流的持续时间和进度

我已经查看了你的代码,你的代码中有一个重大错误来计算时间.您创建新的Date(durationInMillis).日期增加您的地点,即GMT XX小时,这就是为什么您在开始流式传播时间达到5个小时.您应该使用以下方法来计算currentProgress / duration.

protected void setProgresstext() {

    final int HOUR = 60*60*1000;
    final int MINUTE = 60*1000;
    final int SECOND = 1000;

    int durationInMillis = mediaPlayer.getDuration();
    int curVolume = mediaPlayer.getCurrentPosition();

    int durationHour = durationInMillis/HOUR;
    int durationMint = (durationInMillis%HOUR)/MINUTE;
    int durationSec = (durationInMillis%MINUTE)/SECOND;

    int currentHour = curVolume/HOUR;
    int currentMint = (curVolume%HOUR)/MINUTE;
    int currentSec = (curVolume%MINUTE)/SECOND;

    if(durationHour>0){
        System.out.println(" 1 = "+String.format("%02d:%02d:%02d/%02d:%02d:%02d",currentHour,currentMint,currentSec,durationHour,durationMint,durationSec));            
    }else{
        System.out.println(" 1 = "+String.format("%02d:%02d/%02d:%02d",durationSec));
    }
}

2)擦洗流.

MediaPlayer允许擦除音频流.我已经在我的一个项目中实施了它,但需要一些时间.从另一个位置恢复音频流需要一些时间.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


这篇“android轻量级无侵入式管理数据库自动升级组件怎么实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定...
今天小编给大家分享一下Android实现自定义圆形进度条的常用方法有哪些的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文...
这篇文章主要讲解了“Android如何解决字符对齐问题”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Android...
这篇文章主要介绍“Android岛屿数量算法怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Android岛屿数量算...
本篇内容主要讲解“Android如何开发MQTT协议的模型及通信”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Andro...
本文小编为大家详细介绍“Android数据压缩的方法是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“Android数据压缩的方法是什么”文章能帮助大家解决疑惑...
这篇“Android怎么使用Intent传大数据”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅...
本文小编为大家详细介绍“Android事件冲突怎么解决悬浮窗拖拽问题”,内容详细,步骤清晰,细节处理妥当,希望这篇“Android事件冲突怎么解决悬浮窗拖拽问题”文...
这篇文章主要介绍了Android拼接如何实现动态对象的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Android拼接如何实现动态对象文...
今天小编给大家分享一下Android全面屏适配怎么实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下...
本篇内容介绍了“Android怎么开发Input系统触摸事件分发”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何...
今天小编给大家分享一下AndroidRoom怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下...
本文小编为大家详细介绍“AndroidRoom使用方法有哪些”,内容详细,步骤清晰,细节处理妥当,希望这篇“AndroidRoom使用方法有哪些”文章能帮助大家...
这篇文章主要介绍“Android中的OpenGL怎么配置使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Android中的Open...
这篇文章主要介绍了Android如何自定义自动识别涂鸦工具类的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Android如何自定义自动...
今天小编给大家分享一下Android如何自定义有限制区域的图例角度自识别涂鸦工具类的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以...
今天小编给大家分享一下ReactNative错误采集原理在Android中如何实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章...
这篇文章主要讲解了“Android崩溃日志收集和保存代码分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“A...
这篇“Android面向单Activity开发实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大...
本篇内容介绍了“Android应用启动白屏处理的方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何...