Browse Source

first commit

TitanWong 2 years ago
commit
314a669975
1 changed files with 69 additions and 0 deletions
  1. 69 0
      camera.py

+ 69 - 0
camera.py

@@ -0,0 +1,69 @@
+import subprocess as sp
+import time
+import cv2
+import argparse
+
+# 解析参数
+parser = argparse.ArgumentParser()
+parser.add_argument("-i","--inputUrl", help="url of input rtsp url", default="0", type=str, required=False)
+parser.add_argument("-r","--relayUrl", help="url of the video relay server", default="", type=str, required=True)
+parser.add_argument("-d","--debug", help="debug mode, True or False, set to False in prod env", default=False, type=bool, required=False)
+parser.add_argument("-s","--sampleInterval",help="sample 1 image every n images of the video, the bigger the more stuck", default=4, type=int,required=False)
+args = parser.parse_args()
+print(args)
+inputUrl = 0 if args.inputUrl=="0" else args.inputUrl
+relayUrl = args.relayUrl
+debug = args.debug
+sampleInterval = args.sampleInterval
+# 打开视频
+cap=cv2.VideoCapture(inputUrl)
+
+# 执行ffmpeg管道命令
+command= [
+    'ffmpeg',
+    '-f', 'rawvideo',
+    '-vcodec', 'rawvideo',
+    '-pix_fmt', 'bgr24',
+    '-s', '428x240',
+    '-r','30',
+    '-i', '-',
+    '-r','30',
+    '-q', '0',
+    '-codec:v', 'mpeg1video',
+    '-f', 'mpegts',
+    relayUrl
+]
+pipe = sp.Popen(command,stdin=sp.PIPE)
+
+
+# 启动推流子进程,不断推流
+time.sleep(1)
+frame_counter = 0
+while (cap.isOpened()):
+    # print("+++++++++++++", frame_counter)
+    ret, frame = cap.read()
+    if not ret:
+        print("not ret")
+        break
+
+    # 1. 图像写入管道
+    # 模n采样
+
+    if frame_counter%sampleInterval==0:
+        try:
+            frame = cv2.resize(frame, (428, 240))
+            if debug:
+                cv2.imshow("debug",frame)
+                if cv2.waitKey(1)==ord("q"):
+                    print("quit")
+                    break
+            pipe.stdin.write(frame.tostring())
+        except Exception as e:
+            print("may be broken pipe")
+            print(e)
+            break
+    frame_counter = (frame_counter+1)%4
+
+print("break out")
+cap.release()
+pipe.terminate()