1

Rhapsody 音楽サービス SDKと対話する iOS アプリを作成しています。音楽ファイルの RAD 部分と EA 部分を結合する必要があるところで行き詰まっています。彼らのドキュメントによると:

トラック再生情報が返されたら、Rhapsody オーディオ データの取得を開始できます。まず、getTrackPlaybackInfos メソッドから返されたメディア URL プロパティをクライアントに読み込みます。ストリーミングが許可されている Rhapsody 形式のほとんどは、RAD/EA と呼ばれる Rhapsody で使用されるセキュリティー方式を必要とします。RAD/EA セキュリティ モデルでは、トラックの大部分 (オーディオの RAD 部分と呼ばれます) を HTTP 経由ですぐにダウンロードできます。次にクライアントは、ファイルの暗号化された小さな部分 (ファイルの EA 部分と呼ばれる) を 30 秒ごとにダウンロードして、音楽ファイル全体を構成します。

メディア URL に RAD が含まれている場合は、getEA メソッドを呼び出してエッセンシャル オーディオ (EA) を取得します。cal から getTrackPlaybackInfos に返されたセッション ID、RAD バージョン (Rhapsody Direct 担当者から特に指示がない限り、3)、フォーマット、およびビットレートを使用します。オーディオ トラック全体を再生するには、getEA メソッドを複数回呼び出す必要があります。position パラメーターには、オーディオ データの取得を開始する EA ブロック内のオフセットが含まれ、count パラメーターには、返される実際のバイト数が含まれます。たとえば、getEA の最初の呼び出しで、position パラメータを 0 に設定し、count パラメータを 4096 に設定できます。これにより、トラックの先頭から始まる 4096 バイトのオーディオ データが返されます。EA を取得するための 2 回目の cal では、

RADファイルは簡単に見つけることができます。しかし、RAD ファイルと EA ファイルをストリーミング可能/再生可能なメディア ファイルに再結合する方法がよくわかりません。Google に失敗したのはこれが初めてだと思います。進め方のヒントすら見つからない。

4

1 に答える 1

0
  1. RAD/EA について: Rhapsody サイトには、入力 RAD および EA ファイルから再生可能な音楽ファイルを取得する方法のサンプルがいくつかあります (Java および C++ のサンプル)。

  2. 直接ダウンロードできるRADファイル

  3. EA ファイルの問題 - 作成方法は? ドキュメントには、30 秒ごとに getEA メソッドを呼び出す必要があると書かれていますが、ここで次の疑問が生じます。

    • WS getEA メソッドから受け取ったバイトから EA ファイルを作成する方法 (私が理解しているように、特別なファイル ヘッダーを持つ特別な構造を持つ必要があります)。
    • RAD ファイルをデコードするために 30 秒ごとに getEA メソッドを呼び出す必要がある場合、OFFLINE モードを処理する方法は?

何か追加したいことがありましたら、お気軽にどうぞ... 新しい情報をお待ちしております。

解決:

  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 に答える