Files
abot/utils/video_utils.py

72 lines
2.1 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import io
import os
import tempfile
import cv2
from loguru import logger
def _get_first_frame(video_path, output_path):
"""
提取视频的第一帧并保存为图片
:param video_path: 视频文件路径
:param output_path: 输出图片路径
:return: 输出图片的绝对路径如果失败则返回None
"""
cap = None
try:
logger.info(f"开始提取视频首帧: {video_path}")
# 打开视频文件
cap = cv2.VideoCapture(video_path)
if not cap.isOpened():
logger.error(f"无法打开视频: {video_path}")
return None
# 读取首帧
ret, frame = cap.read()
if not ret:
logger.error("无法读取视频帧")
cap.release()
return None
# 保存首帧为图片
try:
cv2.imwrite(output_path, frame)
logger.info(f"首帧已保存为: {output_path}")
except Exception as e:
logger.error(f"保存首帧图片失败: {e}")
cap.release()
return None
# 释放资源
cap.release()
return os.path.abspath(output_path)
except Exception as e:
logger.error(f"提取视频首帧时出错: {e}")
return None
finally:
cap.release()
def _get_first_frame_bytes(video_bytes, output_path):
"""
提取视频的第一帧并保存为图片
:param video_bytes: 视频文件流
:param output_path: 输出图片路径
:return: 输出图片的绝对路径如果失败则返回None
"""
try:
logger.info(f"开始提取视频流首帧")
# 创建临时文件
with tempfile.NamedTemporaryFile(suffix=".mp4", delete=False) as temp_file:
# 将字节流写入临时文件
temp_file.write(video_bytes)
temp_file_path = temp_file.name # 获取临时文件路径
# 打开视频文件
_get_first_frame(temp_file_path, output_path)
except Exception as e:
logger.error(f"提取视频首帧时出错: {e}")
return None