回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>在Python中,如何将一个h264字节的字符串转换成OpenCV可以读取的图像,只保留最新的图像?在</p>
<p>长版:</p>
<p>大家好。在</p>
<p>在Python中工作时,我试图以管道方式从adb screenrecord获取输出,以便在需要时捕捉帧并与OpenCV一起使用。据我所知,我需要不断地阅读流,因为它是h264。在</p>
<p>我尝试了很多方法来让它工作,并得出结论,我需要寻求具体的帮助。在</p>
<p>以下是我需要的流,当我打印时效果很好stream.stdout.read(n) 一。在</p>
<pre><code>import subprocess as sp
adbCmd = ['adb', 'exec-out', 'screenrecord', '--output-format=h264', '-']
stream = sp.Popen(adbCmd, stdout = sp.PIPE, universal_newlines = True)
</code></pre>
<p>通用换行符是使它在Windows上运行所必需的。在</p>
<p>正在做:</p>
^{pr2}$
<p>有效。在</p>
<p>问题是我现在尝试使用ffmpeg获取输入的h264流并输出尽可能多的帧,如果需要,覆盖最后一帧。在</p>
<pre><code>ffmpegCmd = ['ffmpeg', '-f', 'image2pipe', '-pix_fmt', 'bgr24', '-vcodec', 'h264', 'fps=30', '-']
ffmpeg = sp.Popen(ffmpegCmd, stdin = stream.stdout, stdout = sp.PIPE, universal_newlines = True)
</code></pre>
<p>这是我认为应该使用的,但是我总是得到错误“输出文件0不包含任何流”。在</p>
<p>编辑:</p>
<h2>最终答案</h2>
<p>原来,universal\u newlines选项正在破坏行结尾并逐渐损坏输出。另外,ffmpeg命令是错误的,请看洛德内克比尔德的回答。在</p>
<p>下面是正确的ffmpeg命令以实现所使用的功能:</p>
<pre><code>ffmpegCmd = ['ffmpeg', '-i', '-', '-f', 'rawvideo', '-vcodec', 'bmp', '-vf', 'fps=5', '-']
ffmpeg = sp.Popen(ffmpegCmd, stdin = stream.stdout, stdout = sp.PIPE)
</code></pre>
<p>然后,要将结果转换为OpenCV图像,请执行以下操作:</p>
<pre><code>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)
</code></pre>
<p>这将获得流的每一帧作为OpenCV图像。在</p>