Android 从可打开的URI向FFMPEG传递本机fd int

Android 从可打开的URI向FFMPEG传递本机fd int,android,ffmpeg,storage-access-framework,Android,Ffmpeg,Storage Access Framework,我正在尝试从存储访问框架中的CATEGORY\u OPENABLEURI打开文件描述符。我首先尝试使用SD卡上的一个文件,我已经可以使用\u data列将其解析为一个文件路径并打开(我尝试不这样做,而是使用文件描述符) 我得到的本机int fd如下所示: int fd = getContentResolver().openFileDescriptor(data.getData(), "r").detachFd(); 那么,在C++中,我试图打开它,这个想法来自: 这会从avformat\u o

我正在尝试从存储访问框架中的
CATEGORY\u OPENABLE
URI打开文件描述符。我首先尝试使用SD卡上的一个文件,我已经可以使用
\u data
列将其解析为一个文件路径并打开(我尝试不这样做,而是使用文件描述符)

我得到的本机int fd如下所示:

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

那么,在C++中,我试图打开它,这个想法来自:


这会从
avformat\u open\u输入中产生一个“未知错误”。如果我使用上面链接到
FileDescriptor
对象的jni方法
jnigetFromFileDescriptor
来获取int-fd,也会发生同样的情况。我怎样才能在不使用文件路径的情况下用FFMPEG正确打开一个可打开的URI?

@Steve M,您可能从以下帖子中得到答案:例如: 1.

最后,您将探索这个项目。


祝你好运@Stev M

也许这是一个愚蠢的观察,但您是否尝试替换:

avformat_open_输入(&avFormatPtr,“dummyFilename”,nullptr,nullptr)

替换为:

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

我的项目()实现了这一点。请看这里的地图

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

我使用了
avformat\u open\u input
dup()
文件描述符,并确保通过以下方式设置偏移量:

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

看similar@RobertRowntree我已经在我的问题中链接了它,这就是我试图做的事情的基础。@SteveM因为错误是由支持库生成的。您可能想看看源代码,找出是哪个库导致了错误error@DipenShah这是到目前为止唯一有用的信息-我认为错误是因为我没有使用管道协议构建它。没有
管道的构建
肯定是问题的一个很好的原因。但是对许多格式使用
pipe:
是不够的,因为ffmpeg不支持此协议的seek,并且一些格式需要seek来正确读取和/或写入。要正确处理来自的文件,我需要一个自定义的
saf:
协议。@Steve M,您可以按照以下链接进行操作:)ffmpeg库是纯C的,从纯C调用它们(它没有nullptr的概念)是完全合法的。
(avformat_open_input(&pFormatCtx,path,nullptr,nullptr)
 if (state->offset > 0) {
        state->pFormatCtx = avformat_alloc_context();
        state->pFormatCtx->skip_initial_bytes = state->offset;
 }