Python中直接从内存处理Plotly Dash上传的Base64视频方法
直接从内存处理Dash上传的视频(无需写入磁盘)
可以通过将解码后的视频字节转换为内存缓冲区,直接用OpenCV读取,完全跳过磁盘写入步骤,具体实现如下:
修改后的代码
import io import numpy as np import base64 import cv2 def process_motion(contents, filename): print("Processing video: " + filename) content_type, content_string = contents.split(',') decoded = base64.b64decode(content_string) # 将解码后的字节包装为内存流 video_stream = io.BytesIO(decoded) # 转换为OpenCV可识别的numpy uint8缓冲区 video_buffer = np.frombuffer(video_stream.getvalue(), dtype=np.uint8) # 从内存初始化VideoCapture,依赖FFMPEG后端 cap = cv2.VideoCapture() success = cap.open(video_buffer, cv2.CAP_FFMPEG) if not success: print(f"无法读取视频 {filename}") return frames = cap.get(cv2.CAP_PROP_FRAME_COUNT) fps = cap.get(cv2.CAP_PROP_FPS) # 示例:遍历处理每一帧 while cap.isOpened(): ret, frame = cap.read() if not ret: break # 在这里添加你的帧处理逻辑,比如运动检测等 cap.release()
关键说明
- 内存流包装:用
io.BytesIO把base64解码后的字节转换成类文件对象,完全在内存中操作 - 缓冲区转换:通过
np.frombuffer将字节流转为numpy数组,这是OpenCV能直接读取的内存格式 - FFMPEG后端依赖:OpenCV通过FFMPEG实现内存视频读取,大多数预编译的OpenCV包都默认包含FFMPEG支持,若不确定可运行
cv2.getBuildInformation()查看编译配置
注意事项
- 大视频文件会占用较多内存,需根据实际场景评估内存负载
- 部分老旧或特殊编码的视频可能无法通过内存流正常解析,此时可临时 fallback 到原有的临时文件方案
内容的提问来源于stack exchange,提问作者Turing22
相关产品推荐
相关产品推荐

