吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1655|回复: 22
收起左侧

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

  [复制链接]
l劉l 发表于 2024-12-11 14:02

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

起因是刷抖音看到

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

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

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

[JavaScript] 纯文本查看 复制代码
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
057
058
059
060
061
062
063
064
065
066
067
068
069
070
071
072
073
074
075
076
077
078
079
080
081
082
083
084
085
086
087
088
089
090
091
092
093
094
095
096
097
098
099
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
// 加载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,不改画面大小并放在紧挨着第一个流的右边,这个命令我电脑上经常这样操作,但手机端我之前用它只能输入一个视频,上面这个场景对同一个视频做两次流我不知道怎么弄
hanbazhen 发表于 2024-12-11 14:24
建议楼主加入不同分辨率等参数不一致的视频合并选项;还有加入GPU加速处理功能,比纯CPU快多了,以后碰到画中画、区域模糊水印、竖屏转横屏这种复杂点用加速处理也好用GPU加速

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

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

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

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

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

本版积分规则

返回列表

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

GMT+8, 2025-4-1 23:28

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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