Как передать файл в JNI для воспроизведения в OpenSL ES AudioPlayer?

1

Я пытаюсь создать AudioPlayer (согласно образцу Native-NDK), но без использования AssetManager, поскольку файлы, которые будут воспроизводиться, загружаются динамически и, следовательно, не упаковываются как Assset.

Поэтому мне было интересно, можно ли передать 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 является классом, а не int (SLuint32), который будет использоваться SLDataLocator_AndroidFD.

Конструктор ниже:

/** 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;

Любая помощь будет оценена!

  • 0
    Вы когда-нибудь понимали это? Хотите опубликовать ответ?
  • 0
    К сожалению, я не закончил тем, что просто закодировал звуковые файлы в виде массива байтов на стороне JNI.
Теги:
android-ndk
jni
opensl

1 ответ

0

Не уверен, что это точно ответит на вопрос, но вот немного кода, который я нашел, чтобы читать файлы с 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};

Ещё вопросы

Сообщество Overcoder
Наверх
Меню