我即将进入一个涉及解码+播放 mp3 流的项目。
我有一个Java解码器(JLayer),但据我所知它没有搜索功能(我不使用内置播放器,我需要实现我自己的播放器)。
另外,流是加密的,所以我需要实时解密+解码 - 不能拥有整个解密文件。
那么如何在 mp3 流上进行搜索呢?我想设置一个时间值,并获取文件中适当的偏移量进行解码。
另请考虑支持 VBR。
Thanks
我一直在寻找完全相同的东西。 JLayer的代码有点乱。仅仅浏览一下它就让我确信 mp3 解码核心是编写的(或从某处获取的),然后移植到 Java,然后添加了一个额外的(相当不理想的)层。任何状况之下。要寻求查看播放器中的代码(http://code.google.com/p/jesuifoo/source/browse/trunk/src/javazoom/jlgui/basicplayer/BasicPlayer.java?r=23)
/**
* Skip bytes in the File inputstream. It will skip N frames matching to
* bytes, so it will never skip given bytes length exactly.
*
* @param bytes
* @return value>0 for File and value=0 for URL and InputStream
* @throws BasicPlayerException
*/
protected long skipBytes(long bytes) throws BasicPlayerException {
long totalSkipped = 0;
if (m_dataSource instanceof File) {
log.info("Bytes to skip : " + bytes);
int previousStatus = m_status;
m_status = SEEKING;
long skipped = 0;
try {
synchronized (m_audioInputStream) {
notifyEvent(BasicPlayerEvent.SEEKING,
getEncodedStreamPosition(), -1, null);
initAudioInputStream();
if (m_audioInputStream != null) {
// Loop until bytes are really skipped.
while (totalSkipped < (bytes - SKIP_INACCURACY_SIZE)) {
skipped = m_audioInputStream.skip(bytes
- totalSkipped);
if (skipped == 0)
break;
totalSkipped = totalSkipped + skipped;
log.info("Skipped : " + totalSkipped + "/" + bytes);
if (totalSkipped == -1)
throw new BasicPlayerException(
BasicPlayerException.SKIPNOTSUPPORTED);
}
}
}
notifyEvent(BasicPlayerEvent.SEEKED,
getEncodedStreamPosition(), -1, null);
m_status = OPENED;
if (previousStatus == PLAYING)
startPlayback();
else if (previousStatus == PAUSED) {
startPlayback();
pausePlayback();
}
} catch (IOException e) {
throw new BasicPlayerException(e);
}
}
return totalSkipped;
}
此例程说明了如何在不解码的情况下推进比特流。(m_audioInputStream.skip(...))。我不知道它是从一开始就跳过的(毕竟之前有一个 initAudioStream 调用),还是从当前的播放位置跳过。
VBR 没有问题,因为帧是单独跳过的。
关于解密,这并不重要,因为该例程会跳过从输入流读取的各个帧。如果输入流支持解码,它应该可以工作。当然有多快是另一个问题。在这种情况下,最好建立 mp3 的索引,以便您知道跳转和解码到哪个位置,但这是一个稍微不同的主题:如何在加密流中查找。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)