的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