android - 为什么视频不使用 ffmpeg 在 android 中保存给定路径?

标签 android ffmpeg

我想使用 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";

最佳答案

  • 第一步是为 list 文件添加权限
     <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    
  • 然后将“权限询问”代码添加到java文件
    调用hasPermission();来自您的 Activity 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(...)的 Activity 将被调用,这里调用 hasPermission();重新检查用户是否从设置屏幕授予权限,如下所示:
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == Helper.SETTINGS_CODE) {
            hasPermission();
        }
    }
    

    关于android - 为什么视频不使用 ffmpeg 在 android 中保存给定路径?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65318573/

    相关文章:

    c# - 在 Unity 中使用 Firebase 云消息传递时如何获取当前 Activity ?

    android - Appium 自动服务器 - 未找到可以自动化 Chrome '68.0.3440' 的 Chromedriver

    android - 如何在设备中调试我的 android 应用程序

    c++ - 尝试混合两个 PCM 音频源

    C#如何获取流ffmpeg视频?

    c# - c#中的ffmpeg命令与变量

    Android:标签栏上的回收者 View

    Android 位图图像缓存

    ffmpeg - 我可以在一台机器上运行多少个 FFMPEG 命令

    ios - FFMpeg avformat_write_header 总是返回 < 0