失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > FFmpeg+Python打造命令行工具箱

FFmpeg+Python打造命令行工具箱

时间:2020-03-22 15:03:02

相关推荐

FFmpeg+Python打造命令行工具箱

目录

总操作模式的设计一次可以处理多个文件。一个例子多文件处理的技巧参数设计输出路径工具一、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打造命令行工具箱》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。