我使用Matt Gallagher's AudioStreamer通过HTTP播放MP3。我需要知道歌曲的长度和ID3标签。使用AudioStreamer获取MP3 ID3元数据和歌曲时长
是否有可能在AudioStreamer中实现这一点,以及如何实现?
我使用Matt Gallagher's AudioStreamer通过HTTP播放MP3。我需要知道歌曲的长度和ID3标签。使用AudioStreamer获取MP3 ID3元数据和歌曲时长
是否有可能在AudioStreamer中实现这一点,以及如何实现?
从他Docs:
范围有限
有一点需要澄清 之前,我继续:这个 类用于音频流。 通过流式传输,我不只是指“通过HTTP传输的 音频文件”。相反,我的意思是一个连续的HTTP 源,没有结束,无限期地继续 (如广播电台, 不是一首歌)。
这似乎意味着获得持续时间可能会很艰难。
这里是如何得到ID3v2标签:
获取元数据
元数据的最简单的来源是HTTP标头。 里面的 handleReadFromStream:事件类型: 方法,使用CFReadStreamCopyProperty 到 kCFStreamPropertyHTTPResponseHeader 酒店需要从CFReadStreamRef复制, 那么你可以使用 CFHTTPMessageCopyAllHeaderFields到 复制头字段出 响应。对于许多流式音频服务器,流名称是 这些字段之一。元数据的相当困难的来源是ID3标签。 ID3v1总是在 的文件末尾(因此在流式传输时 无用)。 ID3v2的位置是 ,因此可能更容易访问 。
我从来没有读过ID3标签,但我 怀疑,如果缓存第一 几百千字节的文件 的地方它加载的,打开缓存 与AudioFileOpenWithCallbacks和 然后读取kAudioFilePropertyID3Tag 与AudioFileGetProperty您可能是 能够读取ID3数据(如果它存在 )。就像我说的那样:我已经 从来没有这样做过,所以我不知道 肯定会起作用。
MP3流被分成“帧”,它们是单个数据单元。有些数据流会每隔几帧添加一个ID3元数据块,您可以在理论上扫描并读取这些数据块。
这里了解更多信息:http://jicyshout.sourceforge.net/oreilly-article/java-streaming-mp3-pt2/java-streaming-mp3-pt2.html