Ffmpeg批量转码
ChatGPT的写的代码,拿来可以直接用
调用ffmepg来批量转换视频格式
会先判断视频格式是否为hevc,然后再用hevc_qsv来转码
2024-02-03:
- 增加进度条
2024-11-19:
- 删除进度条(反正是后台执行,看个鬼的进度条)
- 启用硬件加速 -hwaccel qsv -hwaccel_output_format qsv,这样可以让GPU一直保持100%满载
- 解决转码后画音不同步的问题 -fps_mode passthrough
- 优化画质 -global_quality 1 ,不影响转码速度,怎么连文件大小都不影响
- 优化判断文件扩展名是否为mp4,不区分大小写,file.lower().endswith(“.mp4”):
2024-12-01
- -hwaccel qsv -hwaccel_output_format qsv 开启硬件加速,调用qsv加速,性能没问题,可以跑满100%的GPU,但是会遇到下面的报错
- 所以还是改成-hwaccel auto;暂时他会调用dxva2,速度略低10%
[vf#0:0 @ 000001d25e800b80] Reconfiguring filter graph because video parameters changed to qsv(tv, bt709), 1920x1080, hwaccel changed Impossible to convert between the formats supported by the filter 'Parsed_null_0' and the filter 'auto_scale_0'
[vf#0:0 @ 000001d25e800b80] Error reinitializing filters!
[vf#0:0 @ 000001d25e800b80] Task finished with error code: -40 (Function not implemented)
[vf#0:0 @ 000001d25e800b80] Terminating thread with return code -40 (Function not implemented)
[out#0/mp4 @ 000001d25e08d240] video:12431KiB audio:454KiB subtitle:0KiB other streams:0KiB global headers:0KiB muxing overhead: 0.228453%
frame= 902 fps=183 q=-0.0 Lsize= 12914KiB time=00:00:30.09 bitrate=3515.1kbits/s speed=6.11x
[aac @ 000001d25e14e840] Qavg: 13149.077
Conversion failed!
import os
import subprocess
ffmpeg=r"Z:\ffmpeg\bin\ffmpeg.exe"
ffprobe=r"Z:\ffmpeg\bin\ffprobe.exe"
input_folder = r"Z:\AVNO1\test"
output_folder = r"Z:\AVNO1\mp4"
# 遍历文件夹下的所有文件,包括子文件夹
for root, dirs, files in os.walk(input_folder):
for file in files:
# 判断文件格式是否为mp4
if file.lower().endswith(".mp4"):
input_path = os.path.join(root, file)
# 使用ffprobe获取视频流信息
codec = subprocess.check_output(f'{ffprobe} -v error -select_streams v:0 -show_entries stream=codec_name -of default=noprint_wrappers=1:nokey=1 "{input_path}"').decode().strip()
# 判断视频编码是否为hevc
if codec != "hevc":
output_path = os.path.join(output_folder, os.path.relpath(input_path, input_folder))
output_path = os.path.splitext(output_path)[0] + ".mp4"
os.makedirs(os.path.dirname(output_path), exist_ok=True)
# 使用ffmpeg进行格式转换
cmd = f'{ffmpeg} -y -hide_banner -stats -hwaccel auto -loglevel info -i "{input_path}" -fps_mode passthrough -c:v hevc_qsv -c:a aac -preset veryslow -global_quality 1 "{output_path}"'
if subprocess.run(cmd,shell=True).returncode==0:
os.replace(output_path, input_path)
print(f"文件 {input_path} 转换成功,已替换源文件")
else:
print(f"文件 {input_path} 转换失败,请检查输出信息")