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;
}