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 );
我的 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 );