gpt4 book ai didi

java - 如何在 Android 31 : permission denied 中通过 ffmpeg 操作文件

转载 作者:行者123 更新时间:2023-12-04 23:20:31 39 4
gpt4 key购买 nike

我正在尝试在我的 android 应用程序中使用 FFmpeg。所以我想在继续之前测试它是否有效。我使用外部库:github link
代码如下所示:

package net.omidn.aslanmediaconverter;

import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;

import androidx.appcompat.app.AppCompatActivity;

import com.arthenica.ffmpegkit.ExecuteCallback;
import com.arthenica.ffmpegkit.FFmpegKit;
import com.arthenica.ffmpegkit.FFmpegSession;
import com.arthenica.ffmpegkit.Session;

import net.bramp.ffmpeg.job.FFmpegJob;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;


public class MainActivity extends AppCompatActivity {

private static final String TAG = "MainActivity";
FFmpegJob myjob;

@Override
protected void onCreate(Bundle savedInstanceState) {


super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

TextView textView = (TextView) findViewById(R.id.text_view);


FFmpegJob job = null;

File inFile = new File("/storage/emulated/0/video_2021-05-29_17-50-20.mp4");
String inputName = Uri.fromFile(inFile).toString();
Log.d(TAG, inputName);
Log.d(TAG,"file exists : " + String.valueOf(inFile.exists()));
Log.d(TAG,"file canRead : " + String.valueOf(inFile.canRead()));

FFmpegSession fFmpegSession = FFmpegKit.executeAsync("-i file:///storage/emulated/0/video_2021-05-29_17-50-20.mp4 -c:v mpeg4 file:///storage/emulated/0/out.mp4",
new ExecuteCallback() {
@Override
public void apply(Session session) {

}
});
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
textView.setText("" + fFmpegSession.getState().name() + " " + fFmpegSession.getOutput());
}

}

如您所见,我将文件提供为 file:///协议(protocol)。如果我不使用它,结果是一样的。 Log.d(...)的三行将打印:
2021-06-03 00:58:08.869 8376-8376/net.omidn.aslanmediaconverter D/MainActivity: file:///storage/emulated/0/video_2021-05-29_17-50-20.mp4
2021-06-03 00:58:08.869 8376-8376/net.omidn.aslanmediaconverter D/MainActivity: file exists : true
2021-06-03 00:58:08.869 8376-8376/net.omidn.aslanmediaconverter D/MainActivity: file canRead : false
视频文件对存储具有读取权限:
The video file has read access

最佳答案

我从 the libraries 找到了一种方法来做到这一点维基页面。
我将在这里引用它:
如果您想使用通过 FFmpegKit 使用存储访问框架 (SAF) 选择的文件,您可以使用以下方法转换一个Uri到用 FFmpegKit 定义的文件路径saf:协议(protocol)。该路径可以安全地用作FFmpegKit 中的输入或输出。和 FFprobeKit命令。
输入

Uri uri = intent.getData();
String inputPath = FFmpegKitConfig.getSafParameterForRead(requireContext(), uri);
FFmpegKit.execute("-i " + inputPath + " ... output.mp4");

输出
Uri uri = intent.getData();
String outputPath = FFmpegKitConfig.getSafParameterForWrite(requireContext(), uri);
FFmpegKit.execute("-i input.mp4 ... " + outputPath);
The wiki page on GitHub

关于java - 如何在 Android 31 : permission denied 中通过 ffmpeg 操作文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67812354/

39 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com