【发布时间】:2017-07-02 23:39:40
【问题描述】:
搜索 OpenCV 的替代方案不会提供 live 相机流的时间戳(在 Windows 上),这是我的计算机视觉算法所必需的,我发现 ffmpeg 和这个优秀文章https://zulko.github.io/blog/2013/09/27/read-and-write-video-frames-in-python-using-ffmpeg/ 该解决方案使用 ffmpeg,访问其标准输出 (stdout) 流。我也将它扩展为读取标准错误 (stderr) 流。
在 Windows 上处理 python 代码,而我从 ffmpeg 标准输出接收到视频帧,但标准错误在提供第一帧的 showinfo 视频过滤器详细信息(时间戳)后冻结。
我记得在某处的 ffmpeg 论坛上看到,像 showinfo 这样的视频过滤器在重定向时会被绕过。这就是为什么以下代码无法按预期工作的原因吗?
预期:它应该将视频帧写入磁盘并打印时间戳详细信息。
实际:写入视频文件但不获取时间戳(showinfo)详细信息。
这是我尝试过的代码:
import subprocess as sp
import numpy
import cv2
command = [ 'ffmpeg',
'-i', 'e:\sample.wmv',
'-pix_fmt', 'rgb24',
'-vcodec', 'rawvideo',
'-vf', 'showinfo', # video filter - showinfo will provide frame timestamps
'-an','-sn', #-an, -sn disables audio and sub-title processing respectively
'-f', 'image2pipe', '-'] # we need to output to a pipe
pipe = sp.Popen(command, stdout = sp.PIPE, stderr = sp.PIPE) # TODO someone on ffmpeg forum said video filters (e.g. showinfo) are bypassed when stdout is redirected to pipes???
for i in range(10):
raw_image = pipe.stdout.read(1280*720*3)
img_info = pipe.stderr.read(244) # 244 characters is the current output of showinfo video filter
print "showinfo output", img_info
image1 = numpy.fromstring(raw_image, dtype='uint8')
image2 = image1.reshape((720,1280,3))
# write video frame to file just to verify
videoFrameName = 'Video_Frame{0}.png'.format(i)
cv2.imwrite(videoFrameName,image2)
# throw away the data in the pipe's buffer.
pipe.stdout.flush()
pipe.stderr.flush()
那么如何仍然将帧时间戳从 ffmpeg 获取到 python 代码中,以便可以在我的计算机视觉算法中使用...
【问题讨论】:
-
showinfo 写入标准错误。
-
感谢 @Mulvya,我在控制台上确认 showinfo 确实写入 stderr:
E:\> ffmpeg -i "e:\sample.wmv" -an -sn -vf showinfo -f avi - 2>error.txt | ffplay -