是否有一个标准解决方案可以从存储在 Python 变量中的视频数据而不是从磁盘上的文件中提取元数据(如宽高比、编解码器等)?
我看到人们最常使用 ffmpeg-python 进行视频元数据分析,但据我所知,它只能对文件名进行操作,而不能对内存中的对象进行操作。一种可能的解决方法是告诉 ffmpeg-python 使用 stdin 管道作为输入,然后将变量的内容输出到该管道,但这似乎很麻烦。如果 ffmpeg-python 接受文件句柄而不是文件名,您可以使用 BytesIO,但这似乎也不支持。
为了简化,我在变量 x 中有二进制视频数据。我希望能够做类似的事情:
import ffmpeg
metadata=ffmpeg.FFProbe(x)
但这不起作用,因为 x 不是文件名,并且 FFProbe 函数也不会接受句柄。
还有其他 Python 模块更适合该任务吗?
你说使用管道很“麻烦”,但为什么会这样呢?该解决方案相对简单,尽管它确实需要安装 ffmpeg 并已知其位置或在系统路径上:
import json
import subprocess
import pprint
with open('test.mp4', 'rb') as f:
video_data = f.read()
# assuming `ffprobe` is on the system path
p = subprocess.run(
'ffprobe -i - -print_format json -show_format -v quiet'.split(),
input=video_data, capture_output=True
)
metadata = json.loads(p.stdout)
pprint.pprint(metadata)
这很有效,可以使数据以可访问的格式快速可用。一个潜在的缺点是启动单独的进程以及加载和启动单独的可执行文件的开销。
如果性能对您的解决方案至关重要,您可以查看像
hachoir
这样的库,或者如果您需要的元数据非常具体并且您只需要特定格式,则可能有特定于该格式的库,可以让您做这份工作。在极端情况下,您可以自己解析字节对象。
但您对性能的需求似乎不太可能超过增加的复杂性、缺乏对格式和未来变化的支持以及像 ffmpeg 本身这样的成熟工具集的优化性能。如果回答“你为什么要这样做?”是速度、简单性还是灵活性,您可能应该使用 ffmpeg。
如果答案是可移植性,您可以考虑使用脚本或包分发某种形式的 ffmpeg,前提是许可允许这样做。