python也支持视频处理,参考文献1中介绍了几种视频处理方式,本文采用moviepy模块进行视频处理。
moviepy不是python的默认安装模块,需要安装该模块,否则执行程序时会报下面的错误:
可以通过下列命令在线安装moviepy模块,安装过程如下图所示,安装成功后,即可在python程序中导入moviepy模块并使用其中的内容。
pip install moviepy
要剪切视频,需要获取视频长度,之前的文章中是调用ffmpeg获取的,而在python中通过创建VideoFileClip对象,在其duration属性中获取时长(参考文献1中返回的是毫秒,本文测试时该属性返回的时长是按秒算的)。程序代码如下所示:
# coding=gbkfrom moviepy.editor import VideoFileClip
import ospath = r"D:\test"
files=os.listdir(path)for onefile in files:myclip =VideoFileClip(path+'\\'+onefile )print(onefile+' 时长:',end='')print(myclip.duration)
获取时长后,仿照前面文章中的测试示例,将视频前后30秒的内容去掉。在python的moviepy模块中,主要调用subclip函数剪切视频及write_videofile保存视频。
subclip函数设置起始时间和结束时间,一般结束时间都是通过总时间减去尾部剪切时间算的,但是该函数支持结束时间指定为负数,如果是负数,则程序会自动用总时间加上负数计算截止时间(这样其实就可以不用专门写代码获取视频时长了),如下面的函数说明所示。
最终的批量剪切视频文件的程序如下所示:
# coding=gbkfrom moviepy.editor import VideoFileClipimport ospath = r"D:\test"files=os.listdir(path)fileIndex=1;for onefile in files:myclip =VideoFileClip(path+'\\'+onefile )print(onefile+' 时长:',end='')print(myclip.duration)subclip = myclip.subclip(30, -30)subclip.write_videofile(path+'\\'+str(fileIndex)+".mp4")fileIndex+=1
上述程序执行完毕后,视频虽然已剪切完毕,但是还是报了一个句柄无效的错误(如下图所示),根据参考文献4,在循环语句块中的write_videofile后面增加了一行myclip.close()语句,再运行程序,就不会出现该错误。
使用C#调用ffmpeg剪切视频和用python剪切视频各有千秋:
ffmpeg只有一个可执行文件,将其放在C#程序目录下即可调用,但是通过命令行参数方式调用ffmpeg时需要拼接命令行参数,并且命令行参数中的视频文件路径不能包含空格,否则ffmpeg识别命令行参数时就会出错。
而python程序安装moviepy模块时虽然装的东西不少,但是安装完毕后使用moviepy时代码简单,上面的python程序总共就十几行,并且不用像C#调用ffmpeg时一样组装命令行参数。
参考文献
[1]https://blog.csdn.net/weixin_42076509/article/details/107127147
[2]https://blog.csdn.net/qq_39241986/article/details/117887624
[3]https://zulko.github.io/moviepy/
[4]https://blog.csdn.net/qq_40706679/article/details/110882529
[5]https://blog.csdn.net/ucsheep/article/details/80999939