[返回编程技术首页]·[所有跟帖]·[ 回复本帖 ] ·[热门原创] ·[繁體閱讀]·[坛主管理]

超业余编程爱好者照虎画猫的lua插件之路

送交者: lyabc[♂★★★声望勋衔13★★★♂] 于 2024-01-11 7:59 已读 2458 次 2赞  

lyabc的个人频道

+关注
超业余编程爱好者照虎画猫的lua插件之路
21:50 2024/1/11

前言跟背景说明

我没有专门研究过编程语言,以前大学的时候简单的学过c,java,也都忘得差不多了,现在属于编程方面的业余爱好者,还是最初级的,主要是偶尔根据自己的需要写一些脚本,通过google来的知识拿别人的代码,进行增删修改达到适合自己使用的目的,说的高大上点,这是结合了拿来主义的实用主义,说的实在点,我这就是照虎画猫的歪门邪道,语言掌握不掌握没关系,代码漂亮不漂亮没关系,甚至语法懂不懂都没关系,目的只有两个字“能用”。因为不是整天使用或者进行软件开发,所以我没有花时间去钻研编程语言,或者软件架构,或者编程算法,这些被认为是最基础的编程者最应该掌握的东西,所以专门搞软件开发的朋友们,千万憋学我! 真正搞软件的,基础是必须的。如果您是专业的或者抱着专业的心态编程的,就别继续看了, 我这纯粹是贻笑大方,但跟我一样主张实用主义的对编程懂一些但又不是很懂却想搞东搞西搞点东西玩玩用用的朋友,请继续,我的经验或许你可以用到,我把这次的想法跟最终实现的过程大题说一下,希望对有需要的人有一点借鉴的价值,也希望大家能指出我的错误跟不足的地方。

我这次做这个插件的目的就是要快速的切割视频。以前有用过一个工具叫MP4splitter(https://www.mp4joiner.org/en/) 用了也蛮久的,不过问题是我得用那个工具重新打开自己看的视频,然后再重新找到自己想要的时间戳。因为觉得麻烦,我就开始搜索解决办法。我想在播放器内直接调出命令窗口进行操作,就可以更加快捷方便。搜索之后发现了vlc的插件功能,又搜到一个插件,是叫vlc gif maker的(https://github.com/dante383/vlc-gif-maker/blob/main/vlc_gif_maker.lua) 。
这个插件实际上已经基本能实现我所需要的功能了,因为它虽然是用来生成gif图片的,但其根本是调用ffmpeg。(这里多提一下ffmpeg,这是一个开源免费的命令行工具,用来视频处理的,功能极其强大。)所以,只要调整ffmpeg语句,就可以达到快速方便的切割视频的目的。

试图从MP4splitter代码找思路的弯路


在确定用vlc的lua插件实现功能之前,我先是查看了mp4splitter的源码,因为它是开源的,自己又用了很久,以为能给些借鉴,不过一个软件,虽然是很简单的,但其复杂程度比起脚本来说还是要高很多的。不是完全没有收获,知道了它也是一个套壳软件,核心功能是ffmpeg实现的,如下图。所以我觉得,如果不是决定搞软件开发或者想深入的研究学习,源代码类的东西,尽量还是不要去接触,当然专业的或者就是搞软件开发的,那必须的,甚至还要多去读。

ffmpeg的命令行语句的学习

回到ffmpeg, vlc gif maker用来生成GIF的ffmpeg语句是

ffmpeg -ss {start_timestamp} -to {stop_timestamp} -i {input_file} -vf "fps={fps},scale=498:-1:flags=lanczos,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" -loop {loop} "{output_path}/{output_filename}.gif"

我google到ffmpeg切视频的语法是
ffmpeg -ss 00:00:30.0 -i input.wmv -c copy -t 00:00:10.0 output.wmv

所以我所需要改动的只是将其改为下面的就可以了
ffmpeg -ss {start_timestamp} -to {stop_timestamp} -i "{input_file}" "{output_path}/{output_filename}.mp4"

试了试,果然可以。

这个切割过程还是挺快的。不过切割出来的视频有个问题,就是刚开始会停顿一下,搜索了一下,需要重新编码。于是将这个命令改进为:

ffmpeg -ss {start_timestamp} -to {stop_timestamp} -i "{input_file}" -c:v libx264 -c:a aac -movflags +faststart "{output_path}/{output_filename}.mp4"

不过有了新的问题,就是重新编码的过程比较慢,所以,我去搜索了下怎么能让ffmpeg的处理更快点,于是找到了使用GPU来提速的办法,增加-hwaccel cuda。特别说明,这个功能要显卡支持。

ffmpeg -hwaccel cuda -ss {start_timestamp} -to {stop_timestamp} -i "{input_file}" -c:v libx264 -c:a aac -movflags +faststart "{output_path}/{output_filename}.mp4"

大多时候我的视频切片是上传到twitter的,而twitter的非会员有2:20的限制,所以我将视频长度都限定在了2:19秒,这样命令行进一步改动为:
ffmpeg -hwaccel cuda -ss {start_timestamp} -t 00:02:19 -i "{input_file}" -c:v libx264 -c:a aac -movflags +faststart "{output_path}/{output_filename}.mp4"

至此,命令行的改动达到令我满意的程度。

不过还有一个新问题,是在使用这个脚本的过程中发现的,它经常卡住。基本上使用一次,就得重启vlc,我之前没有找到特别好的解决办法,于是就想到了把命令行写入批处理命令文件。一顿操作猛如虎,说干就干。google怎么用lua写bat文件,然后修改lua,问题解决。

中文文件的乱码问题


只是后来使用过程中,又遇到新问题了。也就是我在咱们版块里提出来的,脚本遇到中文文件名的文件就运行出错了。遇到,搜索,询问,尝试,解决,在不断的试错跟摸索中前进,这就是我照虎画猫式编程的SOP。
我先是了解了lua对与中文字符的处理相关的知识,又了解下cmd的执行,终于明白了问题的所在,在新的试错中,终于又一点点的把问题搞定了,这其中得到了版主wecode的大力帮助,非常感谢!!问题的解决过程,大家想知道的话,可以去看看,我就不重复了。
https://web.6parkbbs.com/index.php?app=forum&act=view&tid=4054542

最终我的脚本算是完成了。我保留了原脚本的一些选项,它虽然是叫做clip cutter,但其实也可以进行ffmpeg的其它操作,比如转化gif,只要修改一下调用ffmpeg的命令就行。

总结


这个脚本虽然很简单,但涉及到的知识还是挺多的,想要顺利的实现照虎画猫,需要知道代码大体是做什么的,知道最根本的逻辑原理,然后按照自己的要求,一点一点的去将遇到的问题解决。归纳下所涉及到的知识:
a. bat 批处理文件
b. ffmpeg 使用
c. lua 语法
d. vlc的lua scripting API
e. vlc的lua 插件基础知识
f. bat,lua对中文编码的处理

另外,chatgpt是一个很好的工具,不会就问,有不少想法都可以实现了,只是chatgpt还不够成熟,经常答非所问,而且细节处理不到位,所以跟有技术的朋友们相互交流是很重要的。

未来计划


以后的打算,可能会进行下面的改进:
1. 将界面改的更好看点
2. 实现直接调用而不用生成bat文件(用别的vlc脚本的时候找到了思路,但目前懒得做了,因为够用了)
3. 增加点别的功能,名字再改的恰当点,或许叫ffmpeg caller? 其实不止能调用ffmpeg命令,算了,目前懒得想了。
4. 这次对中文编码有了一些了解,这种东西是通用性的,我觉得有必要多研究一下,改天专门写个帖子。

我的脚本vlc clip cutter的安装与使用


如果有想使用的或者是借鉴的朋友,可以到这个链接下载两个lua文件:
https://gitfront.io/r/lyabc/jHNg6AMGhHNM/VLC-Clip-Cutter/
使用前,请先安装vlc,ffmpeg,并且将ffmpeg的路径写入系统的环境变量,
vlc_clip_cutter.lua 放到 %AppData% lcluaextensions
utf8gbk.lua 放到 VLC_INSTALL_PATH/lua/modules/
调用方式是打开vlc,View,Clip Cutter,也可以用快捷键 Alt+I+C

这个插件虽然我把它当Mp4的切割工具,但实际上它是在vlc播放器里对ffmpeg的调用,只要ffmpeg能做到的,它都能做,而ffmpeg的强大能力,有兴趣的可以去google一下,我列出几个我常用到的命令
--从选定的开始时间戳切割2分19秒的视频
ffmpeg -hwaccel cuda -ss {start_timestamp} -t 00:02:19 -i "{input_file}" -c:v libx264 -c:a aac -movflags +faststart "{output_path}/{output_filename}.mp4"
--根据选定的开始到结束时间戳切割视频
ffmpeg -hwaccel cuda -ss {start_timestamp} -to {stop_timestamp} -i "{input_file}" -c:v libx264 -c:a aac -movflags +faststart "{output_path}/{output_filename}.mp4"
--根据开始结束的时间戳来生成gif
ffmpeg -ss {start_timestamp} -to {stop_timestamp} -i {input_file} -vf "fps={fps},scale=498:-1:flags=lanczos,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" -loop {loop} "{output_path}/{output_filename}.gif"

带大括号{}的变量是通过脚本获取或者设置的,经常使用的命令行可以通过 “Set to default”来设置为默认。
贴主:lyabc于2024_01_11 8:54:40编辑
喜欢lyabc朋友的这个贴子的话, 请点这里投票,“赞”助支持!

已标注为lyabc的原创内容,若需转载授权请联系网友本人。若违规侵权,请联系我们

所有跟帖:   ( 主贴楼主有权删除不文明回复,拉黑不受欢迎的用户 )


用户名: 密码: [--注册ID--]

标 题:

粗体 斜体 下划线 居中 插入图片插入图片 插入Flash插入Flash动画


     图片上传  Youtube代码器  预览辅助



[ 留园条例 ] [ 广告服务 ] [ 联系我们 ] [ 个人帐户 ] [ 创建您的定制新论坛频道 ] [ Contact us ]