How To Trim The Video With Start & End Time In Android Programmatically?
Solution 1:
Use FFMPEG library to solve your problem. Thanks for writingminds to make ffmpeg simple for android
1. implementation 'com.writingminds:FFmpegAndroid:0.3.2'
initialize ffmpeg
privatevoidsetUpFFmpeg() { ffmpeg = FFmpeg.getInstance(context); try { ffmpeg.loadBinary(newLoadBinaryResponseHandler() { @OverridepublicvoidonStart() { Log.d("Event ", "onStart"); } @OverridepublicvoidonFailure() { Log.d("Event ", "onFailure"); } @OverridepublicvoidonSuccess() { Log.d("Event ", "onSuccess"); } @OverridepublicvoidonFinish() { Log.d("Event ", "onFinish"); } }); } catch (FFmpegNotSupportedException e) { // Handle if FFmpeg is not supported by device } }
use FFMPEG command like @Mahesh Keshvala posted above. Good work @Mahesh
then
execFFmpegBinary(complexCommand);
will be like thisprivatevoidexecFFmpegBinary(String[] command){ try { ffmpeg.execute(commands, newExecuteBinaryResponseHandler() { @OverridepublicvoidonStart() { Log.d("Event ", "onStart"); } @OverridepublicvoidonProgress(String message) { Log.e("Event ", "onProgress - " + message); } @OverridepublicvoidonFailure(String message) { Log.e("Event ", "onFailure - " + message); } @OverridepublicvoidonSuccess(String message) { Log.e("Event ", "onSuccess - " + message); } @OverridepublicvoidonFinish() { Log.e("Event ", "onFinish"); } }); } catch (FFmpegCommandAlreadyRunningException e) { // Handle if FFmpeg is already running } }
try command for cut video
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};
to know more about ffmpeg android refer this link
Solution 2:
Here is the solution using FFMPEG library use below function to trim or cut the video, may this will work for you:
privatevoidexecuteCutVideoCommand(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 = newFile(moviesDir, filePrefix + fileExtn);
int fileNo = 0;
while (dest.exists()) {
fileNo++;
dest = newFile(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);
}
privatevoidexecFFmpegBinary(final String[] command) {
try {
ffmpeg.execute(command, newExecuteBinaryResponseHandler() {
@OverridepublicvoidonFailure(String s) {
Log.d(TAG, "FAILED with output : " + s);
}
@OverridepublicvoidonSuccess(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 codeIntent intent = newIntent(VideoEffectActivity.this, PreviewActivity.class);
intent.putExtra(FILEPATH, filePath);
startActivity(intent);
}
@OverridepublicvoidonProgress(String s) {
progressDialog.setMessage("progress : " + s);
Log.d(TAG, "progress : " + s);
}
@OverridepublicvoidonStart() {
Log.d(TAG, "Started command : ffmpeg " + command);
progressDialog.setMessage("Processing...");
progressDialog.show();
}
@OverridepublicvoidonFinish() {
Log.d(TAG, "Finished command : ffmpeg " + command);
progressDialog.dismiss();
}
});
} catch (FFmpegCommandAlreadyRunningException e) {
// do nothing for now
}
}
Put this dependency into gradle file:
compile'com.writingminds:FFmpegAndroid:0.3.2'
Solution 3:
Updated solution ffmpeg library in Kotlin. This solution is tested with SDK Versions 21 to 30.
First, you need to add the dependency
implementation 'com.arthenica:mobile-ffmpeg-full:4.2.2.LTS'
Below, is the code snippet for trimming the video.
Note: You need to run the below code inside the background thread by using AsyncTask or Kotlin Coroutines
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
} elseif (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
)
)
}
Post a Comment for "How To Trim The Video With Start & End Time In Android Programmatically?"