当前位置: 首页 > news >正文

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

一、功能介绍

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

analyze_video 函数

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

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

compress_video 函数

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

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

主程序块

这部分代码负责:

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

总结

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

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

二、代码

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))

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • C语言家教记录(六)
  • 【Qt】QWidget的toolTip属性
  • 函数递归那些事
  • MySQL基础练习题47-判断三角形
  • haproxy实验-2
  • Asciidoc 转化为 CSDN 帖子,完美数学公式
  • Ubuntu20.04 运行深蓝路径规划hw1
  • 微软披露Office最新零日漏洞,可能导致数据泄露
  • C语言相关
  • python从入门到精通:基础语法讲解
  • C++:std::pair的定义及用法
  • Python基础知识学习总结(一)
  • 设计模式---简单工厂模式
  • Bazaar v1.4.3 任意文件读取漏洞复现(CVE-2024-40348)
  • 【C++ 面试 - 基础题】每日 3 题(十五)
  • [分享]iOS开发 - 实现UITableView Plain SectionView和table不停留一起滑动
  • 【面试系列】之二:关于js原型
  • 【跃迁之路】【699天】程序员高效学习方法论探索系列(实验阶段456-2019.1.19)...
  • Bytom交易说明(账户管理模式)
  • E-HPC支持多队列管理和自动伸缩
  • github指令
  • JAVA SE 6 GC调优笔记
  • JavaScript实现分页效果
  • Material Design
  • node.js
  • sessionStorage和localStorage
  • vue-loader 源码解析系列之 selector
  • 从零开始在ubuntu上搭建node开发环境
  • 搭建gitbook 和 访问权限认证
  • 构建工具 - 收藏集 - 掘金
  • 汉诺塔算法
  • 基于组件的设计工作流与界面抽象
  • 名企6年Java程序员的工作总结,写给在迷茫中的你!
  • 移动端 h5开发相关内容总结(三)
  • 用Visual Studio开发以太坊智能合约
  • 运行时添加log4j2的appender
  • 通过调用文摘列表API获取文摘
  • ​MySQL主从复制一致性检测
  • (01)ORB-SLAM2源码无死角解析-(56) 闭环线程→计算Sim3:理论推导(1)求解s,t
  • (AtCoder Beginner Contest 340) -- F - S = 1 -- 题解
  • (LNMP) How To Install Linux, nginx, MySQL, PHP
  • (板子)A* astar算法,AcWing第k短路+八数码 带注释
  • (不用互三)AI绘画工具应该如何选择
  • (附源码)spring boot智能服药提醒app 毕业设计 102151
  • (解决办法)ASP.NET导出Excel,打开时提示“您尝试打开文件'XXX.xls'的格式与文件扩展名指定文件不一致
  • (一)插入排序
  • (一一四)第九章编程练习
  • (译)2019年前端性能优化清单 — 下篇
  • .halo勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET Core SkiaSharp 替代 System.Drawing.Common 的一些用法
  • .NET Core实战项目之CMS 第十二章 开发篇-Dapper封装CURD及仓储代码生成器实现
  • .NET 使用 ILRepack 合并多个程序集(替代 ILMerge),避免引入额外的依赖
  • .NET 使用 JustAssembly 比较两个不同版本程序集的 API 变化
  • .NET中的Exception处理(C#)
  • @德人合科技——天锐绿盾 | 图纸加密软件有哪些功能呢?