29

インターネットからストリーミングされたオーディオを再生する Android 携帯用のプログラムを実装しています。おおよそのことは次のとおりです。

  1. カスタム暗号化形式をダウンロードします。
  2. 復号化して、通常の MP3 データのチャンクを取得します。
  3. MP3 データをメモリ バッファ内の生の PCM データにデコードします。
  4. 生の PCM データを AudioTrack にパイプします

これまでのターゲット デバイスは、Droid と Nexus One です。Nexus One ではすべて問題なく動作しますが、Droid では MP3 のデコードが遅すぎます。Droid に負荷をかけると、オーディオの再生がスキップし始めます。MP3 データを SD カードにデコードすることは許可されていませんが、とにかくそれが問題ではないことはわかっています。

独自の MP3 デコーダーは作成しませんでしたが、MPADEC ( http://sourceforge.net/projects/mpadec/ ) を使用しました。無料で、私たちのプログラムに簡単に統合できました。NDKでコンパイルします。

さまざまなプロファイリング ツールを使用して徹底的に分析した結果、遅れをとっているのはこのデコーダであると確信しています。

私たちが考えているオプションは次のとおりです。

  1. Android NDK でコンパイルできる別の MP3 デコーダーを見つけます。この MP3 デコーダーは、モバイル ARM デバイスで実行するように最適化するか、パフォーマンスを向上させるために整数のみの計算またはその他の最適化を使用する必要があります。

  2. 組み込みの Android MediaPlayer サービスは URL を受け取るため、プログラムに小さな HTTP サーバーを実装して、復号化された MP3 を MediaPlayer に提供できる可能性があります。そうすれば、組み込みの MP3 デコーダーを利用できます。

  3. NDK を介して組み込みの MP3 デコーダーにアクセスします。これが可能かどうかはわかりません。

MP3 のデコードを高速化するためにできることについて何か提案はありますか?

-- ロブ・シズ

4

4 に答える 4

2

これを行う正しい方法は、独自のファームウェアを構築し、カスタム OpenCORE コーデックの一部として復号化を行うことです。もちろん、そのファームウェアをインストールできるデバイスに制限されます。

これの残りの部分はやや投機的であることを覚えておいてください. 私は実際にあなたが説明していることと同様のことをする必要がありますが、数か月間問題に取り組むための時間を取っておくことはできません. そこで、私が問題にどのようにアプローチするかという形でこれを説明します。

1つの解決策は、twkの回答で説明されているものです。SD カードを使用する必要はありませんが、アプリのローカル ファイル ストア ( getFilesDir()) に、誰でも読み取り可能な一時ファイルが必要になる可能性があります。最初のチャンクをダウンロードし、復号化して、誰でも読める完全な MP3 ファイルとして書き出し (ただし、ディレクトリ/パスは適切にわかりにくいものにします)、それをMediaPlayerviaに渡しsetDataSource()ます。MediaPlayerその再生中に、可能な限りシームレスな移行のために、最初のインスタンスが終了するとすぐに再生を開始する 2 番目のインスタンスをダウンロード/復号化してセットアップします。次に、最初のチャンクをリセットMediaPlayerして 3 番目のチャンクで再利用し、2 つの間でピンポンします。

関連する解決策は、jleedev のコメントにあります。FileDescriptorvia aを提供することを除いて、ほとんど同じですContentProvider。これにはソケットを使用できるようにするオプションがあり、一時ファイルを回避できる場合があります。ただし、ContentProviderそれ自体はパブリックにアクセスできるようにする必要があるため、あいまいなディレクトリを持つ一時ファイルは、実際にはよりプライベートになる可能性があります。

これらが他のプロセスから読み取られることが心配な場合は、MediaPlayerそれ自体 (というか、OpenCORE サブシステム) が別プロセスであることを理解してください。また、提案された HTTP サーバーは、デバイス上で誰でも読み取り可能です。MediaPlayerしたがって、解読を行う場合は、あいまいさによるセキュリティが唯一の実行可能なオプションです。

私の知る限り、NDK は OpenCORE へのアクセスを許可していませんが、NDK の経験が限られていることは認めているため、間違っている可能性があります。確かに他にも利用可能な MP3 デコーダー ( ffmpeg/mplayerなど) がありますが、これらが NDK ライブラリにどれほど簡単に変換できるかは不明です。

したがって、それは本当にあなたが防御しようとしている相手に要約されます。ユーザーから防御しようとしている場合は、おそらく自分でデコードする必要があります。

于 2010-03-25T15:19:48.163 に答える
0

私はこれを試したことはありませんが、メディア プレーヤーにファイル記述子を与えることができると思います。

public void setDataSource (FileDescriptor fd, long offset, long length)

おそらく、復号化された mp3 をファイルに書き込んで、ファイル記述子を使用して再生することができます。これは、事前にファイルの長さがわかっている場合、ストリーミングでも機能する可能性があります。それが機能する場合、ローカルホスト Web サーバーを実行するよりもはるかに簡単になります。

于 2010-03-23T17:42:19.603 に答える