我想以编程方式在android中根据开始和结束时间修剪本地视频,我在下面尝试了附加的几个链接但是没有为我工作。请让我知道任何工作库或示例代码来克服这个问题?
参考链接:
答案 0 :(得分:4)
使用FFMPEG库解决您的问题。感谢writeminds让ffmpeg变得简单
1. implementation 'com.writingminds:FFmpegAndroid:0.3.2'
初始化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
}
}
使用上面发布的@Mahesh Keshvala之类的FFMPEG command。好工作@Mahesh
然后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
}
}
尝试剪切视频命令
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
)
)
}