python ffmpeg批量修改文件名,压缩视频体积
咱们做试验时,常会产生“巨量”的图片和视频,这些原始资料非常重要,而且不能随意删除。随着时间流逝,积累的文件将会越来越多,而且查找起来也不太方便。
拥有良好工作习惯的工程师,一定会有随时整理文件的意识和能力。但是繁忙的工作极大的挤压了工程师的休息时间,为了提高工作效率,不得不使用一些工具。python是一个非常好用的工具,非常值得去学习和掌握!我个人大概花了1个月的时间就入门了,剩下的就是在使用的过程中逐渐提高技能。
下面看看有没有你感兴趣的功能吧!
无论是照片、图片、视频、word、ppt、excel、txt等文件都可以通过几行代码达到批量修改文件名的目的。如图所示,在我桌面input文件夹中有33张图片,图片的命名是混乱的。这时候如果我一张张去重命名图片将会是一个很大的工作量。若是使用python,情况将变得非常简单。
工作原理:工作原理非常简单,就是从文件夹中一张张的读入图片,然后把每张图片重新命名保存即可,文件的保存时不修改文件格式。举例:将上述图片重命名为小三轮1.png、小三轮2.png、小三轮3.png、小三轮4.png……,重命名的文件保存到同一个文件夹内。deffilename_editor(file_path, newname_key): filenames = os.listdir(file_path) print(filenames) # 显示文件夹内所有文件名称 for i in range(len(filenames)): file_old = os.path.join(file_path "\\" filenames[i]) file_new = os.path.join(file_path "\\" newname_key str(i 1) "." filenames[i].rsplit('.', 1)[-1]) os.rename(file_old, file_new) print("Done!%s 转换成功!" % filenames[i]) print("-----------------------------")if __name__ =="__main__": file_path =r"C:\Users\Administrator\Desktop\input" filename_editor(file_path, newname_key)唰的一下,33张图片已经重命名完成!本来想做个动画的,无奈程序执行时间太短了!各位亲自动手试试吧,非常好用!
后来,我还是做了一个动画,用了1758张图片,批量修改完成耗时3s,还是很快的。
随着科学技术的发展,手机像素越来越高,拍出来的照片和视频的清晰度也越来越高,问题也随着而来了。以现在常用的手机为例,录一个10min的视频尺寸达到1Gb,这无论是对于数据交互还是储存都是不太友好的。有时候我们并不需要视频拥有那么高的清晰度,有时我们希望在保存清晰度的情况下尽量减小视频的体积。比如每完成一个试验项目,都会相应的产生一段视频文件,累积起来一个完整的座椅测试项目可能要产生100Gb的视频文件。若不进行压缩,我们计算机的硬盘将不堪重负。由于视频文件也是二进制文件,使用常规的压缩工具(360压缩、好压、ZIP等)基本没有什么压缩效果(不信?可以自己动手试试看!)。
如果想要压缩单个视频文件的体积,看下面的方法就够了!
视频文件是由视频流、音频流组成的将一系列图片快速播放产生的动态图像、音频的聚合体,通常视频文件中音频流很小。视频流大小主要取决于编码技术、分辨率、帧率这三个因素。
视频压缩的方法通常有减小码率、减小帧尺寸(宽度x高度)、减小帧率等,下面将一一进行介绍。
减小码率
Biterate=file size / duration = 文件大小/时长比如一个视频尺寸是18.5Mb,视频时长是15s,则该视频的码率即为18.5Mb/15s=18.5x1024x1024x8/15=10358kbps比如上面这个视频的码率太高了,文件尺寸太大,想把视频文件减小一点又不想破坏分辨率,此时可以减小码率间接达到减小视频文件尺寸的目的。ffmpeg -i input.mp4 -b:v 2000k output.mp4-bufsize的作用主要是控制缓冲器的波动度,让视频整体码率更趋近于希望设定的值。ffmpeg -i test1.MOV -b:v 2000k -bufsize2000k test1_scale.mp4原视频大小为18.5Mb,压缩后视频大小为3.58Mb。
减小帧尺寸(宽度x高度)
如视频帧原始尺寸为1920x1080,现在把尺寸调整为960x540,也可以减小视频尺寸。
代码如下:
ffmpeg -i input.mp4 -vf scale=960:540output.mp4
示意代码:
ffmpeg -i test1.MOV -vf scale=960:540test_scale2.mp4
减小帧率
如原视频的帧率为30fps,可以根据自己的需求调整为25等。
代码如下:
ffmpeg -i input.mp4 -r 25 output.mp4
示意代码:
ffmpeg -i test1.MOV -r 25 test_scale3.mp4
由于是试验视频,对清晰度和分辨率等都有要求,因此我这里选择减小码率的方法。
现在我们已经掌握了处理一个视频的方法,下面来试一下批量处理的方法吧!
我们学习python的终极奥义就是解放双手,提高工作效率,因此优势就是批量处理相同的工作任务。举个例子:我桌面testvideo文件夹内有24个视频文件,现在想先把这24个文件重新命名为“试验过程1、2、3、4……”,然后进行压缩,把原视频码率调为2000kbps。压缩后的文件名以_c结尾,压缩过程中不改变文件格式(改变格式的方法更简单,直接改一下新生成文件的后缀名即可!)。压缩后的视频文件保存在桌面output文件夹内。
工作原理:读取每一个视频文件,调用ffmpeg进行压缩即可。
代码如下:
def filename_editor(file_path, newname_key1): filenames =os.listdir(file_path) print(filenames) # 显示文件夹内所有文件名称 for i inrange(len(filenames)): file_old =os.path.join(file_path "\\" filenames[i]) file_new =os.path.join(file_path "\\" newname_key1 str(i 1) "." filenames[i].rsplit('.', 1)[-1]) os.rename(file_old,file_new) print("Done!%s 转换成功!" %filenames[i]) print("-----------------------------")def video_scale(file_path, out_path, newname_key2): filenames =os.listdir(file_path) print(filenames) # 显示文件夹内所有文件名称 # 如果不存在out_path路径中的文件夹,新建一个 if notos.path.exists(out_path): for i inrange(len(filenames)): file_old =os.path.join(file_path "\\" filenames[i]) file_new =os.path.join(out_path "\\" filenames[i].rsplit('.', 1)[0] newname_key2 "." filenames[i].rsplit('.', 1)[-1]) ffmpeg_command =(r"C:\ffmpeg\bin\ffmpeg -i %s -b:v 2000k %s" % (file_old, file_new)) subprocess.call(ffmpeg_command)if __name__ == "__main__": file_path =r"C:\Users\Administrator\Desktop\testvideo" start_time = time.time() # 程序开始执行的时间 filename_editor(file_path,newname_key1) out_path =r"C:\Users\Administrator\Desktop\output" video_scale(file_path,out_path, newname_key2) print("转换耗时:%.2f 秒" % (time.time()- start_time))
如图:24个视频文件,仅需281.45秒即完成压缩工作。
链接:https://pan.baidu.com/s/1p7WFZW8qzD6bJyvyNP-mTQ提取码:1bhk【免责声明】本文经授权转自座椅检测知多少(ID:seattest),版权归原作者所有,仅用于学习!对文中观点判断均保持中立,若您认为文中来源标注与事实不符,若有涉及版权等请告知,将及时修订删除,谢谢大家的关注!
硕士
|
CAE仿真负责人
个人著作《汽车NVH一本通》
获赞 1132粉丝 5938文章 918课程 19