python - OpenCV 帧到 FFMPEG
问题描述
我有一个消费序列化 OpenCV 帧的 Kafka 消费者。在消费者中,我试图将其写入输出文件以用于流式传输。我的最终目标是将这些帧流式传输到 Web 浏览器或任何其他客户端。
但是当我写视频输出时,由于损坏或其他原因,它没有播放。
#ffmpeg
ffmpeg = 'ffmpeg'
dimension = '{}x{}'.format(1280, 622)
f_format = 'bgr24' # remember OpenCV uses bgr format
fps = str(fps)
output_file = 'videos/encoded/out.mp4'
command = [ffmpeg,
'-y',
'-f', 'rawvideo',
'-vcodec','rawvideo',
'-s', dimension,
'-pix_fmt', 'bgr24',
'-r', fps,
'-i', '-',
'-an',
'-vcodec', 'mpeg4',
'-b:v', '5000k',
output_file ]
proc = sp.Popen(command, stdin=sp.PIPE, stderr=sp.PIPE)
try:
while True:
msg = consumer.poll(1.0)
if msg is None:
continue
if msg.error():
print("Consumer error: {}".format(msg.error()))
continue
nparr = np.frombuffer(msg.value(), np.uint8)
img = cv2.imdecode(nparr, cv2.IMREAD_COLOR)
if img is not None:
proc.stdin.write(img.tostring())
except KeyboardInterrupt:
print("Detected Keyboard Interrupt. Quitting...")
pass
finally:
consumer.close()
proc.stdin.close()
proc.stderr.close()
proc.wait()
这是我尝试过的代码。这会写入输出视频,但无法播放。当我使用 OpenCV 中的 VideoWriter 时,它工作正常。但问题是我没有办法在消费者while循环中释放。我能做些什么来解决这个问题?
解决方案
推荐阅读
- python - 如何让 celery 与 SCL python 和 systemd 一起工作?
- c# - 如何在 NPoco 中获取插入数据的 ID?
- javascript - mdbootstrap 灯箱不工作
- angular-material - 具有动态输入的角垫自动完成
- javascript - 无法将类添加到元素子项
- swift - 类变量未在 firebase 闭包内修改
- android - 避免使用 RxJava 的 Thread.sleep
- android - Firebase 对列入白名单的链接说“域未列入白名单”
- angular - 无法读取 Angular 2 中未定义的属性“错误”?
- datepicker - 从 kartik/date/datepicker 中删除工具提示