SeekBar 无法正常处理来自服务器的流式音频

SeekBar not working properly with streaming audio from server

我的 mysql 服务器上有音频文件。播放音频时,搜索栏与当前位置不匹配,并在背景中以毫秒为差重复播放音频。当我删除 seekbar.setMax(mPlayer.getDuration) 它工作正常。 Android:7 音频无法正常播放。请帮我尽快解决这个问题。提前致谢。

  initilizeUI();

    seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
        @Override
        public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
            if (b && mPlayer.isPlaying()) {
                mPlayer.seekTo((mediaFileLengthInMilliseconds / 100) * i);
                Log.d("time", String.valueOf((mediaFileLengthInMilliseconds / 100) * seekBar.getProgress()));
            }
        }

        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {

        }

        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {

        }
    });

    return root;
}

@SuppressLint("ClickableViewAccessibility")
private void initilizeUI() {
    btn.setOnClickListener((View.OnClickListener) this);
    seekBar.setMax(99);
    mPlayer = new MediaPlayer();
    mPlayer.setOnBufferingUpdateListener(this);
    mPlayer.setOnCompletionListener(this);

}

@Override
public void onBufferingUpdate(MediaPlayer mp, int percent) {

    seekBar.setSecondaryProgress(percent);
}

@Override
public void onCompletion(MediaPlayer mp) {
    if (getActivity() != null) {
        int id = getResources().getIdentifier(String.valueOf(R.drawable.restartbtn), "drawable", getActivity().getPackageName());
        btn.setImageResource(id);
    }

}

@Override
public void onClick(View v) {
    if (v.getId() == R.id.imageButton) {

        try {

            mPlayer.setDataSource(audio_url);
            mPlayer.prepare(); // you must call this method after setup
            mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
            FFmpegMediaMetadataRetriever mmr = new FFmpegMediaMetadataRetriever();
            mmr.setDataSource(audio_url);
            mediaFileLengthInMilliseconds = Integer.parseInt(mmr.extractMetadata(FFmpegMediaMetadataRetriever.METADATA_KEY_DURATION));

        } catch (Exception e) {
            e.printStackTrace();
        }

        if (!mPlayer.isPlaying()) {
            mPlayer.start();
            btn.setImageResource(R.drawable.pausebtn);
        } else {
            mPlayer.pause();
            btn.setImageResource(R.drawable.playbtn);
        }

        seekUpdation();
    }
}

Runnable run = new Runnable() {
    @Override
    public void run() {
        seekUpdation();
    }
};

public void seekUpdation() {
    if (mPlayer.isPlaying()) {
        seekBar.setProgress((int) (((float) mPlayer
                .getCurrentPosition() / mediaFileLengthInMilliseconds) * 100));
                   seekHandler.postDelayed(run, 1000);
    }
}

@Override
public void onDestroy() {
    super.onDestroy();
    if (mPlayer.isPlaying()) {
        mPlayer.stop();
    }
}

我检查了你的 MP3 文件,是的,它被编码为 Variable Bit-R吃饭模式。

可能的解决方案

(1) 确认是否工作:CBR version of your MP3(右键单击并保存,然后在您的服务器上进行测试)。如果搜索栏按预期工作,那么您的解决方案是重新转换。您可以使用工具将 MP3 从 VBR 模式重新转换为 CBR 模式。

尝试通过此站点进行转换:https://audio.online-convert.com/convert-to-mp3

如果转换很多文件,请尝试:FFmpeg 在命令行上运行,可以处理一个文件夹中的多个文件。

(2) .getDuration().getCurrentPosition() 的值必须 除以 1000.

.getDuration() 将 return 一个以毫秒为单位的数字。 1 秒需要 1000 毫秒。所以你的代码必须通过除法得到期望值。 例如: 5000 毫秒/1000 = 5 秒持续时间。

示例:

//# when using "getDuration"...
seekBar.setMax( mPlayer.getDuration() / 1000 );

//# when using "getCurrentPosition"...
seekBar.setProgress( mPlayer.getCurrentPosition() / 1000 );