好的,简单来说这是我的要求...
我有一个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): Error (-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进行谷歌搜索,找到了this文档。在第87页上,有一种情况是当某个内容没有有效的许可证用于完全播放时,但可以预览该内容。这种情况下,Init()方法将返回代码PVMFErrLicenseRequiredPreviewAvailable,表示需要许可证才能完全播放,但可提供预览。为了播放预览,应用程序必须删除当前源,然后添加带有本地数据源标志设置为预览模式的源。现在,我所播放的WAV文件是由我自己使用Android SDK中的SpeechToText工具生成的。我不知道什么许可证阻止我播放此文件。