我正在尝试从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?
pipe
进行构建肯定是问题的好原因。但是对于许多格式来说,使用pipe:
并不够好,因为ffmpeg不支持此协议的查找,并且某些格式需要查找才能正确读取和/或写入。为了正确处理来自SAF的文件,我定义了一个自定义的saf:
协议。 - Alex Cohn