【问题标题】:SeekBar not working properly with streaming audio from serverSeekBar 无法与来自服务器的流式音频一起正常工作
【发布时间】:2021-01-06 03:41:57
【问题描述】:

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

【问题讨论】:

  • 问题可能出在音频文件本身(而不是代码)。下载MediaInfo 并用它检查您的文件。或者使用恒定比特率 (CBR) 而非可变比特率 (VBR) 的 44100hz 立体声 MP3 进行测试。您还可以分享一个指向这些神秘“我的 mysql 服务器上的音频文件”之一的链接。 供我们自己检查。
  • 请查看上面的链接以及如何下载“MediaInfo”?
  • 我已经检查了您的文件,它是 VBR,这可能会导致查找问题。看看我的回答对你有没有帮助。 PS:这是您的操作系统的download MediaInfo 的链接。

标签: android audio-streaming android-seekbar


【解决方案1】:

我检查了您的 MP3 文件,是的,它是以 Variable Bit-Rate 模式编码的。

可能的解决方案

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

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

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

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

.getDuration() 将返回一个以毫秒为单位的数字。 1秒需要1000 m-secs。因此,您的代码必须通过除法获得预期值。 例如: 5000 毫秒 / 1000 = 5 秒持续时间。

例子:

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

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

【讨论】:

  • 在许多设备上仍然无法工作,seekbar 没有占用音频的持续时间和最后设置的 seekbar 进度。
  • 看看新加的点(2)对你有没有帮助。
  • mPlayer.getDuration() 返回 0。
  • 我认为这是因为当您尝试获取持续时间时,您的文件甚至没有加载(或者至少元数据还没有准备好)。您的代码是否来自有关在设备存储上播放文件的教程?这样的文件可立即用于获取持续时间,但在网络仍在发送文件的小数据包时无法获取。尝试监听元数据加载事件。
  • 我认为,当我使用原始文件对其进行测试时,它工作正常,即使在最新版本中,它也适用于 web url,但不适用于所有设备。你能帮我解决这个问题吗?
猜你喜欢
  • 2021-05-17
  • 2012-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-16
  • 1970-01-01
  • 2018-02-23
  • 2018-04-12
相关资源
最近更新 更多