问题: 我正在研究多个ip摄像机流的阅读器。应用程序需要在ubuntu AWS EC2实例上运行。我没有成功尝试从RTSP h.264流中可靠地获取和解码帧。
我尝试过的事情: 我已经使用过OpenCV和SciKit-Video的VideoCapture类,它们都不能从我的测试流中获取和解码帧。我已经使用VLC和openRTSP验证了我的测试流是可读的,所以我认为这是一个编码问题。
我还尝试使用python的子进程模块构建一些解决方案来运行上述命令行应用程序。这允许我可靠地读取流,但是它引起了解码器失败的问题,因为它(显然)没有找到解码流所需的关键帧数据。
以下是此示例的代码。它告诉openRTSP定期将一些视频保存为单独的文件,并使用openCV VideoCapture从每个样本中获取单个帧。代码:
def openrtsp_thread(queue, feed_name, source, sample_time, intruder, cleanup=True):
(major, minor, subminor) = (cv2.__version__).split('.')
cmd = 'openRTSP -V -4 -v -P ' + str(sample_time) + ' ' + source
out_dir = '/aws_odw/frame-store/'+feed_name.replace(' ','-')+'/'
try:
os.mkdir(out_dir)
except:
print '[?]['+feed_name+']: Not creating new frame directory'
pass
os.chdir(out_dir)
p = subprocess.Popen(cmd.split(' '))
while True:
try:
for dirs, files, filenames in os.walk(out_dir):
for f in filenames:
cap = cv2.VideoCapture(os.path.join(out_dir, f))
if int(major) < 3:
fps = cap.get(cv2.cv.CV_CAP_PROP_FPS)
else:
fps = cap.get(cv2.CAP_PROP_FPS)
#for i in range(int(float(sample_time)*fps*0.5)):
ret, frame = cap.read()
cap.release()
print 'enqueueing...'
queue.put((feed_name, frame, intruder))
except (KeyboardInterrupt, SystemExit):
print '[x]['+feed_name+']: keyboard interrupt, cleaning up...'
break
p.send_signal(signal.SIGUSR1)
p.wait()
print '[*]['+feed_name+']: exiting gracefully.'
任何人都可以提供任何指示吗?我对视频编码了解不多,所以我感觉很丢失。任何帮助都将非常感激。
编辑:这里的最终目标是在python中对帧进行排队,以便在计算机视觉应用程序中实时进行。