【发布时间】:2012-05-02 07:00:26
【问题描述】:
好吧,这就是我的要求..
我有一个 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();
被执行。在发布上面的代码段之前,我已经删除了异常处理部分。但我是肯定的,执行时没有发现异常。
再次编辑:
从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 文档。在第 87 页
14.10.5 没有有效许可的 DRM 内容预览
第 14.10.3 节中涵盖的场景的一个变体是 没有完整播放一段内容的有效许可,但是 在那里可以预览。这种情况可能是一种常见的方式 最初分发内容以便消费者可以预览 在决定购买完整许可证之前。在这种情况下,Init() 方法将返回代码 PVMFErrLicenseRequiredPreviewAvailable, 这表明许可证 完全播放需要,但可以预览。为了 播放预览,应用程序必须删除当前源,然后 将其添加回来并在本地数据源上设置一个标志以指示 预览模式。
现在我播放的 WAV 文件是由我使用 android SDK 本身中的 SpeechToText 工具生成的。我不知道播放这个文件的许可证是什么。
【问题讨论】:
-
嗨 Krishnabhadra 我已经尝试过您的解决方案,但在我的设备中我没有发现任何回声效果。你能把你的示例代码发给我吗。提前谢谢。
-
我的情况有错误 (1, -22)。这是同一个问题吗?
标签: java android audio android-mediaplayer audioeffect