大佬教程收集整理的这篇文章主要介绍了android – 如何获取音频流的持续时间,并从任何点继续音频流,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个音频播放器的以下代码.我可以通过点击进度栏(0到to-mediaplayer.getDuration())之间的任何时间段继续音频播放.它对于音频播放工作正常.
音频流中的问题:
>当我从互联网服务器(比如s3-bucket)流式传输音频文件时
它开始流正确.
>但是mediaPlayer.getDuration()和mediaPlayer.getCurrentPosition()
返回错误的值.在流媒体开始@H_240_7@mediaPlayer.getCurrentPosition()返回5小时.
>由于这个原因,我无法继续音频流
流(0到流持续时间)的指定持续时间.
问题:
>如何获取音频流的持续时间
>如何从指定的持续时间继续音频流.对于
例如,为10分钟的文件,我想从6开始流式传输
分钟.
码:
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; Au@L_949_8@manager au@L_949_8@manager = 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(Au@L_949_8@manager.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); } } }; }
时间显示在进度条上方.
时间:’当前持续时间’/’总持续时间’
1)音频流的持续时间和进度
我已经查看了你的代码,你的代码中有一个重大错误来计算时间.您创建新的Date(durationInMillis).日期增加您的地点,即GMT XX小时,这就是为什么您在开始流式传播时间达到5个小时.您应该使用以下方法来计算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",durationSeC)); } }
2)擦洗流.
@H_739_2@mediaPlayer允许擦除音频流.我已经在我的一个项目中实施了它,但需要一些时间.从另一个位置恢复音频流需要一些时间.以上是大佬教程为你收集整理的android – 如何获取音频流的持续时间,并从任何点继续音频流全部内容,希望文章能够帮你解决android – 如何获取音频流的持续时间,并从任何点继续音频流所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。