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} 转换失败,请检查输出信息")