首页/文章/ 详情

python ffmpeg批量修改文件名,压缩视频体积

3年前浏览2713
咱们做试验时,常会产生“巨量”的图片和视频,这些原始资料非常重要,而且不能随意删除。随着时间流逝,积累的文件将会越来越多,而且查找起来也不太方便。


拥有良好工作习惯的工程师,一定会有随时整理文件的意识和能力。但是繁忙的工作极大的挤压了工程师的休息时间,为了提高工作效率,不得不使用一些工具。
python是一个非常好用的工具,非常值得去学习和掌握!我个人大概花了1个月的时间就入门了,剩下的就是在使用的过程中逐渐提高技能。


下面看看有没有你感兴趣的功能吧!

 





批量修改文件名






无论是照片、图片、视频、word、ppt、excel、txt等文件都可以通过几行代码达到批量修改文件名的目的。
下面就以若干张图片名称的修改为例说明吧!
如图所示,在我桌面input文件夹中有33张图片,图片的命名是混乱的。这时候如果我一张张去重命名图片将会是一个很大的工作量。若是使用python,情况将变得非常简单。


图片

                           


工作原理:工作原理非常简单,就是从文件夹中一张张的读入图片,然后把每张图片重新命名保存即可,文件的保存时不修改文件格式。
举例:将上述图片重命名为小三轮1.png、小三轮2.png、小三轮3.png、小三轮4.png……,重命名的文件保存到同一个文件夹内。
示意代码:
import os
 
 
# 批量修改文件夹内的文件名
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"
    newname_key = "小三轮"
    filename_editor(file_path, newname_key)
 
唰的一下,33张图片已经重命名完成!本来想做个动画的,无奈程序执行时间太短了!各位亲自动手试试吧,非常好用!


图片

 


后来,我还是做了一个动画,用了1758张图片,批量修改完成耗时3s,还是很快的。


图片


图片

 





ffmpeg压缩单个视频体积






随着科学技术的发展,手机像素越来越高,拍出来的照片和视频的清晰度也越来越高,问题也随着而来了。以现在常用的手机为例,录一个10min的视频尺寸达到1Gb,这无论是对于数据交互还是储存都是不太友好的。
有时候我们并不需要视频拥有那么高的清晰度,有时我们希望在保存清晰度的情况下尽量减小视频的体积。
比如每完成一个试验项目,都会相应的产生一段视频文件,累积起来一个完整的座椅测试项目可能要产生100Gb的视频文件。若不进行压缩,我们计算机的硬盘将不堪重负。由于视频文件也是二进制文件,使用常规的压缩工具(360压缩、好压、ZIP等)基本没有什么压缩效果(不信?可以自己动手试试看!)。


 

如果想要压缩单个视频文件的体积,看下面的方法就够了!

 


视频文件是由视频流、音频流组成的将一系列图片快速播放产生的动态图像、音频的聚合体,通常视频文件中音频流很小。视频流大小主要取决于编码技术、分辨率、帧率这三个因素。


视频压缩的方法通常有减小码率、减小帧尺寸(宽度x高度)、减小帧率等,下面将一一进行介绍。

减小码率


什么是码率(biterate)?
Biterate=file size / duration = 文件大小/时长
比如一个视频尺寸是18.5Mb,视频时长是15s,则该视频的码率即为18.5Mb/15s=18.5x1024x1024x8/15=10358kbps
比如上面这个视频的码率太高了,文件尺寸太大,想把视频文件减小一点又不想破坏分辨率,此时可以减小码率间接达到减小视频文件尺寸的目的。
比如把原视频码率调为2000kbps,代码如下:
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 ffmpeg批量压缩视频体积







我们学习python的终极奥义就是解放双手,提高工作效率,因此优势就是批量处理相同的工作任务。
举个例子:我桌面testvideo文件夹内有24个视频文件,现在想先把这24个文件重新命名为“试验过程1、2、3、4……”,然后进行压缩,把原视频码率调为2000kbps。
压缩后的文件名以_c结尾,压缩过程中不改变文件格式(改变格式的方法更简单,直接改一下新生成文件的后缀名即可!)。压缩后的视频文件保存在桌面output文件夹内。
原始视频文件如下图所示:


图片

工作原理:读取每一个视频文件,调用ffmpeg进行压缩即可。

代码如下:


import subprocess
import os
import time
 
 
# 批量修改文件夹内的文件名
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):
        os.mkdir(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的命令
        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"
    newname_key1 = "试验过程"
    start_time = time.time()  # 程序开始执行的时间
    # 执行文件重命名函数
    filename_editor(file_path,newname_key1)
    newname_key2 = "_c"
    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),版权归原作者所有,仅用于学习!对文中观点判断均保持中立,若您认为文中来源标注与事实不符,若有涉及版权等请告知,将及时修订删除,谢谢大家的关注!



汽车新能源静力学结构基础
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2021-07-16
最近编辑:3年前
CAE之家
硕士 | CAE仿真负责人 个人著作《汽车NVH一本通》
获赞 1132粉丝 5903文章 917课程 19
点赞
收藏
作者推荐
未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习 福利任务 兑换礼品
下载APP
联系我们
帮助与反馈