将h264字节字符串转换为OpenCV图像

时间:2017-03-23 17:45:10

标签: python opencv ffmpeg stream h.264

在Python中,如何将h264字节字符串转换为OpenCV可以读取的图像,只保留最新图像?

长版:

大家好。

在Python中工作,我试图从adb screenrecord管道传输输出,允许我在需要时捕获帧并将其与OpenCV一起使用。据我了解,我需要不断阅读流,因为它是h264。

我尝试过多种方法让它发挥作用,并得出结论,我需要寻求具体的帮助。

以下内容为我提供了我需要的流,并且在打印stream.stdout.read(n)时效果非常好。

import subprocess as sp

adbCmd = ['adb', 'exec-out', 'screenrecord', '--output-format=h264', '-']
stream = sp.Popen(adbCmd, stdout = sp.PIPE, universal_newlines = True)

通用换行符是使其在Windows上运行所必需的。

这样做的:

sp.call(['ffplay', '-'], stdin = stream.stdout, universal_newlines = True)

作品。

问题是我现在正在尝试使用ffmpeg来获取输入h264流并输出尽可能多的帧,如果需要则覆盖最后一帧。

ffmpegCmd = ['ffmpeg', '-f', 'image2pipe', '-pix_fmt', 'bgr24', '-vcodec', 'h264', 'fps=30', '-']
ffmpeg = sp.Popen(ffmpegCmd, stdin = stream.stdout, stdout = sp.PIPE, universal_newlines = True)

这是我认为应该使用的,但我总是得到错误"输出文件#0不包含任何流"。

编辑:

最终答案

原来,universal_newlines选项破坏了行结尾并逐渐破坏了输出。另外,ffmpeg命令错了,请参阅LordNeckbeard的回答。

这里有正确的ffmpeg命令来实现所使用的功能:

ffmpegCmd = ['ffmpeg', '-i', '-', '-f', 'rawvideo', '-vcodec', 'bmp', '-vf', 'fps=5', '-']
ffmpeg = sp.Popen(ffmpegCmd, stdin = stream.stdout, stdout = sp.PIPE)

然后要将结果转换为OpenCV图像,请执行以下操作:

fileSizeBytes = ffmpeg.stdout.read(6)
fileSize = 0
for i in xrange(4):
    fileSize += fileSizeBytes[i + 2] * 256 ** i
bmpData = fileSizeBytes + ffmpeg.stdout.read(fileSize - 6)
image = cv2.imdecode(np.fromstring(bmpData, dtype = np.uint8), 1)

这会将流的每一帧都作为OpenCV图像。

1 个答案:

答案 0 :(得分:0)

使用以下任何一项:

ffmpeg -i - -pix_fmt bgr24 -f rawvideo -
ffmpeg -i pipe: -pix_fmt bgr24 -f rawvideo pipe:
ffmpeg -i pipe:0 -pix_fmt bgr24 -f rawvideo pipe:1
  • 您没有提供有关输入的详细信息,因此您可能需要添加其他输入选项。

  • 您没有指定所需的输出格式,因此我选择了rawvideo。您可以看到支持的输出格式(复用器)列表ffmpeg -muxers(如果ffmpeg -formats已过时,则为ffmpeg)。并非所有都适用于管道,例如MP4。

  • 请参阅FFmpeg Protocols: pipe