的Android的MediaPlayer与AudioEffect:获取错误(-22,0)

好了,只是这是我的要求..的Android的MediaPlayer与AudioEffect:获取错误(-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

12月5日至2日(不通过登入。):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(); 

中记录错误的代码。在发布上述代码段之前,我已经移除了异常处理部分。但我是积极的,当我执行时没有发现任何异常。

再次编辑:

从this链接我才明白错误-22是PVMFErrLicenseRequiredPreviewAvailable

/* 

Error due to the lack of a valid license for the content. However

a preview is available.

*/

const PVMFStatus PVMFErrLicenseRequiredPreviewAvailable = (-22);

我PVMFErrLicenseRequiredPreviewAvailable一派,和我this文件。和第83页

DRM的14.10.5预览内容无有效驾驶执照可用

对将在第14.10.3场景的变化就是 不存在用于有效许可证的情况下完整播放一段内容,但可以预览 。这种情况可能是最初分发内容的通用方式 ,以便消费者可以在决定购买完整许可证之前预览它 。在这种情况下,Init() 方法将返回代码 PVMFErrLicenseRequiredPreviewAvailable, ,这表示完全播放需要许可证 ,但预览可用。为了 播放预览,应用程序必须删除当前源,然后 添加一个在本地数据源上设置的标志以指示 预览模式。

现在我玩的WAV文件是由我在android SDK中使用SpeechToText工具生成的。我不知道拿着我玩这个文件的牌照是什么。

回答:

嗯,我终于搞定了。我重读了文档,玩过代码并突然发现一切正常。这些是我的发现,以防将来帮助任何人。

在PresetReverb

的情况下在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儿童(均衡器,BassBoost,虚拟器)

这些的人不是我的问题的一部分。但大家谁在将来看到这个..

注:连接插入效果(均衡器,低音增强,虚拟器),以 使用会话0的全球音频输出组合已被弃用。

看到documentation

关于错误(-22,0)

嘛,公平地说,这不是一个错误提示信息。我不知道为什么无效的许可证错误出现,当我们搞砸音频会话。无论如何,当我纠正音频会话参数时,这个错误消失了。这是我所知道的一切。

回答:

我得到了同样的问题,使用音频会话0您必须使用许可的许可权

回答:

这条线在本质上解决的问题之一,但它仍然所需的权限。

PresetReverb pReverb = new PresetReverb(1,0); 

所以下面添加到您的AndroidManifest.xml行实际解决问题的根源:

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

哦也,你需要设置PresetReverb并将其连接到您的AudioTrack发生前你做AudioTrack.write()和AudioTrack.play()。

以上是 的Android的MediaPlayer与AudioEffect:获取错误(-22,0) 的全部内容, 来源链接: utcz.com/qa/257120.html

回到顶部