带音频效果的安卓媒体播放器:出现错误(-22,0)



嗯,这只是我的要求。

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

我正在使用媒体播放器来播放文件,并使用预设混响来添加一些效果。

这是我的代码

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/媒体播放器 (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);

媒体播放器正在成功播放文件。所以我的 WAV 文件没有问题。

有点失望,我尝试了环境混响,而不是预设混响,

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工具生成的。我不知道是什么许可证阻止我播放此文件。

好吧,我终于让它工作了。我重新阅读了文档,玩了代码,突然一切都工作了。这些是我的发现,以防将来对任何人有所帮助。

在预设混响的情况下

在预设混响文档中

预设混响是一种输出混音辅助效果,应该是 在音频会话 0 上创建为了媒体播放器或 要输入此效果的音轨,它们必须明确 附加到它,并且必须指定发送级别。使用效果 ID 由 getId(( 方法返回,以指定此特定效果,当 将其附加到媒体播放器或音轨。

也就是说

PresetReverb pReverb = new PresetReverb(0,player.getAudioSessionId()); <== error

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

PresetReverb pReverb  = new PresetReverb(1,0); <== correct

现在我们可以将其与 媒体播放器 or 音轨 使用

player.attachAuxEffect(pReverb.getId());
player.setAuxEffectSendLevel(1.0f);

我的完整预设混响代码是

PresetReverb pReverb    = new PresetReverb(1,0);
player.attachAuxEffect(pReverb.getId());
pReverb.setPreset(PresetReverb.PRESET_LARGEROOM);
pReverb.setEnabled(true);
player.setAuxEffectSendLevel(1.0f);

注意:如果您正在寻找良好的混响效果或回声,最好使用环境混响。我对PresetReverb的性能有些失望。

在环境混响的情况下

来自环境混响的文档

环境混响是一种输出混音辅助效果,应在音频会话 0 上创建。为了媒体播放器或 要输入此效果的音轨,它们必须明确 附加到它,并且必须指定发送级别。使用效果 ID 由 getId(( 方法返回,以指定此特定效果,当 将其附加到媒体播放器或音轨。

完全像预设混响,但是当我写的时候

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

没有错误,我得到了良好的混响效果和回声。所以这似乎是文档中的错误。此外,当我们将播放器的会话ID传递给构造函数(player.getAudioSessionId(((时,似乎不需要将播放器与EnvironmentalReverb实例附加。奇怪。。

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

EnvironmentalReverb  eReverb 
             = new EnvironmentalReverb(0,0); 
player.attachAuxEffect(eReverb.getId());     <== No,not comment this one

对于其他音频效果儿童(均衡器,低音增强器,虚拟器(

这些不是我问题的一部分。但对于未来看到这一点的每个人..

注意:将插入效果(均衡器、低音增强器、虚拟器(附加到 已弃用会话 0 的全局音频输出混合。

请参阅文档

关于错误 (-22,0(

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

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

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

PresetReverb pReverb = new PresetReverb(1,0);

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

<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />

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

相关内容

  • 没有找到相关文章

最新更新