当前位置: 首页 > news >正文

FFMPEG视频转图片

用FFMPEG视频转图片,并且for循环

import os
import subprocess# 输入文件夹和输出文件夹路径
input_folder = r"I:\xxx"
output_base_folder = r"D:\xxx\YOLO\data\video"
output_subfolder_name = "20240609"# 创建输出子文件夹
output_folder = os.path.join(output_base_folder, output_subfolder_name)
os.makedirs(output_folder, exist_ok=True)# 循环处理输入文件夹中的所有视频文件
for file_name in os.listdir(input_folder):# 检查是否是视频文件(扩展名可根据需要增加)if file_name.lower().endswith(('.mp4', '.mov', '.avi', '.mkv')):input_path = os.path.join(input_folder, file_name)output_name = os.path.splitext(file_name)[0]  # 去掉扩展名output_path_pattern = os.path.join(output_folder, f"{output_name}_frame_%04d.jpg")# 构建 FFmpeg 命令ffmpeg_command = ["ffmpeg","-i", input_path,            # 输入视频路径"-vf", "fps=5",              # 每秒提取 5 帧"-q:v", "2",                 # 高质量图片output_path_pattern          # 输出图片路径模式]# 打印当前正在处理的文件print(f"Processing video: {input_path} -> {output_folder}")# 执行 FFmpeg 命令subprocess.run(ffmpeg_command, check=True)print("视频处理完成!图片已保存到:", output_folder)

改进以后的代码

import os
import subprocess# 输入文件夹和输出文件夹路径
input_folder = r"H:\\xxxx"
output_base_folder = r"D:\\xxx"
output_subfolder_name = os.path.split(os.path.dirname(input_folder))[1]# 创建输出子文件夹
output_folder = os.path.join(output_base_folder, output_subfolder_name)
os.makedirs(output_folder, exist_ok=True)# 记录成功和失败的文件
processed_videos = []
skipped_videos = []# 循环处理输入文件夹中的所有视频文件
for file_name in os.listdir(input_folder):# 检查是否是视频文件(扩展名可根据需要增加)if file_name.lower().endswith(('.mp4')):input_path = os.path.join(input_folder, file_name)output_name = os.path.splitext(file_name)[0]  # 去掉扩展名output_path_pattern = os.path.join(output_folder, f"{output_name}_frame_%04d.jpg")# 构建 FFmpeg 命令ffmpeg_command = ["ffmpeg","-i", input_path,            # 输入视频路径"-vf", "fps=1",              # 每秒提取 1 帧"-q:v", "2",                 # 高质量图片output_path_pattern          # 输出图片路径模式]try:print(f"Processing video: {input_path} -> {output_folder}")subprocess.run(ffmpeg_command, check=True)processed_videos.append(file_name)except subprocess.CalledProcessError as e:print(f"Error processing {input_path}: {e}")skipped_videos.append(file_name)# 保存处理结果到文件
with open(os.path.join(output_folder, "processed_videos.txt"), "w") as processed_file:processed_file.write("\n".join(processed_videos))with open(os.path.join(output_folder, "skipped_videos.txt"), "w") as skipped_file:skipped_file.write("\n".join(skipped_videos))print("处理完成!")
print(f"成功处理的视频列表已保存到: {os.path.join(output_folder, 'processed_videos.txt')}")
print(f"跳过的视频列表已保存到: {os.path.join(output_folder, 'skipped_videos.txt')}")

http://www.lryc.cn/news/504387.html

相关文章:

  • docker入门实践---虚拟机环境配置
  • java要防止重复序列化的问题JSON.toJSONString转义问题
  • TS的类型守卫、类型约束实践
  • 文件转曲,限制PDF文件编辑的最佳方案!
  • MySQL系列之数据授权(安全)
  • 用 Python 实现经典的 2048 游戏:一步步带你打造属于你的小游戏!
  • Vue vs. React:两大前端框架的深度对比与分析(一)
  • React 进阶深入理解核心概念与高阶实践
  • Linux shell的七大功能 ---自动补齐、管道机制、别名
  • XML 在线格式化 - 加菲工具
  • java_多态的应用
  • Python+OpenCV系列:模版匹配
  • 【从零开始入门unity游戏开发之——C#篇10】循环结构——while、do-while、for、foreach的使用
  • Spring Boot项目使用虚拟线程
  • 实现SpringBoot项目嵌入其他项目
  • 朗致面试---IOS/安卓/Java/架构师
  • 数字信号处理:FIR滤波器
  • 鲲鹏麒麟安装Kafka-v1.1.1
  • 群控系统服务端开发模式-应用开发-操作记录功能开发
  • 昇思25天学习打卡营第33天|共赴算力时代
  • Vue 让视图区域滑到指定位置、回到顶部
  • EasyGBS点对点穿透P2P远程访问技术在安防视频监控中的应用
  • Android 使用 Gson + OkHttp 实现 API 的常规使用(个人心得)
  • WPF+MVVM案例实战与特效(三十九)- 深度剖析一个弧形进度条的实现
  • opencv——图片矫正
  • 前端核心知识总结
  • 【C语言】五子棋(c语言实现)
  • 【数据结构——查找】顺序查找(头歌实践教学平台习题)【合集】
  • Python的3D可视化库【vedo】2-1 (plotter模块) 绘制器的使用
  • 6.1 初探MapReduce