很简单这是我的要求。
我有一个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中使用SpeechToText工具生成的。我不知道是什么执照阻止我播放这个文件。
发布于 2012-05-02 11:37:29
我终于让它起作用了。我重新阅读了文档,处理了代码,突然一切都正常了。这些是我的发现,以防将来对任何人有帮助。
在PresetReverb的情况下
在presetReverb文档中
PresetReverb是一个输出混合辅助效应,应该在音频会话0上创建。为了使MediaPlayer或AudioTrack能够实现这一效果,必须将它们明确地附加到其中,并且必须指定发送级别。使用getId()方法返回的效果ID来指定将其附加到MediaPlayer或AudioTrack时的特定效果。
上面写着
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输入到此效果中,必须将它们明确地附加到其中,并且必须指定发送级别。使用getId()方法返回的效果ID来指定将其附加到MediaPlayer或AudioTrack时的特定效果。
就像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没有错误,我得到了良好的混响效果和回声。因此,这似乎是文档中的一个错误。同样,当我们将player的会话id传递给构造函数(player.getAudioSessionId())时,似乎不需要使用EnvironmentalReverb实例附加player。奇怪..。
为了完整起见,这个方法也能像文档所说的那样起作用。
EnvironmentalReverb eReverb
= new EnvironmentalReverb(0,0);
player.attachAuxEffect(eReverb.getId()); <== No,not comment this one其他AudioEffect儿童(均衡器、BassBoost、虚拟器)
这些不是我问题的一部分。但对于所有在未来看到这一切的人..。
注意:使用会话0将插入效果(均衡器、低音增强器、虚拟器)附加到全局音频输出组合中是不推荐的。
请参阅文档
关于错误(-22,0)
公平地说,这不是一条信息错误信息。我不知道为什么当我们搞砸音频会话时,出现了一个无效的许可证错误。无论如何,当我更正音频会话参数时,这个错误消失了。这就是我所知道的。
发布于 2012-08-01 12:26:52
我遇到了同样的问题,要使用音频会话0,必须使用权限MODIFY_AUDIO_SETTINGS
发布于 2015-01-24 21:23:17
这一行本质上解决了其中一个问题,但它仍然需要权限。
PresetReverb pReverb = new PresetReverb(1,0);因此,将下面的行添加到您的AndroidManifest.xml实际上解决了根本问题:
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />此外,您还需要设置PresetReverb并将其附加到AudioTrack以在执行AudioTrack.write()和AudioTrack.play()之前发生。
https://stackoverflow.com/questions/10409122
复制相似问题