python批量提取视频帧

Python批量提取视频帧方法
博客介绍了Python批量提取视频帧的方法,有按帧数和按时间间隔两种提取方式。按帧数提取会截取固定帧数,超过总帧数则取全量帧;按时间间隔则每个time取一帧。还说明了使用示例、注意事项并给出代码。

python批量提取视频帧

python批量提取视频帧,两种提取方式:

  • 按帧数提取,每个视频提取固定帧数,若所取帧数超过视频总帧数,则截取视频所有帧
  • 按时间间隔提取,每个time提取一帧
1. 使用示例:
python video_set.py -f=frames
python video_set.py -f=20
python video_set.py -t=times 
python video_set.py -t=2.5
2. 注意事项

(1)frames是每个视频所截取的帧数,支持整数类型,若所取帧数超过视频总帧数,则截取视频所有帧;times是取帧间隔时间,支持浮点型,可根据需要自行调整,两者同时使用则帧数优先,此脚本采取固定步长进行取帧

(2)在此脚本同级目录,创建两个目录,一个是video目录,用来存放原视频,另一个是img目录,用来存放截取后的视频帧,截取的视频帧存放在img目录下与视频名同名的目录下,图片名为帧数

3. 代码
#!/usr/bin/env python
# coding=utf-8

import os
import cv2
import argparse
import shutil
import math
parser = argparse.ArgumentParser()
parser.add_argument('-f', '--frames', help="set frames", type=int)
parser.add_argument('-t', '--times', help="set times"
### 使用Python和FFmpeg进行视频批量抽帧 为了实现视频批量抽帧功能,可以结合 `cv2` 和 FFmpeg 工具来完成。以下是具体方法: #### 方法一:基于 OpenCV批量抽帧 OpenCV 是一个强大的计算机视觉库,能够轻松读取视频文件并逐帧提取图像。 ```python import cv2 import os def extract_frames(video_path, output_folder, interval=1): """ 提取视频中的每一帧图片。 参数: video_path (str): 输入视频路径。 output_folder (str): 输出帧保存目录。 interval (int): 抽帧间隔,默认每秒抽取全部帧。 """ if not os.path.exists(output_folder): os.makedirs(output_folder) cap = cv2.VideoCapture(video_path) fps = int(cap.get(cv2.CAP_PROP_FPS)) total_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT)) count = 0 success = True while success: success, frame = cap.read() if count % (fps * interval) == 0 and success: # 控制抽帧频率 frame_name = f"{output_folder}/frame_{count}.jpg" cv2.imwrite(frame_name, frame) count += 1 cap.release() # 批量处理多个视频 video_dir = 'path_to_videos' # 替换为视频所在目录 output_base = 'frames_output' for filename in os.listdir(video_dir): if filename.endswith(('.mp4', '.avi')): # 支持更多格式可扩展此列表 video_path = os.path.join(video_dir, filename) output_folder = os.path.join(output_base, os.path.splitext(filename)[0]) extract_frames(video_path, output_folder) ``` 上述代码实现了从指定目录下的所有视频中按固定时间间隔提取帧,并将其存储到对应的子文件夹下[^2]。 --- #### 方法二:基于 FFmpeg 的批量抽帧 FFmpeg 是一款高效的多媒体处理工具,支持快速解码和编码操作。它可以通过命令行调用来执行复杂的媒体转换任务。 下面是一个 Python 脚本示例,用于通过 subprocess 模块调用 FFmpeg 命令来进行批量抽帧: ```python import os import subprocess def ffmpeg_extract_frames(video_path, output_pattern, rate='1'): """ 使用 FFmpeg 提取视频帧。 参数: video_path (str): 输入视频路径。 output_pattern (str): 输出帧命名模式(如 frames/%d.png)。 rate (str): 抽帧速率,默认为一秒一张。 """ command = [ 'ffmpeg', '-i', video_path, '-r', rate, # 设置抽帧率 '-q:v', '2', # 图像质量设置 output_pattern ] subprocess.run(command, check=True) # 批量处理多个视频 video_dir = 'path_to_videos' output_base = 'frames_output_ffmpeg' for filename in os.listdir(video_dir): if filename.endswith(('.mp4', '.avi')): video_path = os.path.join(video_dir, filename) output_folder = os.path.join(output_base, os.path.splitext(filename)[0]) if not os.path.exists(output_folder): os.makedirs(output_folder) output_pattern = os.path.join(output_folder, '%d.jpg') ffmpeg_extract_frames(video_path, output_pattern) ``` 该脚本会遍历目标文件夹内的所有视频文件,并使用 FFmpeg 将其转化为一系列静态图像[^3]。 --- #### 对比两种方式 - **性能方面**:如果仅需简单地提取帧而不涉及额外处理,则推荐使用 FFmpeg;对于复杂场景(例如实时分析),则更适合采用 OpenCV。 - **灵活性方面**:OpenCV 更便于集成其他算法模块,而 FFmpeg 则擅长于高效批量化作业。 无论哪种方案都可根据实际需求调整参数配置以满足特定用途的要求。 ---
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值