我正在使用python进行一些基本的图像处理,并希望将其扩展为逐帧处理视频
我从服务器以blob的形式获取视频-.webm encoded-,并在python中以字节字符串(b'\x1aE\xdf\xa3\xa3B\x86\x81\x01B\xf7\x81\x01B\xf2\x81\x04B\xf3\x81\x08B\x82\x88matroskaB\x87\x81\x04B\x85\x81\x02\x18S\x80g\x01\xff\xff\xff\xff\xff\xff\xff\x15I\xa9f\x99*\xd7\xb1\x83\x0fB@M\x80\x86ChromeWA\x86Chrome\x16T\xaek\xad\xae\xab\xd7\x81\x01s\xc5\x87\x04\xe8\xfc\x16\t^\x8c\x83\x81\x01\x86\x8fV_MPEG4/ISO/AVC\xe0\x88\xb0\x82\x02\x80\xba\x82\x01\xe0\x1fC\xb6u\x01\xff\xff\xff\xff\xff\xff ...
)的形式获取视频
我知道有cv.VideoCapture
,它几乎可以满足我的需要。问题是,我必须首先将文件写入磁盘,然后再次加载。将字符串包装(例如)到IOStream中,并将其提供给执行解码的某个函数似乎要干净得多
在python中有没有一种干净的方法可以做到这一点,或者是写入磁盘并再次加载它
根据thispost,您不能在内存流中使用
cv.VideoCapture
进行解码。您可以通过“管道”到FFmpeg来解码流
解决方案有点复杂,写入磁盘要简单得多,而且可能是更干净的解决方案
我正在发布一个使用FFmpeg(和FFprobe)的解决方案。
FFmpeg有Python绑定,但解决方案是使用subprocess模块作为外部应用程序执行FFmpeg。
(Python绑定与FFmpeg配合使用效果良好,但与FFprobe的管道连接效果不佳)。
我使用的是Windows 10,我将
ffmpeg.exe
和ffprobe.exe
放在执行文件夹中(您也可以设置执行路径)。对于Windows,请下载最新(静态喜欢)稳定版本
我创建了一个执行以下操作的独立示例:
如果事先知道解决方案,您可以跳过此部分。
连接FFprobe的管道使解决方案比它应有的更复杂李>
stdin
进行解码,并从stdout
管道读取解码的原始帧。对
stdin
的写入是使用Python线程分块完成的。(使用
stdin
和stdout
代替命名管道的原因是为了Windows兼容性)李>管道结构:
代码如下:
备注:
例如(在Linux中):
'/usr/bin/ffmpeg -i pipe: -f rawvideo -pix_fmt bgr24 -an -sn pipe:'
相关问题 更多 >
编程相关推荐