从RTSP h.264 IP摄像机读取帧的问题

时间:2016-09-28 20:26:41

标签: python-2.7 ubuntu-14.04 h.264 rtsp ip-camera

问题:  我正在研究多个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中对帧进行排队,以便在计算机视觉应用程序中实时进行。

0 个答案:

没有答案