我做了一个在线播放器,遇到一个难题。
为了做到在线播放,边下边播,我开了一个线程处理下载,另外播放时从这个文件进行读取。
下载:FileOutputStream output = new FileOutputStream(m_file); byte[] buffer = new byte[1024]; int numRead; while ((numRead = input.read(buffer)) != -1 && !m_done) { output.write(buffer, 0, numRead); m_current_write_pos += numRead; }播放:mMediaPlayer.reset(); File file = new File(mTempFilePath); FileInputStream fis = new FileInputStream(file); mMediaPlayer.setDataSource(fis.getFD()); fis.close(); mMediaPlayer.prepare(); mMediaPlayer.seekTo(m_current_position); mMediaPlayer.start();
但是问题出现了。我原意是想做到,下载写文件A,播放时读文件A的流。但是现在的效果是,播放时只能播放到mMediaPlayer.setDataSource时的流的长度,播完后就触发onCompletion。简单来说就是setDataSource中的文件流没有得到刷新。我现在的做法是在触发onCompletion后,重新setDataSource,但是这样播放时就会有短暂的“卡音”现象。请问各位有好的解决办法没有,或者说怎么对setDataSource中的流保持边下载边刷新,而不影响播放,谢谢。
为了做到在线播放,边下边播,我开了一个线程处理下载,另外播放时从这个文件进行读取。
下载:FileOutputStream output = new FileOutputStream(m_file); byte[] buffer = new byte[1024]; int numRead; while ((numRead = input.read(buffer)) != -1 && !m_done) { output.write(buffer, 0, numRead); m_current_write_pos += numRead; }播放:mMediaPlayer.reset(); File file = new File(mTempFilePath); FileInputStream fis = new FileInputStream(file); mMediaPlayer.setDataSource(fis.getFD()); fis.close(); mMediaPlayer.prepare(); mMediaPlayer.seekTo(m_current_position); mMediaPlayer.start();
但是问题出现了。我原意是想做到,下载写文件A,播放时读文件A的流。但是现在的效果是,播放时只能播放到mMediaPlayer.setDataSource时的流的长度,播完后就触发onCompletion。简单来说就是setDataSource中的文件流没有得到刷新。我现在的做法是在触发onCompletion后,重新setDataSource,但是这样播放时就会有短暂的“卡音”现象。请问各位有好的解决办法没有,或者说怎么对setDataSource中的流保持边下载边刷新,而不影响播放,谢谢。
RTSP (RTP, SDP)
HTTP progressive streaming
HTTP live streaming draft protocol (Android 3.0 and above)
现在还不支持HTTPS
系统自带的mediaplayer,是支持在线音频、视频,我是用的HTTP,但是mediaplayer需要缓冲到一定的进度才能播放出声音。比如一个mp3 2MB,它需要缓冲到40%,左右才能出声音。我的效果边播边下载,只要用户下载了64K的数据(比较小的数据量)就开始播声音,现在就是遇到上面的困难,继续寻解答。