FFmpeg+Python打造命令行工具箱

目录

  • 总操作模式的设计
    •   一次可以处理多个文件。
    •   一个例子
    •   多文件处理的技巧
    •   参数设计
    •   输出路径
  • 工具一、Gif 转换器
    •   方法来源
    •   效果参考
    •   实际指令
    •   代码以及使用
  • 工具二、画面裁切(crop)
    •   参数
    •   参数解释
    •   实际指令
    •   代码以及使用
  • 工具三、libx264转码
    •   参数
    •   参数解释
    •   实际指令
    •   代码
  • 工具四、截取片段
    •   使用
    •   参数
    •   实际指令
    •   代码
  • 工具五、MP4转码
    •   实际指令
    •   代码
  • 展望

总操作模式的设计

瀑布式级联操作,用一个while循环不断读取用户输入,处理完后还可以继续处理。

GITEE仓库

  一次可以处理多个文件。

将文件拖拽到命令行,按两次回车随机开始运行。第一次回车输入并记录下完整路径,第二次输入为空,开始执行。

  一个例子

操作如下:

>>>文件一.mp4 ⏎
>>>文件二.mp4 ⏎
>>>空字符 ⏎
>>>开始执行……

  多文件处理的技巧

多文件免去逐一拽入的方法:命令行敲 dir /b *.mp4,右击复制、右击粘贴即可。 需用notepad++拼接全路径,然后粘贴进去

  参数设计

用问号分割路径和参数。

  输出路径

若填入的路径非为文件(不存在或为路径),则将之设作输出目录。路径不存在则尝试新建,无效则回退至默认值,即None,此时使用源目录作为输出目录。

设置之后,作用于接下来添加的文件。

例子:

>>>C:\tmp
>>>文件一
>>>None
>>>文件一

工具一、Gif 转换器

电脑里已经安装有轻量多功能工具ScreenToGif,奈何最近用不了,导入不了文件。唯 FFmpeg 足矣。

  方法来源

https://upload-images.jianshu.io/upload_images/2253897-5e37ddc84e1c6088.gif?imageMogr2/auto-orient/strip

http://blog.pkh.me/p/21-high-quality-gif-with-ffmpeg.html

  效果参考

https://www.jianshu.com/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修饰宽度定义,此数值只作用于当前处理的文件。

https://gitee.com/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参数随之粘贴而来,诗意而优雅。

https://gitee.com/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

  代码

https://gitee.com/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

  代码

https://gitee.com/knziha/ffmpeg_toolbox/blob/master/shivo3.0.py


工具五、MP4转码

有的视频读不出来进度条,需要转码一下,这是最简单的。

  实际指令

FFMPEG -i INPUT -c copy OUTPUT

  代码

https://gitee.com/knziha/ffmpeg_toolbox/blob/master/converter.py


展望

FFMPEG虽然强大,但是配置命令行有点麻烦。有时会出现难以解决的问题,特别是视频拼接和变速这两个功能,往往会发生音画不同步的现象,所以还不如用其他现成的、有GUI的软件。

相关的应用,国产有许多不错的。像很久以前就有的狸窝视频、格式工厂,和现在的快剪辑等。其中快剪辑的工程文件就是个特殊的JSON,可以自己改、自己生成工程文件,安卓和PC类似。

还有哔哩哔哩及其强大的视频编辑器,可以加文字,特效也太多了吧。可惜哔哩哔哩无法横屏,只好用XPOSED开启强制开启。

在雷电模拟器上使用哔哩哔哩,还可以重定向存储目录,将输出目录VideoTrimDir指向PC上共享的目录。这样,在电脑上就可以直接打开哔哩哔哩生成的文件,相当于当作Windows软件来用,呵呵。

哔哩哔哩会将合并完成的文件复制一份到相册,鸡肋,可以将相册的那个路径重定向为一个文件夹,阻止其鸡肋操作。

哔哩哔哩会立即将合并完成的视频文件上传,别急,为了阻止你犯傻,也没太好的办法,只好退后台关了……

你可能感兴趣的:(FFMPEG)