首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有AudioEffect的Android AudioEffect:获取错误(-22,0)

带有AudioEffect的Android AudioEffect:获取错误(-22,0)
EN

Stack Overflow用户
提问于 2012-05-02 07:00:26
回答 3查看 8.4K关注 0票数 8

很简单这是我的要求。

我有一个WAV文件,我想打开它,添加一些效果,然后播放.

我使用MediaPlayer播放文件,使用PresetReverb添加一些效果。

这是我的密码

代码语言:javascript
复制
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)

但当我评论这些台词时

代码语言:javascript
复制
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,

代码语言:javascript
复制
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本身)出现了一些问题。有人能给点线索吗?

编辑:我忘记添加的,当我调试代码时,错误记录在

代码语言:javascript
复制
 player.start();

被处决了。在张贴上面的代码段之前,我已经删除了异常处理部分。但我是积极的,在我被处决的时候,也没有例外。

再次编辑:

链接,我理解了错误-22是PVMFErrLicenseRequiredPreviewAvailable

代码语言:javascript
复制
/*
 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工具生成的。我不知道是什么执照阻止我播放这个文件。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-05-02 11:37:29

我终于让它起作用了。我重新阅读了文档,处理了代码,突然一切都正常了。这些是我的发现,以防将来对任何人有帮助。

在PresetReverb的情况下

在presetReverb文档中

PresetReverb是一个输出混合辅助效应,应该在音频会话0上创建。为了使MediaPlayer或AudioTrack能够实现这一效果,必须将它们明确地附加到其中,并且必须指定发送级别。使用getId()方法返回的效果ID来指定将其附加到MediaPlayer或AudioTrack时的特定效果。

上面写着

代码语言:javascript
复制
PresetReverb pReverb = new PresetReverb(0,player.getAudioSessionId()); <== error

是不允许的您只能使用全局音频会话0来构造PresetReverb。

代码语言:javascript
复制
PresetReverb pReverb  = new PresetReverb(1,0); <== correct

现在,我们可以使用MediaPlayer或AudioTrack将其附加到

代码语言:javascript
复制
player.attachAuxEffect(pReverb.getId());
player.setAuxEffectSendLevel(1.0f);

我的完整PresetReverb代码是

代码语言:javascript
复制
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,但是当我写

代码语言:javascript
复制
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。奇怪..。

为了完整起见,这个方法也能像文档所说的那样起作用。

代码语言:javascript
复制
EnvironmentalReverb  eReverb 
             = new EnvironmentalReverb(0,0); 
player.attachAuxEffect(eReverb.getId());     <== No,not comment this one

其他AudioEffect儿童(均衡器、BassBoost、虚拟器)

这些不是我问题的一部分。但对于所有在未来看到这一切的人..。

注意:使用会话0将插入效果(均衡器、低音增强器、虚拟器)附加到全局音频输出组合中是不推荐的。

请参阅文档

关于错误(-22,0)

公平地说,这不是一条信息错误信息。我不知道为什么当我们搞砸音频会话时,出现了一个无效的许可证错误。无论如何,当我更正音频会话参数时,这个错误消失了。这就是我所知道的。

票数 14
EN

Stack Overflow用户

发布于 2012-08-01 12:26:52

我遇到了同样的问题,要使用音频会话0,必须使用权限MODIFY_AUDIO_SETTINGS

票数 1
EN

Stack Overflow用户

发布于 2015-01-24 21:23:17

这一行本质上解决了其中一个问题,但它仍然需要权限。

代码语言:javascript
复制
PresetReverb pReverb = new PresetReverb(1,0);

因此,将下面的行添加到您的AndroidManifest.xml实际上解决了根本问题:

代码语言:javascript
复制
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />

此外,您还需要设置PresetReverb并将其附加到AudioTrack以在执行AudioTrack.write()和AudioTrack.play()之前发生。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10409122

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档