簡體   English   中英

帶有AudioEffect的Android MediaPlayer:出錯(-22,0)

[英]Android MediaPlayer with AudioEffect : Getting Error (-22,0)

嗯,這只是我的要求..

我有一個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文件沒有錯。

有點失望,我嘗試了EnvironmentalReverb ,而不是PresetReverb,

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文件是由我在android SDK本身使用SpeechToText工具生成的。 我不知道什么牌照讓我玩這個文件。

好吧,我終於開始工作了。 我重讀了文檔,玩了代碼,突然一切正常。 這些是我的發現,以防將來幫助任何人。

在PresetReverb的情況下

在presetReverb文檔中

PresetReverb是輸出混合輔助效果, 應在Audio session 0上創建 為了將MediaPlayer或AudioTrack提供給此效果,必須明確地將它們附加到它,並且必須指定發送級別 使用getId()方法返回的效果ID在將其附加到MediaPlayer或AudioTrack時指定此特定效果。

說的是

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提供給此效果,必須明確地將它們附加到它,並且必須指定發送級別 使用getId()方法返回的效果ID在將其附加到MediaPlayer或AudioTrack時指定此特定效果。

完全像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兒童(均衡器,BassBoost,虛擬器)

這些不是我問題的一部分。 但是對於將來看到這一點的每個人來說......

注意:不建議使用會話0將插入效果(均衡器,低音增強,虛擬器)附加到全局音頻輸出混音。

文檔

關於錯誤(-22,0)

嗯,公平地說它不是一個信息性的錯誤信息。 我不知道為什么當我們搞亂音頻會話時會出現無效的許可證錯誤 無論如何,當我更正音頻會話參數時,此錯誤消失了。 這是我所知道的一切。

我遇到了同樣的問題,使用音頻會話0你必須使用權限MODIFY_AUDIO_SETTINGS

這條線本質上解決了其中一個問題,但它仍然需要權限。

PresetReverb pReverb = new PresetReverb(1,0);

因此,將下面的行添加到AndroidManifest.xml實際上解決了根本問題:

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

此外,您需要設置PresetReverb並將其附加到AudioTrack,以便您執行AudioTrack.write()和AudioTrack.play()之前進行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM