2016-11-07 137 views
1

我在写入内存缓冲区中的x264视频(或单个帧)时遇到问题。在opencv中,图像,imencode和imdecode完成这个任务。但我想保存x264视频帧以降低内存使用量并在互联网上发送。我能够使用jpeg,但是JPEG尺寸大于x264视频帧和质量要差得多。我搜索,但我无法找到我如何写缓冲区的视频帧。Python-Opencv在内存缓冲区中写入x264视频

下面是示例代码来承担网络摄像头

 import numpy as np 
     import cv2 


     cap = cv2.VideoCapture(0) 
     cap.set(3,320) 
     cap.set(4,240) 
     cap.set(5,30) 
     # Define the codec and create VideoWriter object 
     fourcc = cv2.VideoWriter_fourcc(*'x264') 
     out = cv2.VideoWriter('.....sample.avi',fourcc, 30.0, (320,240)) 

     while(cap.isOpened()): 
      ret, frame = cap.read() 
      if ret==True: 
       cv2.imshow('frame',frame) 
       out.write(frame) #I want to write memory not disk 
       if cv2.waitKey(1) & 0xFF == ord('q'): 
        break 
      else: 
       break 

     # Release everything if job is finished 
     cap.release() 
     out.release() 
     cv2.destroyAllWindows() 
+0

你能否详细说明一下,因为我不知道你在做什么。你想创建一个包含图像帧的视频文件吗?或者是其他东西?无论哪种方式,我不知道x264播放与AVI容器,我会尝试MKV代替 –

+0

其实我试图通过udp或tcp/ip通过网络发送相机帧。我成功发送了jpg图像(一帧发送并发送下一帧)。但我想发送x264压缩mkv或avi视频(或一帧顺序)文件,因为x264压缩比jpg更有效率(也更好的质量,我认为)我可以写在磁盘上,但我想写在内存上(如numpy阵列..)x264视频帧,因为我必须序列化(使用pickle或json)视频帧并通过套接字发送。我在网上搜索,但我找不到我该怎么办?我觉得这个解释很清楚。这是我的问题。 – faxcon

+0

我不确定这是可能的,因为Python版本的OpenCV仅仅使用numpy来处理矩阵,可以进行腌制,序列化等。对于视频流,OpenCV(C++和Python)都使用FFMPEG(libav),其对象不能以相同的方式工作。你要在流媒体之前修改内容吗?即你真的需要OpenCV,还是可以使用另一个库直接流式传输内容? –

回答

2

不幸的是帧,也没有办法做cv2.VideoWriter,因为你不能前out.release到达编码的视频帧()

我发现我的项目的方式是从d实施cap_ffmpeg_impl.hpp:\ your_directory \ OpenCV的\ \源模块\ highgui的\ src并在该库将您拍摄的帧。您将通过UDP或TCP/IP发送编码帧,并使用相同的库解码它们到达的位置。另外请记住,您需要编译右键ffmpeg版本才能使用它。

+0

我怎样才能发送这个帧库,我怎样才能达到套接字发送? – faxcon

+0

你可以找到一个[示例项目](https://github.com/dimitrs/video_coding/blob/master/test.cpp),它使用** cap_ffmpeg_impl.hpp **与opencv和x264视频编解码器进行视频流传输。 –