从可打开的URI传递本地fd int到FFMPEG

10

我正在尝试从Storage Access Framework的 URI打开文件描述符。我首先尝试使用sdcard上的文件,我已经使用列解析为文件路径并打开文件(我正在努力摆脱这种方式,并改用文件描述符)。

我这样获取本机int fd:

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

然后在C++中,我尝试像这样打开它,这个想法来自于如何在Android中使用JNI正确地传递资产文件描述符给FFmpeg

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,同样的问题也会发生。如何在不使用文件路径的情况下正确地使用FFMPEG打开可打开的URI?


这个链接和我看到的内容很相似,是关于如何在Android中使用JNI正确传递Asset FileDescriptor给FFmpeg的问题。 - Robert Rowntree
@RobertRowntree,我已经在我的问题中放了链接,这就是我尝试做的基础。 - Steve M
1
@SteveM 根据 https://ffmpeg.org/doxygen/2.8/group__lavu__error.html#ga4ebaa288c7684a26a591c501208910e4 的说法,错误是由支持库生成的。你可能需要查看源代码以找出哪个库导致了错误。 - Dipen Shah
2
@DipenShah 迄今为止,这是唯一有用的信息 - 我认为错误是因为我没有使用管道协议构建它。 - Steve M
没有使用pipe进行构建肯定是问题的好原因。但是对于许多格式来说,使用pipe:并不够好,因为ffmpeg不支持此协议的查找,并且某些格式需要查找才能正确读取和/或写入。为了正确处理来自SAF的文件,我定义了一个自定义的saf:协议。 - Alex Cohn
3个回答

3
我的项目(FFmpegMediaMetadataRetriever)可以实现此功能。请查看此代码片段完整文件注意:确保已启用pipe协议构建FFmpeg!
我使用了avformat_open_input,通过dup()复制文件描述符,并确保通过以下方式设置偏移量:
 if (state->offset > 0) {
        state->pFormatCtx = avformat_alloc_context();
        state->pFormatCtx->skip_initial_bytes = state->offset;
 } 

2

@Steve M,你可以跟随这些链接,请 :) - user6264840

0
也许这是一个愚蠢的观察,但你试过替换为:

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

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

替换为:

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

?


FFmpeg库是纯C编写的,从纯C中调用它们(这些纯C并没有nullptr的概念)是完全合法的。 - Alex Cohn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接