Python自动化办公–长图拼接
Python调用外部程序的原理
导入函数库[对应的Python外部功能已经开发为库]
例如:Python语言默认是不支持Excel的。那么通过导入函数库xlrd,Python就可以获得对Excel的操作能力。
需要操作Python语言之外的功能,但这个功能没有人将它开发成函数库, 那如果我们想要使用这些功能,使用的途径就是调用外部命令了,而调用外部命令就需要 Python内部函数库的subprocess模块来实现。
实现机制
它的run()函数的参数可以指定一个可以运行的程序的路径,而 Python会根据这个路径来运行可执行文件,然后再根据运行结果,以及Python的逻辑判断去进行后续的自动化处理工作。
举例
1
2
3
4
5
6
7
8
9
10
11
12
13from subprocess import run,Popen,PIPE
cmd = ["dir"]
returncode = run(cmd)
# returncode是dir命令的退出状态码,通常来说, 一个为 0 的退出码表示进程运行正常
print(returncode)
with Popen(cmd,shell=True,stdout=PIPE,stderr=PIPE,encoding="utf-8") as fs:
fs.wait(2)
files = fs.communicate()[0]
print(files)这段代码中最核心的函数是run()函数和Popen类。subprocess模块就是通过这两个函数实现 的外部程序调用。
和import方式导入函数库的区别是,这种形式可以让你直接使用模块中的类和方法。 如果你使用 “import subprocess”方式导入subprocess库的话,在调用run()函数的时候, 就需要用 “库.函数”的形式在Python中使用库当中的函数,即“subprocess.run()”。在你 多次调用run()函数时,代码会较长,那么使用“from import”方式导入,就可以在当前代 码文件中直接使用run()函数,为代码的阅读带来更好的体验。
以上就是用subprocess库实现Python调用可执行程序的方法。Python之所以被我们称作最佳的“胶水语言”,就是因为它能轻易“粘合”可执行程序。利用Python灵活的逻辑判 断、循环语法可以实现程序的批量执行和流程管理。
长图拼接
拼接图片的功能Python本身是不具备的,因此就需要引入外部命令来实现图片拼接功能。
以MacOS平台图像处理软件ImageMagick,它能对图片进行编辑、合并、切割、旋转等90多种操作, ImageMagick软件实现图片拼接的命令格式是这样的:
在这段命令格式中,composite命令的参数包含了多个图片文件,每个图片需要对照着文件 将图片的路径和文件名写在参数中。如果手工输入图片名称,不仅效率低,而且容易遗漏。 另外,如果需要大量重复使用composite,还需要精细调整合并结果,给composite程序增加很多参数。
1 | p = Path(jpg_path) |
视频的拆分与合并
如何使用 subprocess库调用可执行程序,来进行视频的拆分与合并。
视频拆分的原理
你在电脑本地经常见到的视频格式是MP4,但如果要把视频放在互联网上,为了减少首次播放的加载时间,你就必须把一个MP4切分成多个文件,而且切分之后还需要把格式转换为.TS 格式的视频文件。
为什么不直接使用MP4格式,而是要把MP4格式改成.TS格式呢?这是因为.TS格式可以保证 多个文件之间的视频无缝播放,而且还会保证视频不会在播放下一个文件的时候,出现破音 或画面中断等影响用户体验的情况。
当我们将一个视频切分成多个文件的时候,就要考虑文件的播放顺序问题了。为了记录顺序,我们需要在切分之后引入一个索引文件,这个索引文件不用手动编写,我们直接使 FFmpeg命令就行了,它可以实现视频格式的转换、合并和拆分。FFmpeg命令会在切分之 后,自动产生一个以.M3U8结尾的索引文件。
我来解释一下这个索引文件。M3U8文件是指UDF-8编码格式下的M3U视频索引,播放器通 过这个索引文件就可以找到视频下所有的分段,并依次播放视频。
所以,想要使用Python进行视频拆分,我们首先需要FFmpeg命令, 然后通过Python设置FFmpeg的参数,最后再指定MP4文件和.TS文件的路径,这样就能实现拆分视频的功能了。
首先需要下载ffmpeg命令,用于把MP4切分成多段TS文件。
为了实现MP4文件格式的分割,需要使用ffmpeg非常多的参数。不过使用Python进行调用 的好处,就是你不用记住复杂的参数。我们把输入文件路径、切分大小、输出的M3U8和TS 文件指定为四个变量,这样只修改这四个变量,就可以实现拆分功能了。
相比直接使用FFmpeg,subprocess调用FFmpeg的优势就在于两点,一是不用 记住复杂参数,二是对批量转换视频非常有利
1 | from subprocess import run |