需要你电脑本身安装的有FFmpeg,你下载的压缩包形式的话,记得把里面的bin路径加入到电脑环境变量里,不然无法识别
功能:
在视频同目录下转码成mp4文件
# 指定要搜索的目录路径
输入文件路径 = r‘E:\阿里云盘下载\Oracle合集\ORACLE视频教学’
import subprocess,os,json
def ffprobe_get_info(输入文件路径):
"""使用ffprobe获取视频文件的元数据信息"""
try:
probe = subprocess.run(['ffprobe', '-v', 'error', '-show_entries', 'format=duration,size:stream=width,height,avg_frame_rate', '-of', 'json', 输入文件路径], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
if probe.returncode != 0:
print(f"ffprobe error: {probe.stderr.decode()}")
return None
return json.loads(probe.stdout)
except Exception as e:
print(f"An error occurred: {e}")
return None
def 自动转码视频(输入文件路径, 输出文件路径):
"""使用ffprobe和ffmpeg自动转码视频"""
video_info = ffprobe_get_info(输入文件路径)
# 寻找第一个具有有效宽度和高度信息的流
for stream in video_info['streams']:
if 'width' in stream and 'height' in stream:
width = stream['width']
height = stream['height']
fps = stream['avg_frame_rate'].split('/')[0]
break
else:
print('未找到有效的视频流')
return False # 如果没有找到有效的流,则返回False
duration = float(video_info['format']['duration'])
# 计算视频比特率,这里假设为文件大小的85%,您可以根据需要调整
file_size = os.path.getsize(输入文件路径)
video_bitrate = int(0.85 * (file_size * 8 / duration))
# 构建FFmpeg转码命令
ffmpeg命令 = [
'ffmpeg',
'-err_detect', 'ignore_err', # 添加错误容错选项
'-i', 输入文件路径,
'-vcodec', 'h264',
'-acodec', 'aac',
'-strict', 'experimental',
'-movflags', '+faststart',
'-b:v', f'{video_bitrate}k',
'-vf', f"scale=-2:{height}", # 使用height变量
'-b:a', '128k',
'-ac', '2',
'-r', fps,
] + [输出文件路径] # 将输出文件路径添加到命令列表中
# 运行FFmpeg命令
try:
subprocess.run(ffmpeg命令, check=True)
print('视频转码成功')
return True
except subprocess.CalledProcessError:
print('视频转码失败')
return False
# 获取指定文件夹所有非mp4文件绝对路径
def 获取所有非mp4文件路径(目录路径, 视频格式列表):
非mp4文件列表 = []
# 排除 'mp4' 格式
非mp4格式列表 = [格式 for 格式 in 视频格式列表 if 格式 != 'mp4']
# 遍历目录
for root, dirs, files in os.walk(目录路径):
for 文件名 in files:
文件扩展名 = 文件名.lower().rsplit('.', 1)[-1] # 获取文件扩展名
if 文件扩展名 in 非mp4格式列表:
非mp4文件列表.append(os.path.join(root, 文件名))
return 非mp4文件列表
# 定义支持的视频格式列表
video_formats = [
'rmvb','avi', 'mov', 'wmv', 'flv', 'mkv', 'rm',
'asf', 'mpg', '3gp', 'vob', 'm4v', 'f4v', 'webm',
'm2ts', 'ts', 'divx', 'xvid', 'mxf'
]
# 指定要搜索的目录路径
输入文件路径 = r'E:\阿里云盘下载\Oracle合集\ORACLE视频教学'
# 获取所有非mp4格式的视频文件路径
所有非mp4文件路径列表 = 获取所有非mp4文件路径(输入文件路径, video_formats)
# 对每个非mp4格式的视频文件执行转码操作
for 单个非mp4文件路径 in 所有非mp4文件路径列表:
try:
# 构造新的mp4文件路径
输出文件路径 = os.path.splitext(单个非mp4文件路径)[0] + '.mp4'
print(单个非mp4文件路径)
print(输出文件路径)
# 执行转码操作
自动转码视频(单个非mp4文件路径, 输出文件路径)
# 如果转码成功,删除原始文件
# os.remove(单个非mp4文件路径)
print(f"原始文件已转码完成: {单个非mp4文件路径}")
# print(f"已删除原始文件: {单个非mp4文件路径}")
except Exception as e:
print(f"处理文件 {单个非mp4文件路径} 时发生错误: {e}")
发表回复