android - FFMPEG Android 存储访问框架

标签 android ffmpeg storage-access-framework

我在 Android 上使用 FFMPEG 来更改未在我的应用程序中录制的视频的比特率等。

我面临的问题是我无法获得用户从 SD 卡中选择的视频的绝对路径。

我正在使用 Android 存储访问框架,目前获得以下 Uri:content://com.android.externalstorage.documents/document/9C33-6BBD%3AVideos%2Freaps-driving.mp4
我使用的 FFMPEG 命令:

String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
                    String[] cmd = {"-y", "-i", mVideoUri.toString(), "-c:v", "libx264", "-preset", "ultrafast", "-strict", "-2", "-s", optimalVideoSize, "-aspect", "16:9", "-b", bitrate, String.format("/storage/emulated/0/Movies/InstaVid/VID_INSTAVID%s.mp4", timeStamp)};
                    executeFFmpegBinary(cmd, timeStamp);

我用 mVideoUri.toString() 没关系或 mVideoUri.getPath() .

有什么办法可以得到绝对路径吗?

最佳答案

The problem I'm facing is that I can't get the absolute path for a video the user selects from the SD Card



首先,存储访问框架不限于可移动存储。据您所知,如果用户从 Google Drive 中选择一些东西,那么视频目前甚至不在设备上。在另一个例子中,谷歌刚刚发布了一个 Samba 存储提供程序,如果用户使用它,则内容存在于 LAN 的某个文件服务器上,而不是设备上。

其次,您无法通过文件系统 API 访问可移动存储,除了几个选择区域(例如 getExternalFilesDirs() )。用户可以选择外面的视频。

Is there any way I can get the absolute path?



不,您的选择是:
  • 停止使用存储访问框架,而使用一些文件选择器库,这将限制您可以传递给 ffmpeg 的文件。 .
  • 使用 ContentResolveropenInputStream()获取 InputStream关于 Uri 标识的内容,然后使用它将内容的本地副本制作成您控制的文件。然后,将该本地副本的路径传递给 ffmpeg .完成后删除本地副本。
  • 关于android - FFMPEG Android 存储访问框架,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44952055/

    相关文章:

    android - "_Problem Loading Widget"是否可以检测和处理加载错误?

    FFMPEG文件缩小大小错误

    python-3.x - 使用ffmpeg从MP4文件中仅提取Y(YUV420p)帧?

    android - Android 11 上的新 BlobStoreManager 读写

    android - 使用外部存储写入 Android 11 上多个应用程序使用的文件

    android - 为什么要使用 Service 而不是 IntentService?

    android - 编辑文本 |安卓电视 |软键盘

    ffmpeg "-c copy"快速视频切割的替代品

    java - 在不使用 findFiles() 的情况下获取作为文档树子项的 DocumentFile

    Android:获取对 ActionBar 导航的 View 引用?