永发信息网

用流写过播放器的高手齐集过来

答案:1  悬赏:70  手机版
解决时间 2021-06-05 11:32
  • 提问者网友:萌卜娃娃
  • 2021-06-05 05:21

我自己用一个音频流写了一个可以播放mp3格式的类, 现在我在想扩展一点功能就是快进快退的功能,想了很久还是没有一个很好的解决方案,用流写过播放器的高手帮忙分析给我听如何实现.

我的播放器原理是:先用一个类把指定的mp3文件格式转换格式,转换后去读取一定的字节长度,读取的这个方法是按每秒来读取的, (关键就是这个每秒读取才是障碍)

然后再每秒的输出音频,代码如下

int len=(int)af.getSampleRate()*af.getFrameSize(); //这个len就是一秒的字节数

byte[] buffer=new byte[len];
int buffer_all=0;
sdl.open(af, sdl.getBufferSize()); //打开
sdl.start(); //开始播放
while(buffer_all>=0){
buffer_all=ais.read(buffer,0,len); //一秒读取一定长度的字节

if(buffer_all>=0){

sdl.write(buffer, 0, buffer_all); //再一秒输出读取的字节
}
}

我的想法是要读取的长度比输出的长度大才能做到快进,但是这样没办法精确

然后我又想一次性全部读出来,然后再一秒一秒的播放. 但是这样岂不是要先等一首歌的时间(等它读进内存吖),等它读完再播放..

有没有写过类似的高手吖,帮忙分析给我听啊

最佳答案
  • 五星知识达人网友:低音帝王
  • 2021-06-05 05:38

理想的做法应该是用一个生产者/消费者模型来实现。


有2个线程,一个线程专门负责读取文件,将读取的数据放在内存中;另一个线程就是负责读取当前内存中已有的数据,播放出来。如果当前数据不够 ,则等待,直至有了需要的数据。

我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯