在Android上获取音频文件的持续时间

2019年4月14日 11点热度 0条评论

我无法获得Android上 bundle 式音频文件的持续时间。

我尝试了这个:

        String stringDuration;
        MediaMetadataRetriever mmr = new MediaMetadataRetriever();
        try {
            mmr.setDataSource(fullpath);
            stringDuration = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);
        }
        catch (IllegalArgumentException e) {
            debugalert("androidbridgeGetdurationofsound IllegalArgumentException error getting duration: " + e.getMessage());
            return 0;
        }
        catch (Exception e) {
            debugalert("androidbridgeGetdurationofsound Exception error getting duration: " + e.getMessage());
            return 0;
        }
        finally {
            mmr.release();
        }

它总是失败,并带有IllegalArgumentException异常。我不确定路径是否不正确(尝试了几种变体),该MediaMetadataRetriever类不支持该媒体(尝试了m4a和wav)。音频本身可以在Android上正常播放。

我尝试了几种路径变体:

  • Assets / Assets /声音/_TESTSOUNDWAVE.wav
  • android.resource://com.package.name/assets/Assets/sounds/_TESTSOUNDWAVE.wav
  • 我正在使用Cocos2D-x v3.6。没有固有的(有效的,有效的)方法来获取音频文件的持续时间(使用AudioEngine进行尝试)。

    上面的代码来自Cocos2D-x的C++端通过JNI调用的 Activity 的静态方法。

    解决方案如下:

    原来Cocos2D-x不知何故给了我指向 Assets 文件的不正确确切路径!我使用单例File-something-class获取C++端的确切路径,并将这些路径发送到平台端(iOS或Android)。始终在iOS上运行。由于某些原因,它不适用于Android。

    Android方面的工作路径是: Assets /声音/_TESTSOUNDWAVE.wav

    我必须从字符串(fullpath = fullpath.replaceAll("^assets/", "");)的开头专门删除“assets /”。我的设置可能有些有趣,或者Cocos2d-x存在问题。谁知道。

    我如何找出确切的路径是递归列出 bundle 中的所有内容:How can I get a directory listing of resources from my Android app?