如何获得音频流的持续时间,并继续音频流从任何角度 [英] How to get duration of Audio Stream and continue audio streaming from any point
问题描述
说明:
我有以下$ C $下的音频播放器。我可以继续在任何时间音频播放点击进度条(在0至mediaplayer.getDuration())。这是工作完美的音频播放。
I have following code for an Audio player. I can continue Audio playback from any duration by clicking on Progress Bar(between 0-to-mediaplayer.getDuration()). It is working perfectly for Audio playback.
在音频流的问题:
- 当我流音频文件从互联网服务器(比如S3桶) 它开始正确地流。
- 但是mediaPlayer.getDuration()和mediaPlayer.getCurrentPosition() 返回错误的值。在流的开始 mediaPlayer.getCurrentPosition()返回5小时。
- 由于这个我不能够继续音频流从 流(0至流持续时间)指定的时间。
- When I stream an Audio file from an internet server (say s3-bucket) it starts streaming correctly.
- But mediaPlayer.getDuration() and mediaPlayer.getCurrentPosition() return wrong values. At the beginning of streaming mediaPlayer.getCurrentPosition() returns 5 hours.
- Due to this I am not able to continue Audio streaming from a specified duration of Stream (0-to-Stream Duration).
问题:
- 我怎样才能得到一个音频流的持续时间
- 如何继续音频流从一个指定的持续时间。对于 例如对于10分钟的时间的文件,我要开始第6流 分钟。
- How can I get the duration of an Audio stream
- How can I continue Audio Streaming from a specified duration. For example for a file of 10-minute duration, I want to start streaming from 6th minute.
code:
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);
}
}
};
}
时间显示上方的进度条。
Time is displayed above the progress bar.
时间:当前时间/总时长
推荐答案
希望它可能会解决你的问题。
Hope that it might solve your problem.
1)持续时间音频流及进展
我看着你的code,你有一个重大的错误在您的code来计算时间。创建新的日期(durationInMillis)。日期将您的locallity即GMT + XX小时,这就是为什么你得到5个小时的流媒体的beginnging。您应该使用下面的方法来计算currentProgress /持续时间。
I have looked into your code, you have a major error in your code to calculate time. You create new Date(durationInMillis). Date adds your locallity i.e GMT+XX hours, that is why you are getting 5- hours in the beginnging of streaming. You should use following method to calculate 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",
currentMint,currentSec, durationMint,durationSec));
}
}
2)擦洗流。
的MediaPlayer允许音频流的洗涤。我在我的项目之一来实现它,但它需要一些时间。它需要一定的时间,以从另一个位置恢复音频流
MediaPlayer allows scrubbing of audio stream. I have implemented it in one of my projects, but it takes some time. It takes some time to resume audio streaming from another location.
这篇关于如何获得音频流的持续时间,并继续音频流从任何角度的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!