|
|
@@ -0,0 +1,89 @@
|
|
|
+import cv2
|
|
|
+import subprocess as sp
|
|
|
+import exetract
|
|
|
+import livePipe
|
|
|
+
|
|
|
+rtspUrl = 'rtsp://localhost:8554/mystream'
|
|
|
+
|
|
|
+# 视频来源 地址需要替换自己的可识别文件地址
|
|
|
+filePath = '/Users/gemer/Desktop/'
|
|
|
+testPath = '/Users/gemer/Desktop/test-video/'
|
|
|
+camera = cv2.VideoCapture(
|
|
|
+ filePath+"test.mkv") # 从文件读取视频
|
|
|
+
|
|
|
+names = ['output000.mkv', 'output001.mkv', 'output001.mkv', 'output001.mkv']
|
|
|
+
|
|
|
+
|
|
|
+# 视频属性
|
|
|
+size = (int(camera.get(cv2.CAP_PROP_FRAME_WIDTH)),
|
|
|
+ int(camera.get(cv2.CAP_PROP_FRAME_HEIGHT)))
|
|
|
+sizeStr = str(size[0]) + 'x' + str(size[1])
|
|
|
+fps = camera.get(cv2.CAP_PROP_FPS) # 30p/self
|
|
|
+# fps = 24
|
|
|
+
|
|
|
+fps = int(fps)
|
|
|
+hz = int(1000.0 / fps)
|
|
|
+print('size:' + sizeStr + ' fps:' + str(fps) + ' hz:' + str(hz))
|
|
|
+
|
|
|
+
|
|
|
+# 主视频文件输出
|
|
|
+# fourcc = cv2.VideoWriter_fourcc(*'XVID')
|
|
|
+fourcc = cv2.VideoWriter_fourcc('H', '2', '6', '4')
|
|
|
+out = cv2.VideoWriter(filePath + 'res_mv.avi', fourcc, fps, size)
|
|
|
+
|
|
|
+# caps = [cv2.VideoCapture(testPath+i) for i in names]
|
|
|
+
|
|
|
+# print('cap', caps)
|
|
|
+# for x in caps:
|
|
|
+# print(x)
|
|
|
+# fourcc = cv2.VideoWriter_fourcc('H', '2', '6', '4')
|
|
|
+# fps = int(fps)
|
|
|
+# hz = int(1000.0 / fps)
|
|
|
+
|
|
|
+
|
|
|
+# 直播管道输出
|
|
|
+# ffmpeg推送rtmp 重点 : 通过管道 共享数据的方式
|
|
|
+command = ['ffmpeg',
|
|
|
+ '-y',
|
|
|
+ '-hide_banner',
|
|
|
+ # '-loglevel', 'warning',
|
|
|
+ # '-hwaccel', 'videotoolbox',
|
|
|
+ '-f', 'rawvideo',
|
|
|
+ '-vcodec', 'rawvideo',
|
|
|
+ '-pix_fmt', 'bgr24',
|
|
|
+ '-s', sizeStr,
|
|
|
+ '-r', str(fps),
|
|
|
+ '-i', '-',
|
|
|
+ '-b:v', '3000K',
|
|
|
+ # '-c:v', 'h264_videotoolbox',
|
|
|
+ '-c:v', 'libx264',
|
|
|
+ '-pix_fmt', 'yuv420p',
|
|
|
+ '-preset', 'ultrafast',
|
|
|
+ '-f', 'rtsp',
|
|
|
+ rtspUrl]
|
|
|
+# 管道特性配置
|
|
|
+# pipe = sp.Popen(command, stdout = sp.PIPE, bufsize=10**8)
|
|
|
+# pipe = sp.Popen(command, stdin=sp.PIPE, bufsize=10**8) # ,shell=False
|
|
|
+newPipe = livePipe.LivePipe(size, 30)
|
|
|
+
|
|
|
+# pipe.stdin.write(frame.tostring())
|
|
|
+while True:
|
|
|
+ ret, frame = camera.read() # 逐帧采集视频流
|
|
|
+ # if not ret:
|
|
|
+ # break
|
|
|
+ if cv2.waitKey(1) & 0xFF == ord('q'):
|
|
|
+ break
|
|
|
+ # 图片输出
|
|
|
+ # 结果帧处理 存入文件 / 推流 / ffmpeg 再处理
|
|
|
+ # print('frame', frame)
|
|
|
+ newPipe.stdin.write(frame.tobytes()) # 存入管道用于直播
|
|
|
+ out.write(frame) # 同时 存入视频文件 记录直播帧数据
|
|
|
+ pass
|
|
|
+
|
|
|
+
|
|
|
+camera.release()
|
|
|
+# Release everything if job is finished
|
|
|
+out.release()
|
|
|
+# out.release()
|
|
|
+
|
|
|
+print("Over!")
|