gpt4 book ai didi

java - 如何在mp3上实现seek

转载 作者:行者123 更新时间:2023-11-30 11:46:05 25 4
gpt4 key购买 nike

我即将进入一个涉及解码 + 播放 mp3 流的项目。

我有一个 Java 解码器 (JLayer),但据我所知它没有搜索功能(我不使用内置播放器,我需要实现自己的播放器)。

此外,流是加密的,所以我需要实时解密 + 解码 - 不能拥有整个解密文件。

那么您如何在 mp3 流上进行搜索?我想设置一个时间值,并在要解码的文件中获取适当的偏移量。

还请考虑对 VBR 的支持。

谢谢

最佳答案

我一直在寻找完全相同的东西。 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 建立一个索引,以便您知道要跳转和解码到什么位置,但这是一个稍微不同的主题:如何在加密流中查找。

关于java - 如何在mp3上实现seek,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9980852/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com