在OpenCV中修改viedo时,ffmpeg视频流输出倍增

在OpenCV中修改viedo时,ffmpeg视频流输出倍增,opencv,video,ffmpeg,Opencv,Video,Ffmpeg,我尝试实现一个概念验证程序,该程序:(1)从网络摄像头获取视频,(2)对其进行一些操作,(3)在网页上传输修改后的视频 我的做法如下: 1) 在open CV:open webcam stream中,将帧输出为原始视频,capture.py看起来: import cv2 import sys cap = cv2.VideoCapture(0) while(cap.isOpened()): ret, frame = cap.read() if(ret):

我尝试实现一个概念验证程序,该程序:(1)从网络摄像头获取视频,(2)对其进行一些操作,(3)在网页上传输修改后的视频

我的做法如下:

1) 在open CV:open webcam stream中,将帧输出为原始视频,capture.py看起来:

  import cv2
  import sys

  cap = cv2.VideoCapture(0)
  while(cap.isOpened()):
    ret, frame = cap.read()
    if(ret):
      sys.stdout.write(frame.tostring())
    else:
      break
2) 通过执行运行ffmpeg服务器:
python2 capture.py | ffmpeg-帧速率30-f rawvideo-像素格式bgr24-视频大小640x480-i--f mpegts-编解码器:v mpeg1视频-s 640x480-b:v 2500k-bf 0http://localhost:8081/supersecret

3) 根据第页的说明运行Websocket中继和http服务器,以便在浏览器中传输视频

我在浏览器中获得流,但当我在capture.py文件中的帧上应用任何更改(例如,
frame=cv2.cvtColor(frame,cv2.COLOR\u bgr2 gray)
)时,我会得到9个小流,而不是一个

当我在启动ffmpeg服务器时更改视频分辨率时,也会出现同样的情况。当我直接从/dev/video0流而不是从管道流时,我得到了正确的流


如何对视频执行一些操作并获得单个图像流?

当您从
BGR
转换为
Gray
时,将从24位/像素转换为8位/像素。也许为输出流添加
-pixel\u格式pal8
就可以了?@Catree,我在输出中添加了-pixel\u格式pal8,但它没有改变任何东西。我认为这应该只是ffmpeg应该如何解释图像缓冲区大小的问题。如果您这样做:
frame=cv2.cvt颜色(frame,cv2.COLOR\u bgr2 gray)
后跟
frame=cv2.cvt颜色(frame,cv2.COLOR\u GRAY2BGR)
,您是否仍然存在此问题?另外,我不知道
ffmpeg
和管道:命令行在做什么?只需将OpenCV
frame
重定向到服务器或捕获流,将其发送到OpenCV,然后从OpenCV获取
frame
并将其发送到服务器?如果仅使用
ffmpeg
发送到服务器,您是否尝试将
bgr24
替换为
pal8
?我尝试添加您提到的额外行,但无法解决问题。命令行捕获流(在OpenCV中),然后更改帧,然后打印FFmpeg服务器捕获的原始视频数据。然后服务器通过WebSocket将其发送到http服务器,然后javascript视频播放器播放视频。我用pal8替换了bgr24,但出现了一个错误:“调色板大小32767错误”。当您从
BGR
转换为
Gray
时,将从24位/像素转换为8位/像素。也许为输出流添加
-pixel\u格式pal8
就可以了?@Catree,我在输出中添加了-pixel\u格式pal8,但它没有改变任何东西。我认为这应该只是ffmpeg应该如何解释图像缓冲区大小的问题。如果您这样做:
frame=cv2.cvt颜色(frame,cv2.COLOR\u bgr2 gray)
后跟
frame=cv2.cvt颜色(frame,cv2.COLOR\u GRAY2BGR)
,您是否仍然存在此问题?另外,我不知道
ffmpeg
和管道:命令行在做什么?只需将OpenCV
frame
重定向到服务器或捕获流,将其发送到OpenCV,然后从OpenCV获取
frame
并将其发送到服务器?如果仅使用
ffmpeg
发送到服务器,您是否尝试将
bgr24
替换为
pal8
?我尝试添加您提到的额外行,但无法解决问题。命令行捕获流(在OpenCV中),然后更改帧,然后打印FFmpeg服务器捕获的原始视频数据。然后服务器通过WebSocket将其发送到http服务器,然后javascript视频播放器播放视频。我用pal8替换了bgr24,但我得到了一个错误:“调色板大小32767是错误的”。