吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 929|回复: 16
上一主题 下一主题
收起左侧

[其他原创] autojs+ffmpeg批量剪切视频,批量合并

  [复制链接]
跳转到指定楼层
楼主
l劉l 发表于 2024-12-11 14:02 回帖奖励

功能:手机上批量合并视频
虽然很多软件都能合并,但是自己写的就是感觉不一样。

起因是刷抖音看到

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

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

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

[JavaScript] 纯文本查看 复制代码
// 加载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")

靓仔可以赞赏一下。

免费评分

参与人数 1吾爱币 +7 热心值 +1 收起 理由
苏紫方璇 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

推荐
hanbazhen 发表于 2024-12-11 15:04
l劉l 发表于 2024-12-11 14:43
一看就是明白人,这是手机上的一个软件(auto.js),所以有些东西跟电脑不一样,分辨率还是我特意去掉的{ ...

不同分辨率等参数不能直接copy合并,电脑的是转成TS格式再合并,就不知道手机是不是自适应合并的

电脑FFM的GPU加速命令我每次都用,我这破电脑用了编码速度都比原来快一倍,是什么卡就用对应代码,手机你也整个

手机的我之前没捣鼓过,不知道是不是输入代号,骁龙SOC它GPU是Adreno xxx

2、FFM有手机端也有汉化版,我之前试过不能像电脑那样做复杂操作,比如:A视频是竖屏1080*1920,把A里面人的正脸裁剪并放大至 ix*1080,放在画布为2400*1080最左边,另一个流也是A,不改画面大小并放在紧挨着第一个流的右边,这个命令我电脑上经常这样操作,但手机端我之前用它只能输入一个视频,上面这个场景对同一个视频做两次流我不知道怎么弄
3#
hanbazhen 发表于 2024-12-11 14:24
建议楼主加入不同分辨率等参数不一致的视频合并选项;还有加入GPU加速处理功能,比纯CPU快多了,以后碰到画中画、区域模糊水印、竖屏转横屏这种复杂点用加速处理也好用GPU加速

还有这个用什么软件执行代码的?
4#
zheng10072 发表于 2024-12-11 14:24
本帖最后由 zheng10072 于 2024-12-11 14:40 编辑

大佬牛逼
5#
开创者 发表于 2024-12-11 14:26
有人来写个教程怎么使用不?
头像被屏蔽
受到警告 6#
lc2006 发表于 2024-12-11 14:37
提示: 该帖被管理员或版主屏蔽
7#
 楼主| l劉l 发表于 2024-12-11 14:38 |楼主
zheng10072 发表于 2024-12-11 14:24
function 名还有中文的,秀到飞起。编程这么多年我还真不知道 python 里面可以中文方法名,我也要去试试

不是python。是一个手机软件叫“AUTO.JS"搭配ffmpeg编辑视频,中文名字是为了方便自己看就没替换成英文。
8#
 楼主| l劉l 发表于 2024-12-11 14:40 |楼主
开创者 发表于 2024-12-11 14:26
有人来写个教程怎么使用不?

搜一下autojs,手机软件,很多教程。
9#
 楼主| l劉l 发表于 2024-12-11 14:43 |楼主
hanbazhen 发表于 2024-12-11 14:24
建议楼主加入不同分辨率等参数不一致的视频合并选项;还有加入GPU加速处理功能,比纯CPU快多了,以后碰到画 ...

一看就是明白人,这是手机上的一个软件(auto.js),所以有些东西跟电脑不一样,分辨率还是我特意去掉的,但是你说的GPU 我确实有想法,目前还不知道能不能行。
10#
cggm 发表于 2024-12-11 14:47
大佬牛逼
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2025-1-7 19:45

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表