目录
总操作模式的设计一次可以处理多个文件。一个例子多文件处理的技巧参数设计输出路径工具一、Gif 转换器方法来源效果参考实际指令代码以及使用工具二、画面裁切(crop)参数参数解释实际指令代码以及使用工具三、libx264转码参数参数解释实际指令代码工具四、截取片段使用参数实际指令代码工具五、MP4转码实际指令代码展望总操作模式的设计
瀑布式级联操作,用一个while循环不断读取用户输入,处理完后还可以继续处理。
GITEE仓库
一次可以处理多个文件。
将文件拖拽到命令行,按两次回车随机开始运行。第一次回车输入并记录下完整路径,第二次输入为空,开始执行。
一个例子
操作如下:
>>>文件一.mp4 ⏎>>>文件二.mp4 ⏎>>>空字符 ⏎>>>开始执行……
多文件处理的技巧
多文件免去逐一拽入的方法:命令行敲 dir /b *.mp4,右击复制、右击粘贴即可。需用notepad++拼接全路径,然后粘贴进去
参数设计
用问号分割路径和参数。
输出路径
若填入的路径非为文件(不存在或为路径),则将之设作输出目录。路径不存在则尝试新建,无效则回退至默认值,即None,此时使用源目录作为输出目录。
设置之后,作用于接下来添加的文件。
例子:
>>>C:\tmp>>>文件一>>>None>>>文件一
工具一、Gif 转换器
电脑里已经安装有轻量多功能工具ScreenToGif,奈何最近用不了,导入不了文件。唯 FFmpeg 足矣。
方法来源
/p/a11bbf804e75
http://blog.pkh.me/p/21-high-quality-gif-with-ffmpeg.html
效果参考
/p/120858ea2247
实际指令
Python调用FFMPEG执行两条指令:
第一条输出临时调色板图片(D:\downloads\tmp.jpg):
FFMPEG -i INPUT -b 568k -r 20 -vf fps=15,scale=816:-1:flags=lanczos,palettegen=stats_mode=diff -y "D:\Downloads\tmp.jpeg"
第二条在源目录生成gif(*_GifNo.序号.gif):
FFMPEG -i INPUT -i "D:\Downloads\tmp.jpeg" -r 15 -lavfi fps=15,scale=270:-1:flags=lanczos[x];[x][1:v]paletteuse=dither=bayer:bayer_scale=3:diff_mode=rectangle OUTPUT
代码以及使用
在命令行中输入:720
设置之后的GIF输出宽度为720,默认值270。
在文件路径后可追加:720
修饰宽度定义,此数值只作用于当前处理的文件。
/knziha/ffmpeg_toolbox/blob/master/gif.py
工具二、画面裁切(crop)
联合三大免费爆款软件:网页版PS——Photopea、WIndows视频播放器Potplayer、行业老大哥FFMPEG三者裁切出想要的画面区域。
参数
画面裁切必须先指定Crop参数。比如先输入裁切参数547:1080:0:0
,再输入文件路径。
文件路径后可追加CRF参数,比如文件一:23
,默认值19.
参数解释
547:1080:0:0
代表需要截取的长方形区域,以冒号分隔四个数字,依次为:宽、高、X轴位置、Y轴位置。
实际指令
FFMPEG -i INPUT -vf crop='547:1080:0:0' -acodec copy -vcodec libx264 -crf 19 OUTPUT
代码以及使用
为避免手动计算、复制Crop参数,我决定利用修改版的Photophea(原版无法复制弹出的Alert内容)。
首先,使用Potplayer打开视频文件,Ctrl+C复制源画面,Ctrl+V粘贴到Photophea中。
在后者当中画一个长方形(路径形状),覆盖想要截取的区域,在右侧边栏中打开属性面板,可以看到矩形的宽高、XY均以按序列出,只消用JavaScript将数据拼接成“宽:高:X:Y”的格式,就可以传给FFMEPG裁切画面了。
JavaScript生成数据后,进一步地,可以让浏览器自动复制生成的数据。我的做法是利用photopea自带的alert消息弹窗,弹出数据,然后利用选择、复制文本的API复制数据。
将码好的JavaScript代码制作成书签按钮,之后,就可以直接放置矩形、打开属性、点击书签按钮,完成一键复制,无需接触代码。
接下来,只需回到命令行,轻轻右击一下命令行窗口,Crop参数随之粘贴而来,诗意而优雅。
/knziha/ffmpeg_toolbox/blob/master/crop.py
工具三、libx264转码
转码的目的是减少视频文件的体积。适当转码后,一个百兆的文件可能只剩下二十几兆。
参数
在命令行输入:23
设置之后的CRF参数,默认值23.
在文件路径后可追加:23
修饰参数,只作用于当前处理的文件。
参数解释
-crf 23
CRF代表画质-文件体积之间的权衡因子,有效
范围是0到63,合理范围可选18到28,数字越大代表质量越低、
输出越小。
实际指令
FFMPEG -i INPUT -codec copy -c:v libx264 -crf 23 -preset superfast OUTPUT
代码
/knziha/ffmpeg_toolbox/blob/master/codec.py
工具四、截取片段
借助Potpalyer的书签功能,使用FFMPEG命令快速截取视频片段。
需配置Potpalyer,F5打开设置,左侧点“基本”,右侧栏下方第一行勾选“保存设置到INI”选框。
关闭Potplayer的时候会重写整个INI文件。其书签存储并不可靠,占用体积很大。当INI累积到10兆左右时,极易丢失全部书签,且用且珍惜。
使用
按P添加书签,H打开书签列表。在想要截取的片段首尾添加书签后,关闭Potplayer,运行脚本、把文件拽入命令行即可。
参数
在命令行输入冒号全局开启精确切割。冒号后面跟数字代表CRF参数。
在文件路径后可追加:23
修饰参数,只作用于当前处理的文件。
CRF参数仅作用于精确切割模式。
例子:
>>>文件一>>>文件一:>>>文件一:23
实际指令
快速切割(流复制):
FFMPEG -ss 00:10:15.480 -t 18.568 -accurate_seek -i INPUT -codec copy -avoid_negative_ts 1 -strict -2 OUTPUT
精确切割(重新编码):
FFMPEG -accurate_seek -i INPUT -ss 00:10:15.480 -t 18.568 -codec copy -c:v libx264 -avoid_negative_ts 1 -strict -2 OUTPUT
代码
/knziha/ffmpeg_toolbox/blob/master/shivo3.0.py
工具五、MP4转码
有的视频读不出来进度条,需要转码一下,这是最简单的。
实际指令
FFMPEG -i INPUT -c copy OUTPUT
代码
/knziha/ffmpeg_toolbox/blob/master/converter.py
展望
FFMPEG虽然强大,但是配置命令行有点麻烦。有时会出现难以解决的问题,特别是视频拼接和变速这两个功能,往往会发生音画不同步的现象,所以还不如用其他现成的、有GUI的软件。
相关的应用,国产有许多不错的。像很久以前就有的狸窝视频、格式工厂,和现在的快剪辑等。其中快剪辑的工程文件就是个特殊的JSON,可以自己改、自己生成工程文件,安卓和PC类似。
还有哔哩哔哩及其强大的视频编辑器,可以加文字,特效也太多了吧。可惜哔哩哔哩无法横屏,只好用XPOSED开启强制开启。
在雷电模拟器上使用哔哩哔哩,还可以重定向存储目录,将输出目录VideoTrimDir指向PC上共享的目录。这样,在电脑上就可以直接打开哔哩哔哩生成的文件,相当于当作Windows软件来用,呵呵。
哔哩哔哩会将合并完成的文件复制一份到相册,鸡肋,可以将相册的那个路径重定向为一个文件夹,阻止其鸡肋操作。
哔哩哔哩会立即将合并完成的视频文件上传,别急,为了阻止你犯傻,也没太好的办法,只好退后台关了……
如果觉得《FFmpeg+Python打造命令行工具箱》对你有帮助,请点赞、收藏,并留下你的观点哦!