【问题标题】:How to pass file to JNI for playing in OpenSL ES AudioPlayer?如何将文件传递给 JNI 以在 OpenSL ES AudioPlayer 中播放?
【发布时间】:2014-05-08 06:37:53
【问题描述】:

我正在尝试创建 AudioPlayer(根据 Native-Audio NDK 示例),但没有使用 AssetManager,因为要播放的文件是动态下载的,因此不会打包为资产。

所以我想知道是否可以将 Java 中的 FileDescriptor 传递给 JNI,以便在下面的示例 JNI 代码(不使用 AssetManager)这样的情况下使用:

// open asset as file descriptor
off_t start, length;
int fd = AAsset_openFileDescriptor(asset, &start, &length);
assert(0 <= fd);
AAsset_close(asset);

// configure audio source
SLDataLocator_AndroidFD loc_fd = {SL_DATALOCATOR_ANDROIDFD, fd, start, length};
SLDataFormat_MIME format_mime = {SL_DATAFORMAT_MIME, NULL, SL_CONTAINERTYPE_UNSPECIFIED};
SLDataSource audioSrc = {&loc_fd, &format_mime}

不幸的是,在 Java 端,FileDescriptor 是一个类,而不是 SLDataLocator_AndroidFD 使用的 int (SLuint32)。

下面的构造函数:

/** File Descriptor-based data locator definition, locatorType must be SL_DATALOCATOR_ANDROIDFD */ typedef struct SLDataLocator_AndroidFD_ {
    SLuint32        locatorType;
    SLint32         fd;
    SLAint64        offset;
    SLAint64        length; } SLDataLocator_AndroidFD;

任何帮助将不胜感激!

【问题讨论】:

  • 你有没有想过这个问题?愿意发布答案吗?
  • 不幸的是,我们最终只是将声音文件硬编码为 JNI 端的字节数组。

标签: java c android-ndk java-native-interface opensl


【解决方案1】:

不确定这是否准确地回答了这个问题,但这是我发现的一些用于从 sd 卡读取文件的代码。如果您要将文件下载到外部存储,这应该适合您:

SLchar path[] = "/sdcard/audio/my_audio.mp3" ;
SLDataLocator_URI loc_uri = {SL_DATALOCATOR_URI, path};
SLDataFormat_MIME format_mime = {SL_DATAFORMAT_MIME, NULL,
        SL_CONTAINERTYPE_UNSPECIFIED};
SLDataSource audioSrc = {&loc_uri, &format_mime};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-04
    • 2012-06-21
    • 2012-12-23
    • 1970-01-01
    • 1970-01-01
    • 2011-05-16
    • 2022-06-10
    相关资源
    最近更新 更多