8

まあ、これは私の要件です。

WAVファイルがあります。それを開いて、いくつかのエフェクトを追加して、再生したいと思います。

MediaPlayerを使用してファイルを再生し、PresetReverbを使用していくつかの効果を追加しています。

これは私のコードです

public void playSound(){
   String fullPath = MainActivity.this.filePath + "tmpaudio.wav";

   final MediaPlayer player = new MediaPlayer();
   player.setDataSource(this, Uri.parse(fullPath));

   PresetReverb pReverb = new PresetReverb(0,player.getAudioSessionId());
   pReverb.setPreset(PresetReverb.PRESET_LARGEROOM);
   pReverb.setEnabled(true);
   player.attachAuxEffect(eReverb.getId());
   player.setAuxEffectSendLevel(1.0f);

   //prepare for playback
   player.prepare();

   // Media prepared listener
   player.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
      public void onPrepared(MediaPlayer mp) {
         //play
         player.start();
      } 
   });
}

このコードを実行すると、logcatにログインします(私はログインしていません)。

05-02 12:02:42.356:E / MediaPlayer(17250):エラー(-22,0)

しかし、私がこれらの行にコメントすると

PresetReverb pReverb = new PresetReverb(0,player.getAudioSessionId());
pReverb.setPreset(PresetReverb.PRESET_LARGEROOM);
pReverb.setEnabled(true);
player.attachAuxEffect(eReverb.getId());
player.setAuxEffectSendLevel(1.0f);

MediaPlayerはファイルを正常に再生しています。だから私のWAVファイルには何の問題もありません。

少しがっかりしたので、PresetReverbの代わりにEnvironmentalReverbを試しました。

EnvironmentalReverb eReverb = new EnvironmentalReverb(1, player.getAudioSessionId());
eReverb.setDecayHFRatio((short) 1000);
eReverb.setDecayTime(10000);
eReverb.setDensity((short) 1000);
eReverb.setDiffusion((short) 1000);
eReverb.setReverbLevel((short) -1000);
eReverb.setEnabled(true);
player.attachAuxEffect(eReverb.getId());
player.setAuxEffectSendLevel(1.0f);

同じエラー(エラー(-22,0))も発生しました。

したがって、私は非常に明白な何かを見逃しているか、AudioEffectファミリークラス(ドキュメントまたはAPI自体)に問題があります。誰かが光を当てることができますか?

編集:追加するのを忘れました。コードをデバッグすると、エラーがログに記録されます。

 player.start();

実行されます。上記のコードセグメントを投稿する前に、例外処理パーツを削除しました。しかし、私は前向きです。実行したときに例外は発生しません。

もう一度編集:

このリンクから、エラー-22がPVMFErrLicenseRequiredPreviewAvailableであることがわかりました。

/*
 Error due to the lack of a valid license for the content.  However
 a preview is available.
 */
const PVMFStatus PVMFErrLicenseRequiredPreviewAvailable = (-22);

PVMFErrLicenseRequiredPreviewAvailableでグーグルして、このドキュメントを入手しました。そして87ページ

14.10.5有効なライセンスが利用できないDRMコンテンツのプレビュー

セクション14.10.3で説明されているシナリオのバリエーションは、コンテンツの一部を完全に再生するための有効なライセンスがない場合ですが、そこでプレビューすることができます。このシナリオは、消費者がフルライセンスの購入を決定する前にコンテンツをプレビューできるように、最初にコンテンツを配布する一般的な方法である可能性があります。この場合、Init()メソッドはコードPVMFErrLicenseRequiredPreviewAvailableを返します。これは、完全な再生にはライセンスが必要であるが、プレビューが利用可能であることを示します。プレビューを再生するには、アプリケーションは現在のソースを削除してから、プレビューモードを示すフラグをローカルデータソースに設定して追加し直す必要があります。

これで、再生したWAVファイルは、AndroidSDK自体のSpeechToTextツールを使用して生成されました。このファイルの再生を妨げているライセンスがわかりません。

4

3 に答える 3

14

さて、私はついにそれを働かせました。ドキュメントを読み直し、コードをいじると、突然すべてが機能しました。これらは、将来誰かに役立つ場合に備えて、私の発見です。

PresetReverbの場合

プリセットリバーブのドキュメント

PresetReverb は出力ミックス補助エフェクトであり、オーディオ セッション 0 で作成する必要がありますMediaPlayer または AudioTrack をこのエフェクトにフィードするには、それらを明示的にアタッチし、送信レベルを指定する必要があります。MediaPlayer または AudioTrack にアタッチするときに、getId() メソッドによって返されるエフェクト ID を使用して、この特定のエフェクトを指定します。

それは言う

PresetReverb pReverb = new PresetReverb(0,player.getAudioSessionId()); <== error

許可されていません。グローバル オーディオ セッション 0 のみを使用して、PresetReverb を構築できます。

PresetReverb pReverb  = new PresetReverb(1,0); <== correct

これで、MediaPlayer または AudioTrack を使用してアタッチできます。

player.attachAuxEffect(pReverb.getId());
player.setAuxEffectSendLevel(1.0f);

私の完全なPresetReverbコードは

PresetReverb pReverb    = new PresetReverb(1,0);
player.attachAuxEffect(pReverb.getId());
pReverb.setPreset(PresetReverb.PRESET_LARGEROOM);
pReverb.setEnabled(true);
player.setAuxEffectSendLevel(1.0f);

注 :良いリバーブ効果またはエコーを探している場合は、EnvironmentalReverb を使用することをお勧めします。PresetReverb のパフォーマンスにはややがっかりしています。

EnvironmentalReverbの場合

EnvironmentalReverbのドキュメントから

EnvironmentalReverb は出力ミックス補助エフェクトであり、オーディオ セッション 0 で作成する必要があります。MediaPlayer または AudioTrack をこのエフェクトにフィードするには、それらを明示的にアタッチし、送信レベルを指定する必要があります。MediaPlayer または AudioTrack にアタッチするときに、getId() メソッドによって返されるエフェクト ID を使用して、この特定のエフェクトを指定します。

PresetReverbとまったく同じですが、私が書いたとき

Log.e("DEBUG","sessionId : " + player.getAudioSessionId()); <== printed "454"
EnvironmentalReverb  eReverb 
             = new EnvironmentalReverb(0,player.getAudioSessionId()); //should be error as per documentation
//player.attachAuxEffect(eReverb.getId());   <== Yes this one was commented

エラーはなく、良いリバーブ効果とエコーが得られます。したがって、ドキュメントのバグのようです。また、プレイヤーのセッションIDをコンストラクタ(player.getAudioSessionId())に渡す際、プレイヤーにEnvironmentalReverbインスタンスをアタッチする必要はないようです。変..

完全を期すために、これもドキュメントに記載されているとおりに機能しました。

EnvironmentalReverb  eReverb 
             = new EnvironmentalReverb(0,0); 
player.attachAuxEffect(eReverb.getId());     <== No,not comment this one

その他の AudioEffect の子 (Equalizer、BassBoost、Virtualizer) の場合

これらは私の質問の一部ではありませんでした。しかし、将来これを見るすべての人のために..

注: セッション 0 を使用して、インサート エフェクト (イコライザー、バス ブースト、バーチャライザー) をグローバル オーディオ出力ミックスに接続することは非推奨です。

ドキュメントを見る

エラー(-22,0)について

まあ、それは有益なエラー メッセージではなかったと言っても過言ではありません。オーディオ セッションを台無しにすると、無効なライセンス エラーが表示される理由がわかりません。とにかく、オーディオ セッション パラメータを修正すると、このエラーは消えました。私が知っているのはそれで全てです。

于 2012-05-02T11:37:29.687 に答える
1

同じ問題が発生しました。オーディオ セッション 0 を使用するには、権限 MODIFY_AUDIO_SETTINGS を使用する必要があります

于 2012-08-01T12:26:52.530 に答える
0

この行により、本質的に問題の 1 つが解決されましたが、それでもパーミッションが必要でした。

PresetReverb pReverb = new PresetReverb(1,0);

したがって、以下の行を AndroidManifest.xml に追加すると、根本的な問題が実際に解決されます。

<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />

また、 AudioTrack.write() と AudioTrack.play() を実行するに、PresetReverb を設定して AudioTrack にアタッチする必要があります。

于 2015-01-24T21:23:17.897 に答える