12

アプリでオーディオ クリップを再生するためにSoundPoolを使用しています。すべて問題ありませんが、クリップの再生がいつ終了したかを知る必要があります。

現時点では、MediaPlayerインスタンスを使用して各クリップの長さを取得することで、アプリで追跡しています。それは問題なく動作しますが、期間を取得するためだけに各ファイルを 2 回ロードするのは無駄に思えます。ファイルの長さ( AssetFileDescriptorから入手可能)を知っていれば、自分で持続時間を大まかに計算できますが、サンプルレートとチャンネル数を知る必要があります。

この問題に対する解決策として、次の 2 つが考えられます。

  1. クリップの再生がいつ終了したかを把握する (SoundClip ではできないようです)。
  2. オーディオ ファイルのヘッダーだけをロードし、サンプル レート/チャネル数 (理想的には、正確なデュレーションを取得するためのサンプル数) を提供できるクラスを用意します。

助言がありますか?

ありがとう、マックス

私が現在使用しているコード(正常に動作しますが、目的にはかなり重いです):

String[] fileNames = ...
MediaPlayer mp = new MediaPlayer();
for (String fileName : fileNames) {
    AssetFileDescriptor d = context.getAssets().openFd(fileName);
    mp.reset();
    mp.setDataSource(d.getFileDescriptor(), d.getStartOffset(), d.getLength());
    mp.prepare();
    int duration = mp.getDuration();
    // ...
}

ちなみに、この質問はすでに尋ねられていますが、回答がありません。

4

3 に答える 3

14

これを試しましたか:

String mediaPath = Uri.parse("android.resource://<your-package-name>/raw/filename").getPath();
MediaMetadataRetriever mmr = new MediaMetadataRetriever();
mmr.setDataSource(mediaPath);
String duration = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);
mmr.release();

しかし、これが既存のコードよりも軽いかどうかは正確にはわかりません。

于 2014-07-16T19:04:43.207 に答える