from tkinter import Tk, filedialog, messagebox import subprocess import json # ============FFmpeg路径============ FFMPEG_EXE = r"D:\ffmpeg-9.0.2-full_build\bin\ffmpeg.exe" FFPROBE_EXE = r"D:\ffmpeg-9.0.2-full_build\bin\ffprobe.exe" # ================================== def get_video_info(mp4_path): cmd = [ FFPROBE_EXE, "-v", "error", "-select_streams", "v:0", "-show_entries", "stream=width,height,r_frame_rate", "-of", "json", mp4_path ] result = subprocess.run(cmd, capture_output=True, text=True) info = json.loads(result.stdout) stream = info["streams"][0] w = stream["width"] h = stream["height"] r_frame = stream["r_frame_rate"] return w, h, r_frame def mp4_to_yuv(): root = Tk() root.withdraw() mp4_path = filedialog.askopenfilename( title="请选择MP4视频文件", filetypes=[("视频", "*.mp4 *.mkv *.avi *.mov"), ("所有文件", "*.*")] ) if not mp4_path: messagebox.showinfo("提示", "未选择文件,程序退出") return yuv_path = filedialog.asksaveasfilename( title="保存YUV文件", defaultextension=".yuv", filetypes=[("YUV裸流", "*.yuv")] ) if not yuv_path: messagebox.showinfo("提示", "未选择保存路径,程序退出") return try: print("正在读取视频信息...") w, h, fps_str = get_video_info(mp4_path) print(f"视频分辨率: {w}x{h}") print(f"原始帧率: {fps_str}") pix_fmt = "yuv420p" print(f"\n开始导出YUV,像素格式:{pix_fmt},开启去隔行") # =========重点新增 -vf yadif 去隔行滤镜!========= cmd = [ FFMPEG_EXE, "-y", "-i", mp4_path, "-vf", "yadif", # 去隔行,消除条纹花屏! "-c:v", "rawvideo", "-pix_fmt", pix_fmt, "-r", fps_str, yuv_path ] subprocess.run(cmd, check=True) msg = ( f"✅ MP4转YUV完成!\n\n" f"分辨率: {w}x{h}\n" f"帧率: {fps_str}\n" f"像素格式: {pix_fmt}\n" f"✅已启用去隔行处理" ) print(f"\n{msg}") messagebox.showinfo("转换成功", msg) except Exception as e: messagebox.showerror("转换失败", f"错误: {str(e)}") print(f"异常: {str(e)}") if __name__ == "__main__": mp4_to_yuv()以上代码运行前需要先下载:ffmpeg工具包
下载路径:https://www.gyan.dev/ffmpeg/builds/
需要放在D盘:D:\ffmpeg-9.0.2-full_build\bin注意不要嵌套多层文件夹,bin 直接在 ffmpeg 根目录下面..
CMD直接测试:
用ffmpeg 将 mp4转化成yuv
源视频路径:"C:/Users/andin/Desktop/源视频.mp4"
导出yuv路径:"C:/Users/andin/Desktop/test1.yuv"
对应命令:
"D:\ffmpeg-9.0.2-full_build\bin\ffmpeg.exe" -y -i "C:/Users/andin/Desktop/源视频.mp4" -pix_fmt yuv420p -colorspace bt709 -color_primaries bt709 -color_trc bt709 -color_range pc -c:v rawvideo -r 30000/1001 "C:/Users/andin/Desktop/test1.yuv"用ffmpeg 将 yuv转化成mp4
选中的yuv路径:"C:/Users/andin/Desktop/test1.yuv"
输出的mp4路径:"C:/Users/andin/Desktop/test2.mp4"
对应命令:
"D:\ffmpeg-9.0.2-full_build\bin\ffmpeg.exe" -y -f rawvideo -video_size 1280x720 -pix_fmt yuv420p -color_range pc -r 30000/1001 -i "C:/Users/andin/Desktop/test1.yuv" "C:/Users/andin/Desktop/test2.mp4"效果视频:
格式转化的视频