首页 > 解决方案 > 为什么视频不使用 ffmpeg 在 android 中保存给定路径?

问题描述

我想使用 ffmpeg 将视频保存为 android 中的给定路径。我正在使用此命令保存视频,但它不起作用。我错在哪里?

String[] command_try = new String[13];
    command_try[0] = "-i";
    command_try[1] = "/sdcard/Videos/Videos/f2a804f062384d4da3995d3bdce15610.mp4";
    command_try[2] = "-i";
    command_try[3] = "/sdcard/Videos/Videos/vidlogogif.gif";
    command_try[4] = "-filter_complex";
    command_try[5] = "overlay=(main_w-overlay_w)/2:y=(main_h-overlay_h)/2";
    command_try[6] = "-pix_fmt";
    command_try[7] = "yuv420p";
    command_try[8] = "-c:a";
    command_try[9] = "copy";
    command_try[10] = "-preset";
    command_try[11] = "ultrafast";
    command_try[12] = "/sdcard/Videos/Videos/video11.mp4";

标签: androidffmpeg

解决方案


  1. 第一步是为清单文件添加权限

     <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    
  2. 然后将“权限询问”代码添加到java文件

    hasPermission();从您的活动中调用onCreate(),这是您的方法:

     private void hasPermission() {
         if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
             final String[] s = new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE};
             if (ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED ||
                     ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
                 PermissionsDialog(s);
             } else {
                 // do something when you got permission
             }
         } else {
             // do something when you got permission
         }
     }
    

Android 应用需要用户在具有以下功能的设备上获得许可api >= 23

api如果您的设备版本为,这将请求许可>= 23,如果低于23或已授予权限,则将执行下一个任务。

如果用户deny许可,那么PermissionsDialog(s);将被要求请求许可。

    private void PermissionsDialog(final String[] s) {
        ActivityCompat.requestPermissions(MainActivity.this, s, Helper.REQUEST_PERMISSION);
    }

然后,如果用户allowdeny权限来自此方法:

    @Override
        public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
            if (requestCode == Helper.REQUEST_PERMISSION) {
                if (grantResults.length > 0) {
                for (int grantResult : grantResults) {
                    if (grantResult != PackageManager.PERMISSION_GRANTED) {
                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M &&
                            !ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, permissions[0])) {
                        startActivityForResult(new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS,
                                Uri.parse("package:" + BuildConfig.APPLICATION_ID)), Helper.SETTINGS_CODE);
                    } else {
                        hasPermission();
                    }
                } else {
                    // do something when you got permission
                }
            }
        }
    }
}

此方法检查是否授予权限,它会继续请求权限,直到您获得权限allow,如果您deny获得权限,don't ask again那么我们必须将用户导航到应用程序设置屏幕以手动允许权限。

现在,当用户来自onActivityResult(...)活动设置屏幕时将被调用,这里调用hasPermission();重新检查用户是否从设置屏幕授予权限,如下所示:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == Helper.SETTINGS_CODE) {
        hasPermission();
    }
}

推荐阅读