Передача встроенного fd int в FFMPEG из открываемого URI

Я пытаюсь открыть дескриптор файла из CATEGORY_OPENABLE URI из инфраструктуры доступа к хранилищу. Сначала я пытаюсь использовать файл на SD-карте, который уже можно найти в пути к файлу, используя _data столбец и открыть (я пытаюсь уйти от этого, и вместо этого использовать дескриптор файла).

Я получаю родной INT FD, как это:

int fd = getContentResolver().openFileDescriptor(data.getData(), "r").detachFd();

Затем в C++ я пытаюсь открыть его следующим образом, идея взята из статьи Как правильно передать актив FileDescriptor в FFmpeg с помощью JNI в Android:

pFormatCtx = avformat_alloc_context();
pFormatCtx->iformat = av_find_input_format("mp3");

char path[50];
sprintf(path, "pipe:%d", fd);

int e;
if(e=(avformat_open_input(&pFormatCtx,path,NULL,NULL)!=0)){
    av_strerror(e, path, 50);
    return error;
}

Это приводит к "Неизвестной ошибке" из avformat_open_input, То же самое происходит, если я использую метод jni jniGetFDFromFileDescriptor из вышесказанного связано на FileDescriptor объект, чтобы получить int fd вместо этого. Как правильно открыть открываемый URI с помощью FFMPEG, не используя путь к файлу?

3 ответа

Мой проект ( https://github.com/wseemann/FFmpegMediaMetadataRetriever/) выполняет это. Смотрите эту суть или полный файл здесь.

Примечание: убедитесь, что вы создали FFmpeg с включенным протоколом канала!

я использовал avformat_open_input, dup() дескриптор файла и убедитесь, что установить смещение с помощью:

 if (state->offset > 0) {
        state->pFormatCtx = avformat_alloc_context();
        state->pFormatCtx->skip_initial_bytes = state->offset;
 } 

@Steve M, может быть, вы получили ответ от этих сообщений: например: 1. Требуется пример кодирования ffmpeg?

и наконец вы исследуете этот проект. https://github.com/illuusio/ffmpeg-example

Удачи! @ Стив М

Может быть, это глупое наблюдение, но вы пытались заменить:

avformat_open_input (& avFormatPtr, "dummyFilename", nullptr, nullptr);

(avformat_open_input(&pFormatCtx,path,NULL,NULL)

Заменить на:

(avformat_open_input(&pFormatCtx,path,nullptr,nullptr)

?

Другие вопросы по тегам