python视频转码脚本

2024-05-12 07:44
文章标签 python 视频 脚本 转码

本文主要是介绍python视频转码脚本,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

今天有一个临时的需求,就是需要将一个wmv的初步转码成mp4的格式。找了一圈,免费的工具少,即使有免费的工具,在功能上也是有所限制,或者会给你塞广告或者附带安装其它流氓小游戏或者杀毒程序。

我并非不支持正版,我本人不是专业的视频创作者,平日里对视频转码编辑的需求极少,为这临时需要而买个正常软件,一没必要,二不划算。

FFmpeg 是一个强大的开源视频工具包,通过命令行可以轻易的将一个 wmv 文件转码成需要的目标格式文件,例如转码成mp4

Python 也是个很好用的脚本语言。为可以快速的搜索视频文档,然后对其进行转码操作,使用Python写了一个简单的脚本,该脚本可以借助Everything的强大搜索功能,协助用户快速的搜索定位需要转码的文档,然后对其进行转码。

Python 脚本

Python脚本比较简单,逻辑也比较清晰。截图如下:

20240511141928

如👆上图所示,脚本首先定义了一个命令行入参的类,用于管理和解析命令行传入的参数。
然后定义了一个小的函数,这个函数并不是核心功能,仅用于对比两个指定的字符串中的差异。

在主程序中(if __name__ == '__main__'部分),脚本首先解析了来自命令行的参数;
然后定义了一个Everything搜索接口对象(该Everything搜索接口对象提供了基于Everything的搜索功能),用于协助用户快速的搜索定位兴趣文档。

在功能逻辑循环体中,首先引导用户搜索定位待转码的视频文档;然后与用户交互确定转码的目标格式;最后借助 moviepy这个Python包完成视频转码操作。

以上,脚本逻辑清晰自然,贴出Python代码如下👇。

# -*- coding:UTF-8 -*-
"""
@author: dyy
@contact: douyaoyuan@126.com
@time: 2024/5/10 21:40
@file: 视频转码.py
@desc: xxxxxx
"""# region 引入必要的依赖
import os模块名 = 'DebugInfo'
try:from DebugInfo.DebugInfo import *
except ImportError as impErr:print(f"尝试导入 {模块名} 依赖时检测到异常:{impErr}")print(f"尝试安装 {模块名} 模块:")try:os.system(f"pip install {模块名}")except OSError as osErr:print(f"尝试安装模块 {模块名} 时检测到异常:{osErr}")exit(0)else:try:from DebugInfo.DebugInfo import *except ImportError as impErr:print(f"再次尝试导入 {模块名} 依赖时检测到异常:{impErr}")exit(0)模块名 = 'difflib'
try:import difflib  # 需要安装 difflib 模块,以支持字符差异对比操作
except ImportError as impErr:print(f"尝试导入 {模块名} 依赖时检测到异常:{impErr}")print(f"尝试安装 {模块名} 模块:")try:os.system(f"pip install {模块名}")except OSError as osErr:print(f"尝试安装模块 {模块名} 时检测到异常:{osErr}")exit(0)else:try:import difflibexcept ImportError as impErr:print(f"再次尝试导入 {模块名} 依赖时检测到异常:{impErr}")exit(0)模块名 = 'moviepy'
try:from moviepy.editor import VideoFileClip  # 需要引入 moviepy 模块,以支持视频转码的操作
except ImportError as impErr:print(f"尝试导入 {模块名} 依赖时检测到异常:{impErr}")print(f"尝试安装 {模块名} 模块:")try:os.system(f"pip install {模块名}")except OSError as osErr:print(f"尝试安装模块 {模块名} 时检测到异常:{osErr}")exit(0)else:try:from moviepy.editor import VideoFileClipexcept ImportError as impErr:print(f"再次尝试导入 {模块名} 依赖时检测到异常:{impErr}")exit(0)
# endregion# 定义一个 命令行参数类,用于解析和记录命令行参数
class 命令行参数类(入参基类):def __init__(self):super().__init__()self._添加参数('搜索关键字', str, '指定文档搜索的关键字')self._添加参数('everything服务端口', str, 'everything HTTP 服务端口', '22')# region 访问器@propertydef jsonCfg(self) -> str:if 'jsonCfg' in self._参数字典:return self._参数字典['jsonCfg'].else:return ''@jsonCfg.setterdef jsonCfg(self,: str):if 'jsonCfg' in self._参数字典:self._参数字典['jsonCfg'].= str()@propertydef 搜索关键字(self) -> str:if '搜索关键字' in self._参数字典:return self._参数字典['搜索关键字'].else:return ''@搜索关键字.setterdef 搜索关键字(self,: str):if '搜索关键字' in self._参数字典:self._参数字典['搜索关键字'].= str()@propertydef everything服务端口(self) -> str:if 'everything服务端口' in self._参数字典:return self._参数字典['everything服务端口'].else:return ''@everything服务端口.setterdef everything服务端口(self,: str):if 'everything服务端口' in self._参数字典:self._参数字典['everything服务端口'].= str()# endregion# 标注两个字符串的差异项
def 差异标注(字串1: str, 字串2: str) -> tuple[str, str]:字串1 = str(字串1 if 字串1 else '').strip()字串2 = str(字串2 if 字串2 else '').strip()# region 原文档变动对齐# 使用SequenceMatcher()类计算两个字符串的相似度匹配器 = difflib.SequenceMatcher(None, 字串1, 字串2)差异 = 匹配器.get_opcodes()# 差异标注字串1差异标注: str = ''字串2差异标注: str = ''for opcode, i1, i2, j1, j2 in 差异:if opcode == 'equal':字串1差异标注 = 字串1差异标注 + 字串1[i1:i2]字串2差异标注 = 字串2差异标注 + 字串2[j1:j2]elif opcode == 'delete':字串1差异标注 = 字串1差异标注 + 红字(字串1[i1:i2])elif opcode == 'insert':字串2差异标注 = 字串2差异标注 + 绿字(字串2[j1:j2])elif opcode == 'replace':字串1差异标注 = 字串1差异标注 + 红字(字串1[i1:i2])字串2差异标注 = 字串2差异标注 + 绿字(字串2[j1:j2])return 字串1差异标注, 字串2差异标注if __name__ == '__main__':画板 = 打印模板(False)画板.执行位置(__file__)# region 解析入参入参 = 命令行参数类()入参.解析Json(画板=画板.副本.缩进())入参.解析入参(画板=画板.副本.缩进())if 画板.正在调试:入参.展示(画板=画板.副本.缩进())搜索关键字: str = 入参.搜索关键字 if 入参.搜索关键字 else ''# endregion# region 定义搜索接口本地搜索: 搜索接口类 = 搜索接口类()if 在nt系统中():if 入参.everything服务端口:本地搜索.everything服务端口 = int(入参.everything服务端口)else:画板.提示错误('入参.everything服务端口 参数无效')exit(1)# endregion# region 开始逻辑循环while True:def 文档排除规则(文档: str) -> bool:  # 排除一些不必要的干扰文档if not 文档:  # 空文档不要return Trueif '\\recent\\' in 文档.lower():  # recent 文档夹内的文档不要return Trueif 文档.lower().endswith('.lnk'):  # *.lnk 文档不要return True# region 引导用户选择需要转码的视频文档while True:原视频文档列表 = 交互接口类.指定选择文档(输入提示='请输入关键字以定位视频文档(0: 退出程序):',搜索接口=本地搜索,搜索关键字=搜索关键字,候选项上限=250,排除规则=文档排除规则,多选=True,画板=画板.副本.缩进())if '0' in 原视频文档列表:# 用户要求退出程序exit(0)if 原视频文档列表:画板.消息('您选择的文档列出如下:')for 文档 in 原视频文档列表:画板.消息(绿字(文档))break# endregion# region 目标格式信息交互目标视频文档列表: list[str] = []while True:目标格式后缀名: str = 交互接口类.发起文本交互(输入提示='请输入视频目标格式(0: 退出程序):',画板=画板.副本.缩进())if '0' == 目标格式后缀名:# 用户要求退出程序exit(0)if 目标格式后缀名.startswith('。'):目标格式后缀名 = f'.{目标格式后缀名[1:]}'if not 目标格式后缀名.startswith('.'):目标格式后缀名 = f'.{目标格式后缀名}'if not 目标格式后缀名.strip('.'):# 如果后缀名是空的,则重新要求输入continue# 后缀名统一转换成小写格式目标格式后缀名 = 目标格式后缀名.lower()# 合成目标文档名:for 文档 in 原视频文档列表:目标视频文档列表.append(f'{文档}{目标格式后缀名}')# 打的并提示用户确认转换方式画板.消息(黄字('即将启动的视频转码如下:'))画板.准备表格(对齐控制串='rl')for 序号 in range(len(原视频文档列表)):原文档,目标文档 = 差异标注(原视频文档列表[序号],目标视频文档列表[序号])画板.添加一行(原文档,洋红字('->'),目标文档)画板.展示表格(列间距=[0,0])转码确认: str = 交互接口类.发起文本交互(输入提示='是否确认转码?(y: 确认; n: 修改目标格式; 0: 退出程序)',限定范围='YyNn0',画板=画板.副本.缩进())if '0' == 转码确认:# 用户要求退出exit(0)elif 'y' == 转码确认.lower():# 用户确认转码break# endregion# region 开始视频转码编解码格式: str = ''for 序号 in range(len(原视频文档列表)):视频切片 = VideoFileClip(原视频文档列表[序号])while True:if not 编解码格式:编解码格式 = 交互接口类.发起文本交互(输入提示=f'默认 codec 参数是 libx264, 输入 {绿字("y")} 以确认; 'f'或者您可以输入其它编码格式({红字("0")}: {红字("退出程序")}):',画板=画板.副本.缩进())if '0' == 编解码格式:# 用户要求退出程序exit(0)编解码格式 = 编解码格式.lower()if 'y' == 编解码格式:# 用户确认使用 libx264 作为 codec 参数编解码格式 = 'libx264'try:if 目标格式后缀名.endswith('gif'):视频切片.write_gif(filename=目标视频文档列表[序号])elif 编解码格式:视频切片.write_videofile(filename=目标视频文档列表[序号], codec=编解码格式)else:视频切片.write_videofile(filename=目标视频文档列表[序号])except Exception as exp:画板.提示错误('视频转码遇到异常如下:')画板.消息(exp.__str__())# 清除 codec 参数,重新发起交互编解码格式 = ''continueelse:# 如果转码顺利完成,则关闭 视频切片,开始下一段视频的处理视频切片.close()break# endregion# endregion

使用演示

👉第一步,脚本首先引导用户搜索和定位视频文件,我们可以输入视频文件名信息以定位视频文档,然后参过序号选择目标文档;如下👇:
20240511144403

👉第二步,脚本询问我们需要将视频文档转换为什么样的目标格式,我们输入目标文档的后缀名,然后再一次确认脚本的问询;如下👇:
20240511144652
在这一步中,如果我们输入了错误的目标格式,我们还可以输入 n 来重新修改目标格式。

👉第三步,脚本会询问我们是否使用默认的 codec 参数(默认为libx264)进行视频转码,如果我们希望使用其它 codec 参数,例如 png,或者libvorbis 等,我们也可以直接输入 codec 值来告诉脚本;如下👇:
Snipaste_2024-05-11_14-51-48
Snipaste_2024-05-11_14-51-52
以上👆脚本交互完成后,脚本即开始了视频转码过程,我们耐心等待转码完成即可,如下👇:
20240511145705

懒人包

以上Python脚本的功能比较简单,对于视频转码的参数控制较少,但如果大家有需要,可以轻易的加入更多的转码参数控制功能。

以上 Python脚本,对应的bat调用脚本,和对应的cfg参数文档,统一进行了打包,见:Python 视频转码脚本。

这篇关于python视频转码脚本的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/982017

相关文章

流媒体平台/视频监控/安防视频汇聚EasyCVR播放暂停后视频画面黑屏是什么原因?

视频智能分析/视频监控/安防监控综合管理系统EasyCVR视频汇聚融合平台,是TSINGSEE青犀视频垂直深耕音视频流媒体技术、AI智能技术领域的杰出成果。该平台以其强大的视频处理、汇聚与融合能力,在构建全栈视频监控系统中展现出了独特的优势。视频监控管理系统EasyCVR平台内置了强大的视频解码、转码、压缩等技术,能够处理多种视频流格式,并以多种格式(RTMP、RTSP、HTTP-FLV、WebS

python: 多模块(.py)中全局变量的导入

文章目录 global关键字可变类型和不可变类型数据的内存地址单模块(单个py文件)的全局变量示例总结 多模块(多个py文件)的全局变量from x import x导入全局变量示例 import x导入全局变量示例 总结 global关键字 global 的作用范围是模块(.py)级别: 当你在一个模块(文件)中使用 global 声明变量时,这个变量只在该模块的全局命名空

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

nudepy,一个有趣的 Python 库!

更多资料获取 📚 个人网站:ipengtao.com 大家好,今天为大家分享一个有趣的 Python 库 - nudepy。 Github地址:https://github.com/hhatto/nude.py 在图像处理和计算机视觉应用中,检测图像中的不适当内容(例如裸露图像)是一个重要的任务。nudepy 是一个基于 Python 的库,专门用于检测图像中的不适当内容。该

Linux服务器Java启动脚本

Linux服务器Java启动脚本 1、初版2、优化版本3、常用脚本仓库 本文章介绍了如何在Linux服务器上执行Java并启动jar包, 通常我们会使用nohup直接启动,但是还是需要手动停止然后再次启动, 那如何更优雅的在服务器上启动jar包呢,让我们一起探讨一下吧。 1、初版 第一个版本是常用的做法,直接使用nohup后台启动jar包, 并将日志输出到当前文件夹n

pip-tools:打造可重复、可控的 Python 开发环境,解决依赖关系,让代码更稳定

在 Python 开发中,管理依赖关系是一项繁琐且容易出错的任务。手动更新依赖版本、处理冲突、确保一致性等等,都可能让开发者感到头疼。而 pip-tools 为开发者提供了一套稳定可靠的解决方案。 什么是 pip-tools? pip-tools 是一组命令行工具,旨在简化 Python 依赖关系的管理,确保项目环境的稳定性和可重复性。它主要包含两个核心工具:pip-compile 和 pip

HTML提交表单给python

python 代码 from flask import Flask, request, render_template, redirect, url_forapp = Flask(__name__)@app.route('/')def form():# 渲染表单页面return render_template('./index.html')@app.route('/submit_form',