我正在编写一个与Rhapsody music service SDK互动的iOS应用。我陷入了需要组合音乐文件的RAD和EA部分的地步。根据他们的文档:
返回曲目播放信息后,您现在可以 开始检索Rhapsody音频数据。首先,加载媒体URL 属性从getTrackPlaybackInfos方法返回到你的 客户。大多数允许流式传输的Rhapsody格式都需要 Rhapsody使用的安全方法称为RAD / EA。 RAD / EA安全性 model允许通过HTTP直接下载大部分内容 轨道(称为音频的RAD部分)。然后是客户 下载文件的一小部分加密部分(称为EA) 文件的一部分)每隔30秒构成整个音乐 文件。
如果媒体网址包含RAD,请调用getEA方法获取 基本音频(EA)。使用会话标识符,RAD版本(3, 除非您的Rhapsody Direct代表另有说明,格式, 和比特率从cal返回到getTrackPlaybackInfos。你必须 多次调用getEA方法来播放整个音频 跟踪。 position参数包含EA块中的偏移量 哪个开始检索音频数据,以及计数参数 包含要返回的实际字节数。例如,开启 第一次调用getEA时,你会将position参数设置为0和 可以将count参数设置为4096.这将返回4096个字节 音频数据从音轨的开头开始。在第二个cal 要获得EA,您可以将position参数设置为4096和 count参数为4096.在第三次调用时,position参数 将是8192和计数参数4096.继续调用getEA 直到整个曲目播放的方法。
我可以轻松找到RAD文件。但我不清楚的是我如何将RAD和EA文件重新组合成可流媒体/可播放的媒体文件?我认为这是谷歌第一次让我失望。我甚至无法找到关于如何继续的提示。
答案 0 :(得分:0)
关于RAD / EA:在Rhapsody网站上有一些示例如何从输入的RAD和EA文件中获取可播放的音乐文件(Java和C ++中的示例)
RAD文件我们可以直接下载
EA文件问题 - 如何创建?在文档中写道,我们需要每30秒调用一次getEA方法,但接下来的问题出现在这里:
如果你有什么需要补充 - 请随意... 我会很高兴任何新的信息。
<强>解决方案:强>
下载RAD文件。
调用getEA - 我们在这里得到一些ASCII码的数组。请参阅此处如何在Java中的bytes数组中转换它:ASCII codes => string of characters
RadStream rs = new RadStream(getRadSource());
Log.e(TAG, "" + rs.getHeader());
EaStream es = new EaStream(getEaSource());
Log.e(TAG, "" + es.getHeader());
RadEaStream radea = new RadEaStream(rs, es);
int counter = 0;
FileOutputStream out = new FileOutputStream(fileWMA);
for (int c = radea.read(); c >= 0; c = radea.read()) {
out.write(c);
counter += 1;
}
out.close();
对我而言,它有效。