【Python快速入门和实践019】Python常用脚本-查看视频信息并压缩视频

一、功能介绍

这段代码用于查看视频帧率,帧数以及大小,并且是否需要按照设定参数压缩原始视频。主要定义了两个主要函数:analyze_videocompress_video,以及一个主程序块来调用这些函数。下面是对这段代码功能的详细分析:

analyze_video 函数

此函数用于分析给定视频的基本属性,并打印出这些信息。

功能描述
  • 打开视频文件。
  • 从视频中提取关键属性,包括:
    • 帧数 (frame_count)。
    • 帧率 (frame_rate)。
    • 分辨率 (width, height)。
    • 视频文件的大小 (video_size),单位为兆字节(MB)。
  • 打印视频信息。
  • 返回提取的属性值。

compress_video 函数

此函数用于根据指定的参数压缩视频,并将压缩后的视频保存到一个新的文件中。

功能描述
  • 打开视频文件。
  • 获取原始视频的帧率和分辨率。
  • 根据用户输入或默认值设置新的帧率和分辨率。
  • 初始化视频写入器。
  • 逐帧读取视频,按需调整大小,并写入新的视频文件。
  • 释放资源。
  • 计算并打印压缩后视频的大小。

主程序块

这部分代码负责:

  • 调用 analyze_video 函数来显示视频的信息。
  • 提供用户界面,询问用户是否需要压缩视频。
  • 如果用户选择压缩视频,则收集压缩参数并通过 compress_video 函数执行压缩操作。

总结

这段代码实现了以下功能:

  1. 视频分析:读取视频文件并提取关键属性。
  2. 视频压缩:根据用户指定的新帧率和分辨率对视频进行压缩,并将结果保存到新文件中。
  3. 用户交互:通过命令行界面与用户交互,允许用户决定是否进行视频压缩,并指定压缩参数。

二、代码

python 复制代码
import cv2
import os
from tqdm import tqdm


def analyze_video(video_path):
    # 打开视频文件
    cap = cv2.VideoCapture(video_path)

    # 获取视频属性
    frame_count = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
    frame_rate = cap.get(cv2.CAP_PROP_FPS)
    width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
    height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
    video_size = os.path.getsize(video_path) / (1024 * 1024)  # 文件大小,单位MB

    cap.release()

    print(f"视频信息:\n"
          f"帧数: {frame_count}\n"
          f"帧率: {frame_rate} FPS\n"
          f"分辨率: {width} x {height}\n"
          f"大小: {video_size:.2f} MB")

    return frame_count, frame_rate, (width, height), video_size


def compress_video(input_video, output_video, frame_rate=None, resolution=None, codec='XVID'):
    # 打开视频文件
    cap = cv2.VideoCapture(input_video)

    # 获取原始视频信息
    original_frame_rate = cap.get(cv2.CAP_PROP_FPS)
    original_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
    original_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))

    # 如果没有指定帧率或分辨率,则使用原始视频参数
    if frame_rate is None:
        frame_rate = original_frame_rate
    if resolution is None:
        resolution = (original_width, original_height)

    width, height = resolution

    # 初始化视频写入器
    fourcc = cv2.VideoWriter_fourcc(*codec)
    out = cv2.VideoWriter(output_video, fourcc, frame_rate, (width, height))

    # 压缩视频并保存
    total_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
    for _ in tqdm(range(total_frames), desc="Compressing video"):
        ret, frame = cap.read()
        if not ret:
            break

        # 调整大小
        resized_frame = cv2.resize(frame, (width, height))
        out.write(resized_frame)

    cap.release()
    out.release()

    output_size = os.path.getsize(output_video) / (1024 * 1024)  # 输出视频文件大小,单位MB
    print(f"压缩后的视频已保存到 {output_video},大小: {output_size:.2f} MB")


if __name__ == "__main__":
    # 分析视频
    video_path = "demo.mp4"
    frame_count, frame_rate, resolution, video_size = analyze_video(video_path)

    # 询问用户是否需要压缩视频
    compress = input("是否要压缩视频?(y/n): ").strip().lower()

    if compress == 'y':
        # 设置压缩参数
        new_frame_rate = float(input(f"设置新帧率 (当前: {frame_rate} FPS, 按Enter跳过): ") or frame_rate)
        width = int(input(f"设置新宽度 (当前: {resolution[0]}, 按Enter跳过): ") or resolution[0])
        height = int(input(f"设置新高度 (当前: {resolution[1]}, 按Enter跳过): ") or resolution[1])

        output_video = "compressed_video.mp4"
        compress_video(video_path, output_video, frame_rate=new_frame_rate, resolution=(width, height))
相关推荐
小陈的进阶之路1 分钟前
Selenium 滑动 vs Appium 滑动
python·selenium·测试工具·appium
Mike_6666 分钟前
txt_json和xml_json
xml·python·json
si莉亚7 分钟前
ROS2安装EVO工具包
linux·开发语言·c++·开源
清心歌14 分钟前
CopyOnWriteArrayList 实现原理
java·开发语言
zyq99101_120 分钟前
DFS算法实战:经典例题代码解析
python·算法·蓝桥杯·深度优先
数据知道21 分钟前
claw-code 源码分析:从 TypeScript 心智到 Python/Rust——跨栈移植时类型、边界与错误模型怎么对齐?
python·ai·rust·typescript·claude code·claw code
良木生香38 分钟前
【C++初阶】C++入门相关知识(2):输入输出 & 缺省参数 & 函数重载
开发语言·c++
忘梓.39 分钟前
墨色规则与血色节点:C++红黑树设计与实现探秘
java·开发语言·c++
hhh3u3u3u40 分钟前
Visual C++ 6.0中文版安装包下载教程及win11安装教程
java·c语言·开发语言·c++·python·c#·vc-1
星河耀银海42 分钟前
C++ 模板进阶:特化、萃取与可变参数模板
java·开发语言·c++