如何解决从Firebase Storage Android更快地进行音频流传输
我是Android
的新手。我正在开发online music streaming app
。音频文件位于Firebase Storage
中。大小为3 mb。我正在使用Android中内置的Media Player
库流式传输音频文件。
它首先获取整个音频,然后开始播放。提取整个音频所花费的时间长达50秒到60秒,具体时间取决于网络连接。我想更快地获取音频文件。将音频分为夹头有助于实现这一目标。但是我不知道怎么做。
搜索Google时,我发现Exo Player
是媒体播放器的最佳替代方法,它将流式传输音频文件,而不是下载音频文件。但是我不知道如何更改exoplayer的代码。
这是我使用的音频流代码:
player.setAudioStreamType(AudioManager.STREAM_MUSIC);
player.setDataSource("url of audio");
player.prepareAsync();
//mp3 will be started after completion of preparing...
player.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(final MediaPlayer player) {
// Initialize Runnble
runnable = new Runnable() {
@Override
public void run() {
// Set Progress on Seek Bar
seekBar.setProgress(player.getCurrentPosition());
// Handler Post Delay for 0.5 seconds
handler.postDelayed(this,500);
}
};
// Get Duration for media player
int duration = player.getDuration();
// Convert Millisecond to minute and second
String sDuration = convertFormat(duration);
// Set Duration on Text View
playerDuration.setText(sDuration);
PB.setVisibility(View.GONE);
textLoad.setVisibility(View.GONE);
seekBar.setEnabled(true);
}
});
btPlay.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try{
player.start();
seekBar.setMax(player.getDuration());
handler.postDelayed(runnable,0);
btPlay.setVisibility(View.INVISIBLE);
btPause.setVisibility(View.VISIBLE);
}
catch (Exception e) {
e.printStackTrace();
}
}
});
btPause.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
btPlay.setVisibility(View.VISIBLE);
btPause.setVisibility(View.GONE);
player.pause();
handler.removeCallbacks(runnable);
}
});
btFf.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int currentPosition = player.getCurrentPosition();
int duration = player.getDuration();
if (player.isPlaying() && duration != currentPosition){
currentPosition = currentPosition +5000;
playerPostion.setText(convertFormat(currentPosition));
player.seekTo(currentPosition);
}
}
});
btRew.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int currentPosition = player.getCurrentPosition();
int duration = player.getDuration();
if (player.isPlaying() && currentPosition > 5000){
currentPosition = currentPosition - 5000;
playerPostion.setText(convertFormat(currentPosition));
player.seekTo(currentPosition);
}
}
});
seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar,int progress,boolean fromUser) {
if(fromUser){
player.seekTo(progress);
}
playerPostion.setText(convertFormat(player.getCurrentPosition()));
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
});
player.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
btPause.setVisibility(View.INVISIBLE);
btPlay.setVisibility(View.VISIBLE);
player.seekTo(0);
}
});
}
@SuppressLint("DefaultLocale")
private String convertFormat(int duration) {
return String.format("%02d:%02d",TimeUnit.MILLISECONDS.toMinutes(duration),TimeUnit.MILLISECONDS.toSeconds(duration) -
TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(duration)));
}
如何实现更快的流式传输。请帮我一些解决方案。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。