如何从Python变量存储的视频数据中提取元数据?
从内存二进制视频数据提取元数据的Python方案
如果你需要直接处理Python变量中的二进制视频数据(无需写入磁盘)来提取元数据,以下是两种实用方案:
方案一:使用PyAV(推荐)
PyAV是FFmpeg的Python绑定库,原生支持内存中的媒体流处理,API更面向对象,适合后续还要操作视频内容的场景。
import av from io import BytesIO # 假设x是存储视频二进制数据的变量 video_bytes = x # 用BytesIO包装二进制数据,打开为AV容器 container = av.open(BytesIO(video_bytes)) # 获取视频流(默认取第一个视频流) video_stream = container.streams.video[0] # 提取关键元数据 metadata = { "编解码器": video_stream.codec.name, "分辨率": f"{video_stream.width}x{video_stream.height}", "宽高比": video_stream.aspect_ratio, "平均帧率": float(video_stream.average_rate), "比特率": video_stream.bit_rate // 1000 if video_stream.bit_rate else None # 转换为kbps } print(metadata) container.close()
方案二:直接调用ffprobe(轻量)
如果你只需要提取元数据,直接用subprocess调用ffprobe并通过stdin传入数据,比ffmpeg-python的管道方式更简洁。
import subprocess import json # 假设x是存储视频二进制数据的变量 video_bytes = x # 调用ffprobe,从标准输入读取数据,输出JSON格式元数据 proc = subprocess.run( [ "ffprobe", "-v", "quiet", "-print_format", "json", "-show_format", "-show_streams", "-i", "pipe:0" # 指定从stdin读取输入 ], input=video_bytes, capture_output=True, text=True ) # 解析JSON结果 metadata = json.loads(proc.stdout) # 按需提取视频流的具体字段 video_info = next(s for s in metadata["streams"] if s["codec_type"] == "video") print("视频编解码器:", video_info["codec_name"]) print("分辨率:", f"{video_info['width']}x{video_info['height']}")
关于ffmpeg-python的补充
ffmpeg-python确实没有直接支持传入内存对象的API,若要使用它,需要通过管道手动传递数据,步骤相对繁琐,示例如下(仅供参考):
import ffmpeg import json import subprocess video_bytes = x # 构造ffprobe命令,通过stdin读取数据 process = subprocess.run( ["ffprobe"] + ffmpeg.probe.get_args("pipe:0", v="quiet", print_format="json", show_format=None, show_streams=None), input=video_bytes, capture_output=True, text=True ) metadata = json.loads(process.stdout)
内容的提问来源于stack exchange,提问作者Adam J. Kessel
相关产品推荐
相关产品推荐

