1

我正在编写一个与Rhapsody 音乐服务 SDK交互的 iOS 应用程序。我被困在需要合并音乐文件的 RAD 和 EA 部分的地方。根据他们的文档:

返回曲目播放信息后,您现在可以开始检索 Rhapsody 音频数据。首先,将从 getTrackPlaybackInfos 方法返回的媒体 URL 属性加载到您的客户端中。大多数允许流式传输的 Rhapsody 格式都需要 Rhapsody 使用的称为 RAD/EA 的安全方法。RAD/EA 安全模型允许通过 HTTP 立即下载大部分曲目(称为音频的 RAD 部分)。然后客户端每 30 秒下载文件的一小部分加密部分(称为文件的 EA 部分)以构成整个音乐文件。

如果媒体 URL 包含 RAD,则调用 getEA 方法以获取基本音频 (EA)。使用从 cal 返回到 getTrackPlaybackInfos 的会话标识符、RAD 版本(3,除非您的 Rhapsody Direct 代表另有说明)、格式和比特率。您必须多次调用 getEA 方法才能播放整个音轨。position 参数包含 EA 块中开始检索音频数据的偏移量,count 参数包含要返回的实际字节数。例如,在第一次调用 getEA 时,您可以将 position 参数设置为 0,并将 count 参数设置为 4096。这将返回从轨道开头开始的 4096 字节的音频数据。在第二次获得 EA 时,

我可以很容易地找到 RAD 文件。但我不清楚的是如何将 RAD 和 EA 文件重新组合成可流式传输/可播放的媒体文件?我认为这是谷歌第一次让我失望。我什至找不到有关如何进行的提示。

4

1 回答 1

0
  1. 关于 RAD/EA:在 Rhapsody 网站上,有一些示例如何从输入的 RAD 和 EA 文件中获取可播放的音乐文件(Java 和 C++ 中的示例)

  2. RAD文件我们可以直接下载

  3. EA 文件的问题 - 如何创建它?在文档中写到我们需要每 30 秒调用一次 getEA 方法,但接下来的问题出现在这里:

    • 如何从从 WS getEA 方法字节接收到的 EA 文件(据我了解应该具有带有特殊文件头的特殊结构)?
    • 如果我们需要每 30 秒调用一次 getEA 方法来解码 RAD 文件,如何处理离线模式?

如果您有什么要补充的 - 请随时...我会很高兴有任何新信息。

解决方案:

  1. 下载 RAD 文件。

  2. 调用 getEA - 我们在这里得到一些 ASCII 码的数组。请在此处查看如何将其转换为 Java 中的字节数组:ASCII 代码 => 字符串

  3.         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();
    

对我来说它有效。

于 2013-01-18T23:18:03.730 回答