《自拍教程66》Python ffmpeg批量压缩视频,


案例故事: 测试过程中发现Bug视频, 需要提供给开发用于解Bug的参考,
但是视频拍摄后,太大且无法在微信客户端传输的问题,
于是乎出现过测试人员通过winzip分批压缩(part1, part2, part3),
再通过微信传输视频压缩包的"乱象":

作为测试总监,手底下的人这么"压缩视频“我是觉得丢人的,
(1).视频文件已经是二进制文件了,其实winzip已经压缩不了什么,
winzip压缩软件一般只适合压缩文本数据文件。
(2).视频压缩应该使用Video的编码技术实现二次编码压缩,业界最常用的肯定是ffmpeg.exe工具。


还有比如当碰到一个Bug的视频太大了,无法作为附件上传到Bug系统,
会做视频压缩是合格的测试人员的必备能力之一,
本篇主要介绍如何通过ffmpeg 来实现批量压缩视频。


视频的基本知识点
准备阶段
	+---Input_Video    #批量放入待压缩的视频
	|       1.mp4
	|       2.mp4
	|       
	+---Output_Video   #批量输出已压缩的视频, 加一个后缀_c,代表以及转换完。
	|       1_c.mp4
	|       2_c.mp4
	|
	\convert_video.py  #Python视频转码脚本,双击运行即可
  1. 记得将ffmpeg.exe 丢到系统Path环境变量路径下去。

Python批处理脚本形式

记住批处理脚本的精髓:批量顺序执行语句

# coding=utf-8

import os

NEW_RESOLUTION = "640x480"  # 目标分辨率,常量
NEW_FPS = 12  # 目标帧率,常量

curpath = os.getcwd()  # 获取当前路径
input_dir = os.path.join(curpath, "Input_Video")
output_dir = os.path.join(curpath, "Output_Video")
input_video_list = os.listdir(input_dir)  # 获取视频列表

# 如果没有Output_Video这个文件夹,则创建这个文件夹
if not os.path.exists(output_dir):
    os.mkdir(output_dir)

# 开始批量二次编码压缩视频转码
for each_video in input_video_list:
    video_name, _ = os.path.splitext(each_video)  # _是没意义,就只是一个无用代号,占个坑而已
    ffmpeg_command = ("ffmpeg -i %s%s%s -s %s -r %s -y %s%s%s_c.mp4" % (
        input_dir, os.sep, each_video, NEW_RESOLUTION, NEW_FPS, output_dir, os.sep, video_name))
    print(ffmpeg_command)
    os.system(ffmpeg_command)

os.system("pause")

Python面向过程函数形式

面向过程函数的编程思维应该是这样的:
你需要多少个功能(函数),才能做成这个事。
最好把功能(函数)都尽量封装好,只暴露一些的参数接口即可。

# coding=utf-8

import os


def convert_video(input_video_path, new_resolution, new_fps, output_video_path):
    ffmpeg_command = ("ffmpeg -i %s -s %s -r %s -y %s" % (
        input_video_path, new_resolution, new_fps, output_video_path))
    print(ffmpeg_command)
    os.system(ffmpeg_command)


curpath = os.getcwd()  # 获取当前路径
input_dir = os.path.join(curpath, "Input_Video")
output_dir = os.path.join(curpath, "Output_Video")
input_video_list = os.listdir(input_dir)  # 获取视频列表

# 如果没有Output_Video这个文件夹,则创建这个文件夹
if not os.path.exists(output_dir):
    os.mkdir(output_dir)

# 开始批量二次编码压缩视频转码
for each_video in input_video_list:
    video_name, _ = os.path.splitext(each_video)  # _是没意义,就只是一个无用代号,占个坑而已
    input_video_path = input_dir + os.sep + each_video
    output_video_path = output_dir + os.sep + video_name + "_c.mp4"
    convert_video(input_video_path, "640x480", "12", output_video_path)
os.system("pause")

Python面向对象类形式

面向对象类的编程思维应该是这样的:
如果给你一个空白的世界,在这个世界里你需要哪些种类的事物,
这些种类的事物都具备哪些共有的属性与方法,
这些种类(类)的事物(对象),和其他种类(其他类)的事物(其他对象)有什么关系。
尽量把这些类封装好,只暴露对外的属性(变量)和方法(函数)即可。

# coding=utf-8

import os


class VideoConverter(object):
    def __init__(self, input_video_path, new_resolution, new_fps, output_video_path):
        self.input_video_path = input_video_path
        self.new_resolution = new_resolution
        self.new_fps = new_fps
        self.output_video_path = output_video_path

    def convert_video(self):
        ffmpeg_command = ("ffmpeg -i %s -s %s -r %s -y %s" % (
            self.input_video_path, self.new_resolution, self.new_fps, self.output_video_path))
        print(ffmpeg_command)
        os.system(ffmpeg_command)


if __name__ == '__main__':
    curpath = os.getcwd()  # 获取当前路径
    input_dir = os.path.join(curpath, "Input_Video")
    output_dir = os.path.join(curpath, "Output_Video")
    input_video_list = os.listdir(input_dir)  # 获取视频列表

    # 如果没有Output_Video这个文件夹,则创建这个文件夹
    if not os.path.exists(output_dir):
        os.mkdir(output_dir)

    # 开始批量二次编码压缩视频转码
    for each_video in input_video_list:
        video_name, _ = os.path.splitext(each_video)  # _是没意义,就只是一个无用代号,占个坑而已
        input_video_path = input_dir + os.sep + each_video
        output_video_path = output_dir + os.sep + video_name + "_c.mp4"
        v_obj = VideoConverter(input_video_path, "640x480", "12", output_video_path)
        v_obj.convert_video()
    os.system("pause")

本案例素材下载

包括:Input_Video(含一个H.264_1280x720_24fps.mp4视频),Python脚本
跳转至官网下载
武散人出品,请放心下载!

小提示以上3种形式,只是为了训练培养编程思维,其实主要的核心代码就是ffmpeg命令那么一条,
如果不涉及批量处理,直接敲ffmpeg原始命令即可实现转码,
以上基本可以实现将100M的视频压缩到10M左右。


更多更好的原创文章,请访问官方网站:www.zipython.com
自拍教程(自动化测试Python教程,武散人编著)
原文链接:https://www.zipython.com/#/detail?id=52f5f5ed29a14614bc522754af3b7b4e
也可关注“武散人”微信订阅号,随时接受文章推送。

相关内容

    暂无相关文章

评论关闭