python调用ffmpeg命令行工具便捷操作视频示例实现过程
作者:Python 技术 发布时间:2023-12-19 07:48:22
文 | 李晓飞
来源:Python 技术「ID: pythonall」
最近有了一个新任务,需要将赛事视频,拆分成两分钟以内的小段,用于发布到短视频平台上。
本以为是个一次性的工作,结果赛事视频数据巨大,视频文件长短不一,完全没法手工处理,于是 Python 又一次拯救了我。
还等什么,开始干吧!
最重要的事
无论做什么事情,都要去分析一下最重要的是什么,然后集中精力攻克,再继续找最重要的事。
对我们这个任务来说,不算是个大项目,不过呢,还是要找最重要的事开始,步步为营,最终将整个问题解决了。
整体来来看,我们需要从一个目录中读取视频文件,然后,对每个视频文件进行裁剪,最后将处理好的文件保存好。
在这个过程中,最重要的是什么呢?我觉得,是视频裁剪,如果不能方便的裁剪视频,其他的一切工作都是白费的,是吧。
裁剪视频
现在短视频很流行,有很多视频编辑软件,功能丰富,而我们需要的只是裁剪功能,而且需要用编程的方式调用,那么最合适的莫过于 ffmpeg[1] 了。
ffmpeg 是一个命令行工具,功能强大,可以编程调用。
从 ffmpeg 官网上下载对应操作系统的版本,我下的是 Windows 版[2]。
下载后解压到一个目录,然后将目录下的 bin,配置到环境变量里。然后打开一个命令行,输入:
> ffmpeg -version
ffmpeg version 2021-10-07-git-b6aeee2d8b-full_build- ...
测试一下,能显示出版本信息,说明配置好了。
现在读一下文档,发现拆分视频文件的命令是:
ffmpeg -i [filename] -ss [starttime] -t [length] -c copy [newfilename]
]
i
为需要裁剪的文件
ss
为裁剪开始时间
t
为裁剪结束时间或者长度
c
为裁剪好的文件存放
好了,用 Python 写一个调用:
import subprocess as sp
def cut_video(filename, outfile, start, length=90):
cmd = "ffmpeg -i %s -ss %d -t %d -c copy %s" % (filename, start, length, outfile)
p = sp.Popen(cmd, shell=True)
p.wait()
return
定义了一个函数,通过参数传入
ffmpeg
需要的信息将裁剪命令写成一个字符串模板,将参数替换到其中
用
subprocess
的Popen
执行命令,其中参数shell=True
表示将命令作为一个整体执行p.wait()
很重要,因为裁剪需要一会儿,而且是另起进程执行的,所以需要等执行完成再做后续工作,否则可能找不到裁剪好的文件
这样视频裁剪工作就完成了,然后再看看什么是最重要的。
计算分段
视频裁剪时,需要一些参数,特别是开始时间,如何确定呢?如果这件事做不好,裁剪工作就很麻烦。
所以看看如何计算裁剪分段。
我需要将视频裁剪成一分半的小段,那么将需要知道目标视频文件的时间长度。
获取视频长度
如何获得长度呢?ffmpeg 提供了另一个命令 —— ffprobe
。
找了一下,可以合成一个命令来获取:
> ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 -i a.flv
920.667
命令比较复杂哈,可以先不用管其他参数,只要将要分析的视频文件传入就好了。命令的结果是显示一行视频文件的长度。
于是可以编写一个函数:
import subprocess as sp
def get_video_duration(filename):
cmd = "ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 -i %s" % filename
p = sp.Popen(cmd, stdout=sp.PIPE, stderr=sp.PIPE)
p.wait()
strout, strerr = p.communicate() # 去掉最后的回车
ret = strout.decode("utf-8").split("\n")[0]
return ret
函数只有一个参数,就是视频文件路径
合成命令语句,将视频文件路径替换进去
用
subprocess
来执行,注意这里需要设置一下命令执行后的输出用
wait
等待命令执行完成通过
communicate
提取输出结果从结果中提取视频文件的长度,返回
分段
得到了视频长度,确定好每个分段的长度,就可以计算出需要多少分段了。
代码很简单:
import math
duration = math.floor(float(get_video_duration(filename)))
part = math.ceil(duration / length)
注意,计算分段时,需要进行向上取整,即用 ceil
,以包含最后的一点尾巴。
得到了需要的分段数,用一个循环就可以计算出每一段的起始时间了。
获取文件
因为处理的文件很多,所以需要自动获取需要处理的文件。
方法很简单,也很常用,一般可以用 os.walk 递归获取文件,还可以自己写,具体根据实际情况。
for fname in os.listdir(dir):
fname = os.path.join(dir, os.path.join(dir, fname))
basenames = os.path.basename(fname).split('.')
mainname = basenames[0].split("_")[0]
...
提供视频文件所在的目录,通过 os.listdir
获取目录中的文件,然后,合成文件的绝对路径,因为调用裁剪命令时需要绝对路径比较方便。
获取文件名,是为了在后续对裁剪好的文件进行命名。
代码集成
现在每个部分都写好了,可以将代码集成起来了:
def main(dir):
outdir = os.path.join(dir, "output")
if not os.path.exists(outdir):
os.mkdir(outdir)
for fname in os.listdir(dir):
fname = os.path.join(dir, os.path.join(dir, fname))
if os.path.isfile(fname):
split_video(fname, outdir)
main
方法是集成后的方法先创建一个裁剪好的存储目录,放在视频文件目录中的 output 目录里
通过
listdir
获取到文件后,对每个文件进行处理,其中判断了一下是否为文件调用
split_video
方法开始对一个视频文件进行裁剪
来源:https://blog.csdn.net/weixin_48923393/article/details/120858140


猜你喜欢
- Django View官方文档一个视图函数(类),简称视图,是一个简单的 Python 函数(类),它接受Web请求并且返回Web响应。响应
- 如何将产生的密码记录并发送给用户?这里使用了cdonts邮件组件来发送邮件,前提服务器得支持cdonts组件。好了,看看具体实现方法吧,不是
- Pyperclip模块详解一. Pyperclip模块安装Pyperclip模块兼容python2和python3,能跨平台使用。安装指令如
- Python 是支持面向对象的,很多情况下使用面向对象编程会使得代码更加容易扩展,并且可维护性更高,但是如果你写的多了或者某一对象非常复杂了
- 功能描述:如图,右侧悬浮菜单按钮,只支持上下方向拖动,点击时展开或关闭菜单。BUG说明:鼠标上下方向拖拽,如果松开时鼠标位于悬浮按钮上会默认
- 和大多数的语言脚本一样,学习ASP最好的方法就是亲身尝试ASP,使用你自己的系统安装PWS或者IIS。你可以边学习边在你自己的服务器上测试A
- 后边要做一个微信小程序,并要能获取用户微信绑定的手机号码。而小程序开发文档上边提供的获取手机号码的接口(getPhoneNumber())返
- 根据 Dotzler 的统计,IE6 的份额正在缩水,这可能是 2009 年本人听到的第一个好消息。于此同时,Gmail 的浏览器支持列表中
- 本文为大家分享了centos7利用yum安装mysql 8.0.12的详细步骤,供大家参考,具体内容如下清理原有的mysqlrpm -qa
- 与Python标准库模块命名冲突Python的一个优秀的地方在于它提供了丰富的库模块。但是这样的结果是,如果你不下意识的避免,很容易你会遇到
- 本文实例讲述了Python中shape计算矩阵的方法。分享给大家供大家参考,具体如下:看到机器学习算法时,注意到了shape计算矩阵的方法接
- 安装anaconda 是自动集成的如果导入不存在,直接pippip install tqmd参数#参数介绍iterable=None,des
- 前言这是一个轮子。大家都知道 Ansible 是功能超级强大的自动化运维工具,十分的高大上。太高大上了以至于在低端运维有点水土不服,在于三点
- 这篇文章与大家分享13个超级有用的 jQuery 内容滚动插件和教程。您可能经常能看到一些网站上特色区域的内容以滚动方式变化,这是一种在有限
- 在网上找了各种安装教程,都没有在python3下安装nltk,于是我自己尝试着安装,算是成功了1、首先,假设你的python3已经安装好,并
- 今天服务器重新安装mssql2005版本,为了安全让mssql2005运行在独立用户下,权限也没错误,但竟然出现了以下错误; -------
- 使用了application及结合数据库来保存统计数据 <html><head><title>
- Microsoft SQL Server 2000的会话上下文信息使应用程序得以设置二进制值,以便在同一会话或连接上运行的多个批处理、存储过
- 用的昨天刚接触到的库,在windows下通过paramiko来登录linux系统并执行了几个命令,基本算是初试成功,后面会接着学习的。代码:
- 记录一下微信支付整个流程1.公众号申请及配置流程使用微信支付的前提是必须要有公众号。 申请链接: 微信公众号申请.记得选择服务号,根据操作提