好吧,这就是我的要求..
我有一个 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 工具生成的。我不知道播放此文件的许可证是什么。