autojs+ffmpeg批量剪切视频,批量合并-源码区论坛-autojs-五云学习

autojs+ffmpeg批量剪切视频,批量合并

起因是刷抖音看到

一个博主大部分视频都是一个模板拍的,开头几秒都是一个动作,就萌发把开头几秒整合成一个视频的想法,由于博主视频太多,一个一个拼接怕把自己累死。(当然是女博主,兴趣是最好的老师)

遂找资料,敲代码,历经1天半功能基本实现,还有很多优化空间。实在懒得优化了,发出来谁有功夫优化一下告诉我一声,以下只是合并视频代码,剪切不发了,就几行。主要是功能实现了就没动力了。

代码缺点,需要手动修改多次才能得到最终视频。线程利用率不高,现在是一组线程完事了,才启动下一组(一组启动几个线程是可以自定义的)。没做到逐渐往线程里填加数据使当下线程保持一个稳定的运行数量。

以下两个内容一样的,靓仔可以付费一下。

// 加载ffmpeg插件
let ffmpeg = plugins.load(‘org.autojs.plugin.ffmpeg’);
console.show()
var lock = threads.lock();
path_o = “/storage/emulated/0/VideoFactory/”
const regex = /.*?mp4$/i;
arrpat = sz(path_o, regex)

arr_mp3 = []
for (i in arrpat) {
arr_mp3.push(path_o + arrpat[i]);
}
arr_fz = z指定分组(arr_mp3, 5) //几个视频一起合并
arr_fz2 = z指定分组(arr_fz, 3) //启动几个线程
log(arr_fz.length)
log(arr_fz2.length)
xr(jcht(arr_fz2), “./123.js”)

for (f2 in arr_fz2) {
processWithThreads(arr_fz2[f2], arr_fz2[f2].length)
console.warn(“一组线程执行完毕”)
}

function processWithThreads(arr_fz, threadCount) {
// 获取数组长度,用于后续对比线程数量限制
var arrLength = arr_fz.length;
// 如果传入的线程数量大于数组长度,将线程数量修正为数组长度
if (threadCount > arrLength) {
threadCount = arrLength;
}
// 用于存储创建的线程对象
var threadsArray = [];
// 循环创建指定数量的线程
for (var i = 0; i < threadCount; i++) {
(function(index) {
// 创建并启动线程,传入自执行函数作为线程执行的逻辑
var thread = threads.start(function() {
// 构建输出文件路径,这里简单示例,可根据实际调整
var path_out = “/storage/emulated/0/VideoFactory/11/” + (index + 1) + “.mp4”;

lock.lock();

mn = index
nx: while (1) {
// log(files.exists(path_out))
if (files.exists(path_out)) {
mn++
path_out = “/storage/emulated/0/VideoFactory/11/” + mn + “.mp4”;
} else {
break nx;
}
}
// log(path_out)
var m = FFmpeg命令构建(arr_fz[index], path_out);
// log(“线程” + (index + 1) + “:\n” +m);
files.createWithDirs(path_out)
log(path_out)
lock.unlock();
// 执行FFmpeg命令,获取执行结果
let result = ffmpeg.inProcess.exec(m);
// console.info(“线程” + (index + 1) + “:” + result.code);
});
// 将创建的线程对象添加到线程数组中
threadsArray.push(thread);
})(i);
}
// 等待所有线程执行完毕,这里可根据实际需求进一步完善等待逻辑,比如设置超时等
for (var j = 0; j < threadsArray.length; j++) {
try {

console.error(“线程等待: ” + j);
threadsArray[j].join();
} catch (e) {
console.error(“线程等待出现异常: ” + e);
}
}
}

function sz(path, regex) {
return files.listDir(path, function(name) {
return regex.test(name);
});
}

// 自定义分组处理函数
function z指定分组(arr, groupSize) {
result = [];
for (let i = 0; i < arr.length; i += groupSize) {
endIndex = Math.min(i + groupSize, arr.length);
result.push(arr.slice(i, endIndex););
}
return result;
}

function FFmpeg命令构建(videoPaths, outputPath) {
let command = `-y `;
videoPaths.forEach(path => {
command += `-i “${path}” `;
});
let filterComplex = ”;
for (let i = 0; i < videoPaths.length; i++) {
filterComplex += `[${i}:v][${i}:a]`;
}
filterComplex += `concat=n=${videoPaths.length}:v=1:a=1[outv][outa]`;
command += `-filter_complex “${filterComplex}” `;
command += `-map “[outv]” -map “[outa]” `;
command += `-vsync 2 `;
command += `-r 30 `;
command += `-b:v 5M `;
command += `”${outputPath}”`;
return command;
}

log(“end”)

 

 

 

 

请登录后发表评论