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

server/2024/9/22 21:04:31/

一、功能介绍

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

analyze_video 函数

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

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

compress_video 函数

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

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

主程序块

这部分代码负责:

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

总结

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

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

二、代码

python">import cv2
import os
from tqdm import tqdmdef 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)  # 文件大小,单位MBcap.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_sizedef 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_rateif 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)  # 输出视频文件大小,单位MBprint(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))


http://www.ppmy.cn/server/101187.html

相关文章

vue3动态引入图片不显示问题

方法1.(打包后动态引用的图片未被打包入工程中,webpack,vite) 1.图片放到public 目录会更省事,不管是开发环境还是生产环境,可以始终以根目录保持图片路径的一致. 假设: 静态文件目录:src/assets/images/ 我们的目标静态文件在 …

LeetCode 热题100-4

移动零 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 请注意 ,必须在不复制数组的情况下原地对数组进行操作。 示例 1: 输入: nums [0,1,0,3,12] 输出: [1,3,12,0,0] 示例 2: 输入: nums …

云计算的三大服务模式:IaaS、PaaS、SaaS的深入解析

在数字化转型的浪潮中,云计算以其独特的灵活性、可扩展性和成本效益,正逐渐成为企业IT架构的核心。云计算提供了三种主要的服务模式,分别是基础设施即服务(IaaS)、平台即服务(PaaS)和软件即服务…

【模型】VotingRegressor

VotingRegressor 是一个集成学习模型,属于 Scikit-learn 库中提供的集成方法之一。它的主要思想是通过结合多个基于不同算法的回归模型来提高预测性能。这些基础模型各自做出预测,然后VotingRegressor会对它们的输出进行加权平均(或直接平均&…

android13 禁用wifi

总纲 android13 rom 开发总纲说明 目录 1.前言 2.情况分析 3.代码分析 3.1 代码位置1 3.2 代码位置2 3.3 代码位置3 4.代码修改 5. 彩蛋 1.前言 这个文章讲的是,在frameworks里面禁止打开wifi。 2.情况分析 我们打开wifi一般是 public static void turnOnWifi(Co…

算法日记day 39(动归之打家劫舍)

一、打家劫舍1 题目: 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。…

【抓包】- Fiddler抓包教程,使用Fiddle抓取B站视频;ffmpeg的使用方法

一、预准备:过滤器设置 打开fiddler后,清空内容,然后播放视频。 找到与B站视频资源相关的回应,而后在“原始(raw)”标签中查看它的host信息。 发现B站视频资源的服务器DNS地址为【*bilivideo.cn】、【*bi…

C语言提高(1)

在C语言中,_CRT_SECURE_NO_WARNINGS 是一个宏定义,它通常与Microsoft Visual Studio(MSVC)编译器一起使用,用于禁用一些与安全相关的警告。这些警告通常与C标准库中的某些函数的安全性问题相关,特别是在处理…