Python – 使用ffmepg批量转换某个文件夹以及所有子文件夹下所有的视频,修改其帧率/码率/分辨率到另一文件夹,并保留原有文件夹结构
1 环境要求
需要在电脑上安装ffmpeg并配置好相应的系统环境变量。
2 使用python调用ffmpeg命令
最近在工作中需要将一个文件夹以及其所有子文件夹下所有的视频都修改其码率和分辨率,并保持原有的目录结构,并显示转换进度,这种东西用python来写再合适不过了。
可以参考以下代码:
# -*- coding: UTF-8 –*-
import os
import subprocess
import datetime
from enum import Enum
from tqdm import tqdm
# 对视频操作的枚举
class FFmpegOperatorEnum(Enum):
Modify_Video_Resolution = 0
Modify_Video_BitRate = 1
Modify_Video_FrameRate = 2
class FFmpegBatchConversionVideo:
m_TotalConversionFiles = 0
m_TotalFiles = 0
m_SupportVideoFormat = ['.mp4','.avi']
m_FFmpegOperatorEnum = None
m_Video_Resolution = ''
m_Video_BitRate = ''
m_Video_FrameRate = ''
def __init__(self,videoformat = ['.mp4','.avi'],ffmpegOperatorEnum = FFmpegOperatorEnum.Modify_Video_Resolution):
self.m_SupportVideoFormat = videoformat
self.m_FFmpegOperatorEnum = ffmpegOperatorEnum
pass
def ConvertBatchVideos(self,inputPath,outputPath):
if not os.path.isdir(outputPath):
os.mkdir(outputPath)
#for files in os.listdir(inputPath):
for files in tqdm(os.listdir(inputPath)): #增加tqdm进度条
input_name = os.path.join(inputPath,files)
output_name = os.path.join(outputPath,files)
# 如果输入路径为文件
if os.path.isfile(input_name):
dirPath = (os.path.abspath(os.path.dirname(output_name)))
# 如果不存在输出文件夹则创建该文件夹
if not os.path.isdir(dirPath):
os.mkdir(dirPath)
# 判断输入视频的后缀名是否在支持的列表之中
#if os.path.split(input_name)[-1].lower() in self.m_SupportVideoFormat:
if input_name.split('.')[1].lower() in self.m_SupportVideoFormat:
# 修改视频分辨率
if self.m_FFmpegOperatorEnum == FFmpegOperatorEnum.Modify_Video_Resolution:
self.ModifyVideoResolution(input_name,output_name)
# 修改视频码率
elif self.m_FFmpegOperatorEnum == FFmpegOperatorEnum.Modify_Video_BitRate:
self.ModifyVideoBitRate(input_name,output_name)
# 修改视频帧率
elif self.m_FFmpegOperatorEnum == FFmpegOperatorEnum.Modify_Video_FrameRate:
self.ModifyVideoFrameRate(input_name,output_name)
else:
pass
self.m_TotalFiles += 1
# 如果输入路径为文件夹
else:
# 如果输出文件夹不存在则创建文件夹
if not os.path.isdir(output_name):
os.mkdir(output_name)
# 递归
self.ConvertBatchVideos(input_name,output_name)
def ModifyVideoResolution(self,videoin,videoout):
t_ffmpegcmdline = 'ffmpeg -i "{}" -vf scale={} -threads 4 "{}" -hide_banner'.format(videoin,self.m_Video_Resolution ,videoout)
returncode = subprocess.call(t_ffmpegcmdline)
self.m_TotalConversionFiles += 1
def ModifyVideoBitRate(self,videoin,videoout):
t_ffmpegcmdline = 'ffmpeg -i "{}" -b:v {} -threads 4 "{}" -hide_banner'.format(videoin, self.m_Video_BitRate ,videoout)
returncode = subprocess.call(t_ffmpegcmdline)
self.m_TotalConversionFiles += 1
def ModifyVideoFrameRate(self,videoin,videoout):
t_ffmpegcmdline = 'ffmpeg -r {} -i "{}" -threads 4 "{}" -hide_banner'.format(self.m_Video_FrameRate,videoin, videoout)
returncode = subprocess.call(t_ffmpegcmdline)
self.m_TotalConversionFiles += 1
if __name__ == '__main__':
inputDir = r'H:\ceshi\input'
outputDir = r'H:\ceshi\output'
# 记录转换总时间
opeartion_start_time = datetime.datetime.now()
# 批量修改视频帧率
# ffmpegBatchConversionVideo = FFmpegBatchConversionVideo(['mp4','avi'],ffmpegOperatorEnum=FFmpegOperatorEnum.Modify_Video_FrameRate)
# ffmpegBatchConversionVideo.m_Video_FrameRate = '60'
# ffmpegBatchConversionVideo.ConvertBatchVideos(inputDir,outputDir)
# 批量修改视频码率
# ffmpegBatchConversionVideo = FFmpegBatchConversionVideo(['mp4','avi'],ffmpegOperatorEnum=FFmpegOperatorEnum.Modify_Video_BitRate)
# ffmpegBatchConversionVideo.m_Video_BitRate = '10000k'
# ffmpegBatchConversionVideo.ConvertBatchVideos(inputDir,outputDir)
# 批量修改视频分辨率
ffmpegBatchConversionVideo = FFmpegBatchConversionVideo(['mp4','avi'],ffmpegOperatorEnum=FFmpegOperatorEnum.Modify_Video_Resolution)
ffmpegBatchConversionVideo.m_Video_Resolution = '64:64'
ffmpegBatchConversionVideo.ConvertBatchVideos(inputDir,outputDir)
opeartion_end_time = datetime.datetime.now()
opeartion_duration = opeartion_end_time - opeartion_start_time
print('转换完成,共有视频文件{}个,转换视频文件{}个,共耗时{}'.format(ffmpegBatchConversionVideo.m_TotalFiles,ffmpegBatchConversionVideo.m_TotalConversionFiles,opeartion_duration))
这个脚本算是批量转换的一个原型,可以通过扩展其他的ffmpeg命令批量处理某个文件夹下的所有视频。
本文作者:StubbornHuang
版权声明:本文为站长原创文章,如果转载请注明原文链接!
原文标题:Python – 使用ffmepg批量转换某个文件夹以及所有子文件夹下所有的视频,修改其帧率/码率/分辨率到另一文件夹,并保留原有文件夹结构
原文链接:https://www.stubbornhuang.com/1192/
发布于:2021年03月10日 14:07:49
修改于:2023年06月26日 21:49:50
当前分类随机文章推荐
- OpenCV/FFmpeg - 使用FFmpeg编码OpenCV中的BGR视频流为H264视频流以及解码H264视频流为OpenCV中的BGR视频流 阅读1683次,点赞1次
- FFmpge - Ubuntu编译FFmpeg出现WARNING: pkg-config not found, library detection may fail警告 阅读6154次,点赞0次
- FFmpeg - 关于ffmpeg avcodec_open2函数失败的问题 阅读3672次,点赞0次
- FFmpeg - 自定义http请求参数,如user-agent,headers,referer等 阅读1787次,点赞0次
- FFmpeg - PTS、DTS、时间基、时间戳详解 阅读1120次,点赞0次
- FFmpeg - FFmpeg历史版本下载和函数弃用列表 阅读2749次,点赞0次
- Python - 使用命令行调用ffmpeg修改视频帧率,将60FPS的视频修改为30FPS的视频,视频时间保持不变 阅读1082次,点赞0次
- C++ - 使用ffmpeg读取视频旋转角度并使用OpenCV根据旋转角度对视频进行旋转复原 阅读2304次,点赞0次
- Ubuntu编译安装FFmpeg+libx264以及编译+安装Opencv+FFmpeg保姆教程 阅读3718次,点赞1次
- FFmpeg - 命令行参数与常用命令行 阅读676次,点赞1次
全站随机文章推荐
- 资源分享 - Game AI Pro 2 - Collected Wisdom of Game AI Professionals 英文高清PDF下载 阅读2184次,点赞0次
- 资源分享 - GPU Pro 360 - Guide to Lighting 英文高清PDF下载 阅读3023次,点赞0次
- 神经网络 - 模型训练需注意的细节与超参数调优 阅读1102次,点赞1次
- 资源分享 - Advanced global illumination (2nd Edition) 英文PDF下载 阅读5822次,点赞0次
- WordPress - 在编辑文章发布时弹出是否发布提醒框 阅读3483次,点赞0次
- 资源分享 - Game Engine Architecture (Third Edition)英文高清PDF下载 阅读7412次,点赞1次
- Centos7 - 配置Go环境 阅读3078次,点赞1次
- WordPress - 查询当前登录用户在一天之内的评论总数量 阅读2351次,点赞0次
- 工具网站推荐 - 在线的数学公式、几何绘图网站推荐 阅读4333次,点赞0次
- 计算几何 - 求解两个三维向量之间的三维旋转矩阵 阅读2225次,点赞0次
评论
169