【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))
相关推荐
StayInLove1 分钟前
G1垃圾回收器日志详解
java·开发语言
无尽的大道9 分钟前
Java字符串深度解析:String的实现、常量池与性能优化
java·开发语言·性能优化
爱吃生蚝的于勒12 分钟前
深入学习指针(5)!!!!!!!!!!!!!!!
c语言·开发语言·数据结构·学习·计算机网络·算法
撞南墙者19 分钟前
OpenCV自学系列(1)——简介和GUI特征操作
人工智能·opencv·计算机视觉
binishuaio22 分钟前
Java 第11天 (git版本控制器基础用法)
java·开发语言·git
zz.YE24 分钟前
【Java SE】StringBuffer
java·开发语言
就是有点傻28 分钟前
WPF中的依赖属性
开发语言·wpf
洋24036 分钟前
C语言常用标准库函数
c语言·开发语言
进击的六角龙38 分钟前
Python中处理Excel的基本概念(如工作簿、工作表等)
开发语言·python·excel
wrx繁星点点39 分钟前
状态模式(State Pattern)详解
java·开发语言·ui·设计模式·状态模式