Kri*_*dra 7 java audio android android-mediaplayer audioeffect
嗯,这只是我的要求..
我有一个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();
}
});
}
Run Code Online (Sandbox Code Playgroud)
当我运行此代码时,我正在登录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);
Run Code Online (Sandbox Code Playgroud)
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);
Run Code Online (Sandbox Code Playgroud)
我也得到了同样的错误(错误(-22,0)).
所以要么我缺少一些如此明显的东西,要么AudioEffect系列类存在一些问题(在文档或api本身).任何人都能解释一下吗?
编辑:我忘了添加,当我调试代码时,错误被记录
player.start();
Run Code Online (Sandbox Code Playgroud)
被执行.我在发布上面的代码段之前删除了异常处理部分.但我很肯定,我执行时没有异常.
再次编辑:
从这个链接我开始明白错误-22是PVMFErrLicenseRequiredPreviewAvailable
/*
Error due to the lack of a valid license for the content. However
a preview is available.
*/
const PVMFStatus PVMFErrLicenseRequiredPreviewAvailable = (-22);
Run Code Online (Sandbox Code Playgroud)
我用PVMFErrLicenseRequiredPreviewAvailable搜索了,我得到了这个文件.并在第87页
14.10.5在没有有效许可证的情况下预览DRM内容
第14.10.3节中介绍的场景的变体是没有有效许可证来完整播放一段内容,但可以预览它.此方案可能是最初分发内容的常用方式,以便消费者可以在决定购买完整许可证之前进行预览.在这种情况下,Init()方法将返回代码PVMFErrLicenseRequiredPreviewAvailable,这表示完全播放需要许可证,但预览可用.为了播放预览,应用程序必须删除当前源,然后将其添加回本地数据源上设置的标志以指示预览模式.
现在我播放的WAV文件是由我在android SDK本身使用SpeechToText工具生成的.我不知道什么牌照让我玩这个文件.
Kri*_*dra 13
好吧,我终于开始工作了.我重读了文档,玩了代码,突然一切正常.这些是我的发现,以防将来帮助任何人.
在presetReverb文档中
PresetReverb是输出混合辅助效果,应在Audio session 0上创建.为了将MediaPlayer或AudioTrack提供给此效果,必须明确地将它们附加到它,并且必须指定发送级别.使用getId()方法返回的效果ID在将其附加到MediaPlayer或AudioTrack时指定此特定效果.
说的是
PresetReverb pReverb = new PresetReverb(0,player.getAudioSessionId()); <== error
Run Code Online (Sandbox Code Playgroud)
不被允许.您只能使用全局音频会话0来构建PresetReverb.
PresetReverb pReverb = new PresetReverb(1,0); <== correct
Run Code Online (Sandbox Code Playgroud)
现在我们可以使用MediaPlayer或AudioTrack附加它
player.attachAuxEffect(pReverb.getId());
player.setAuxEffectSendLevel(1.0f);
Run Code Online (Sandbox Code Playgroud)
我的完整PresetReverb代码是
PresetReverb pReverb = new PresetReverb(1,0);
player.attachAuxEffect(pReverb.getId());
pReverb.setPreset(PresetReverb.PRESET_LARGEROOM);
pReverb.setEnabled(true);
player.setAuxEffectSendLevel(1.0f);
Run Code Online (Sandbox Code Playgroud)
注意:如果您正在寻找良好的混响效果或回声,请更好地使用EnvironmentalReverb.我对PresetReverb的表现感到有些失望.
来自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
Run Code Online (Sandbox Code Playgroud)
没有错误,我得到了良好的混响效果和回声.所以这似乎是文档中的一个错误.此外,当我们将播放器的会话ID传递给构造函数(player.getAudioSessionId())时,似乎不需要使用EnvironmentalReverb实例附加播放器.奇怪..
为了完整起见,这个也像文档说的那样工作.
EnvironmentalReverb eReverb
= new EnvironmentalReverb(0,0);
player.attachAuxEffect(eReverb.getId()); <== No,not comment this one
Run Code Online (Sandbox Code Playgroud)
这些不是我问题的一部分.但是对于将来看到这一点的每个人来说......
注意:不建议使用会话0将插入效果(均衡器,低音增强,虚拟器)附加到全局音频输出混音.
看文档
嗯,公平地说它不是一个信息性的错误信息.我不知道为什么当我们搞乱音频会话时会出现无效的许可证错误.无论如何,当我更正音频会话参数时,此错误消失了.这是我所知道的一切.