如何使用start& amp来修剪视频以编程方式在android中结束时间?

时间:2018-05-24 04:37:02

标签: android video android-library video-editing

我想以编程方式在android中根据开始和结束时间修剪本地视频,我在下面尝试了附加的几个链接但是没有为我工作。请让我知道任何工作库或示例代码来克服这个问题?

参考链接:

  1. Android sdk cut/trim video file
  2. How to trim the video using FFMPEG library in android?
  3. https://superuser.com/questions/377343/cut-part-from-video-file-from-start-position-to-end-position-with-ffmpeg
  4. 提前致谢!

3 个答案:

答案 0 :(得分:4)

使用FFMPEG库解决您的问题。感谢writeminds让ffmpeg变得简单  1. implementation 'com.writingminds:FFmpegAndroid:0.3.2'

  1. 初始化ffmpeg

    private void setUpFFmpeg() {
    ffmpeg = FFmpeg.getInstance(context);
    
    
    try {
        ffmpeg.loadBinary(new LoadBinaryResponseHandler() {
    
            @Override
            public void onStart() {
                Log.d("Event ", "onStart");
            }
    
            @Override
            public void onFailure() {
                Log.d("Event ", "onFailure");
            }
    
            @Override
            public void onSuccess() {
                Log.d("Event ", "onSuccess");
            }
    
            @Override
            public void onFinish() {
                Log.d("Event ", "onFinish");
    
            }
        });
    } catch (FFmpegNotSupportedException e) {
        // Handle if FFmpeg is not supported by device
    }
    }
    
  2. 使用上面发布的@Mahesh Keshvala之类的FFMPEG command。好工作@Mahesh

  3. 然后execFFmpegBinary(complexCommand);就像这样

    private void execFFmpegBinary(String[] command){
          try {
    
        ffmpeg.execute(commands, new ExecuteBinaryResponseHandler() {
    
            @Override
            public void onStart() {
                Log.d("Event ", "onStart");
            }
    
            @Override
            public void onProgress(String message) {
                Log.e("Event ", "onProgress - " + message);
    
            }
    
            @Override
            public void onFailure(String message) {
                Log.e("Event ", "onFailure - " + message);
    
            }
    
            @Override
            public void onSuccess(String message) {
                Log.e("Event ", "onSuccess - " + message);
    
            }
    
            @Override
            public void onFinish() {
                Log.e("Event ", "onFinish");
    
            }
        });
    } catch (FFmpegCommandAlreadyRunningException e) {
        // Handle if FFmpeg is already running
     }
    }
    
  4. 尝试剪切视频命令

    String[] complexCommand = {"-ss", "" + startMs / 1000, "-y", "-i", inputFileAbsolutePath, "-t", "" + (endMs - startMs) / 1000, "-s", "320x240", "-r", "15", "-vcodec", "mpeg4", "-b:v", "2097152", "-b:a", "48000", "-ac", "2", "-ar", "22050", outputFileAbsolutePath};
    

    了解更多关于ffmpeg android的信息this link

答案 1 :(得分:1)

以下是使用FFMPEG库使用以下功能修剪或剪切视频的解决方案,这可能对您有用:

private void executeCutVideoCommand(int startMs, int endMs) {
    File moviesDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES
    );

    String filePrefix = "cut_video";
    String fileExtn = ".mp4";
    String yourRealPath = getPath(VideoEffectActivity.this, selectedVideoUri);
    File dest = new File(moviesDir, filePrefix + fileExtn);
    int fileNo = 0;
    while (dest.exists()) {
        fileNo++;
        dest = new File(moviesDir, filePrefix + fileNo + fileExtn);
    }

    Log.d(TAG, "startTrim: src: " + yourRealPath);
    Log.d(TAG, "startTrim: dest: " + dest.getAbsolutePath());
    Log.d(TAG, "startTrim: startMs: " + startMs);
    Log.d(TAG, "startTrim: endMs: " + endMs);
    filePath = dest.getAbsolutePath();
    //String[] complexCommand = {"-i", yourRealPath, "-ss", "" + startMs / 1000, "-t", "" + endMs / 1000, dest.getAbsolutePath()};
    String[] complexCommand = {"-ss", "" + startMs / 1000, "-y", "-i", yourRealPath, "-t", "" + (endMs - startMs) / 1000, "-vcodec", "mpeg4", "-b:v", "2097152", "-b:a", "48000", "-ac", "2", "-ar", "22050", filePath};

    execFFmpegBinary(complexCommand);

}


 private void execFFmpegBinary(final String[] command) {
    try {
        ffmpeg.execute(command, new ExecuteBinaryResponseHandler() {
            @Override
            public void onFailure(String s) {
                Log.d(TAG, "FAILED with output : " + s);
            }

            @Override
            public void onSuccess(String s) {
                Log.d(TAG, "SUCCESS with output : " + s);
               //You have to create a class of Preview Activity
               //If you don't have please remove below Intent code
                    Intent intent = new Intent(VideoEffectActivity.this, PreviewActivity.class);
                    intent.putExtra(FILEPATH, filePath);
                    startActivity(intent);
            }

            @Override
            public void onProgress(String s) {
                    progressDialog.setMessage("progress : " + s);
                Log.d(TAG, "progress : " + s);
            }

            @Override
            public void onStart() {
                Log.d(TAG, "Started command : ffmpeg " + command);
                progressDialog.setMessage("Processing...");
                progressDialog.show();
            }

            @Override
            public void onFinish() {
                Log.d(TAG, "Finished command : ffmpeg " + command);
               progressDialog.dismiss();
            }
        });
    } catch (FFmpegCommandAlreadyRunningException e) {
        // do nothing for now
    }
}

将此依赖项放入gradle文件中:

    compile 'com.writingminds:FFmpegAndroid:0.3.2'

答案 2 :(得分:0)

在 Kotlin 中更新了解决方案 ffmpeg 库。此解决方案已使用 SDK 版本 21 至 30 进行测试。

首先需要添加依赖

implementation 'com.arthenica:mobile-ffmpeg-full:4.2.2.LTS'

下面是剪辑视频的代码片段。

注意:您需要使用 AsyncTask 或 Kotlin 协程在后台线程中运行以下代码

val outputFile = UtilsFile.createVideoFile(context)
        val command =
            arrayOf(
                "-ss",
                "1",    //Start point in seconds
                "-y",
                "-i",
                inputFile.absolutePath,
                "-t",
                "60",   //Ending point in seconds
                "-s",
                "648x1152",
                "-r",
                "15",
                "-vcodec",
                "mpeg4",
                "-b:v",
                "2097152",
                "-b:a",
                "48000",
                "-ac",
                "2",
                "-ar",
                "22050",
                outputFile.absolutePath
            )
        val rc = FFmpeg.execute(command)

        if (rc == RETURN_CODE_SUCCESS) {
            Log.i(TAG, "Command execution completed successfully.")
            return outputFile
        } else if (rc == RETURN_CODE_CANCEL) {
            Log.i(TAG, "Command execution cancelled by user.")
        } else {
            Log.i(
                TAG,
                String.format(
                    "Command execution failed with rc=%d and the output below.",
                    rc
                )
            )
        }