![](/img/trans.png)
[英]MediaPlayer not playing when attaching BassBoost - error (-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是輸出混合輔助效果, 應在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是輸出混合輔助效果,應在音頻會話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
這些不是我問題的一部分。 但是對於將來看到這一點的每個人來說......
注意:不建議使用會話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.