从可打开的URI

时间:2017-05-06 01:08:38

标签: android ffmpeg storage-access-framework

我正在尝试从存储访问框架中的CATEGORY_OPENABLE URI打开文件描述符。我首先尝试使用sdcard上的文件,我已经可以使用_data列解析到文件路径并打开(我正在尝试远离这样做,而是使用文件描述符)。 / p>

我得到了这样的native int fd:

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

然后在C ++中,我试图像这样打开它,这个想法取自How to properly pass an asset FileDescriptor to FFmpeg using JNI in 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。如果我使用上面链接的jniGetFDFromFileDescriptor对象中的jni方法FileDescriptor来获取int fd,则会发生同样的事情。如何在不使用文件路径的情况下正确打开带有FFMPEG的可打开URI?

3 个答案:

答案 0 :(得分:2)

@Steve M,您可能从这些帖子中得到了答案:例如: 1. ffmpeg encoding sample wanted?

最后你会探索这个项目。 https://github.com/illuusio/ffmpeg-example

祝你好运! @Stev M

答案 1 :(得分:2)

我的项目(FFmpegMediaMetadataRetriever)完成了这项工作。请在此处查看this gistfull file

注意:确保已在启用管道协议的情况下构建了FFmpeg!

我使用avformat_open_inputdup()文件描述符,并确保通过以下方式设置偏移量:

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

答案 2 :(得分:0)

也许这是一个愚蠢的观察,但你是否试图取代:

avformat_open_input(& avFormatPtr,“dummyFilename”,nullptr,nullptr);

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

替换为:

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