如何将文件传递给JNI以便在OpenSL ES AudioPlayer中播放?

时间:2014-03-28 17:00:19

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

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

所以我想知道是否可以将FileDescriptor从Java传递到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;

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分: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};