from traceback import format_exc import cv2 import numpy as np from loguru import logger import subprocess as sp from common import Constant from enums.ExceptionEnum import ExceptionType from exception.CustomerException import ServiceException from util.Cv2Utils import push_video_stream, clear_pull_p pull_p = None push_p =None p_push_status=[0,0] def start_pull_p(pull_url, requestId): try: command = ['ffmpeg'] # if pull_url.startswith("rtsp://"): # command.extend(['-timeout', '20000000', '-rtsp_transport', 'tcp']) # if pull_url.startswith("http") or pull_url.startswith("rtmp"): # command.extend(['-rw_timeout', '20000000']) command.extend(['-re', '-y', '-an', # '-hwaccel', 'cuda', cuvid '-c:v', 'h264_cuvid', # '-resize', self.wah, '-i', pull_url, '-f', 'rawvideo', # '-pix_fmt', 'bgr24', '-r', '25', '-']) return sp.Popen(command, stdout=sp.PIPE) except ServiceException as s: logger.error("构建拉流管道异常: {}, requestId:{}", s.msg, requestId) raise s except Exception as e: logger.error("构建拉流管道异常:{}, requestId:{}", format_exc(), requestId) raise e def pull_read_video_stream(pull_p, pull_url, width, height, width_height_3, w_2, h_2, requestId): result = None try: if pull_p is None: pull_p = start_pull_p(pull_url, requestId) in_bytes = pull_p.stdout.read(width_height_3) if in_bytes is not None and len(in_bytes) > 0: try: # result = (np.frombuffer(in_bytes, np.uint8).reshape([height * 3 // 2, width, 3])) # ValueError: cannot reshape array of size 3110400 into shape (1080,1920) result = (np.frombuffer(in_bytes, np.uint8)).reshape((height, width)) result = cv2.cvtColor(result, cv2.COLOR_YUV2BGR_NV12) # result = cv2.cvtColor(result, cv2.COLOR_RGB2BGR) if result.shape[1] > Constant.width: result = cv2.resize(result, (result.shape[1] // 2, result.shape[0] // 2), interpolation=cv2.INTER_LINEAR) except Exception: logger.error("视频格式异常:{}, requestId:{}", format_exc(), requestId) raise ServiceException(ExceptionType.VIDEO_RESOLUTION_EXCEPTION.value[0], ExceptionType.VIDEO_RESOLUTION_EXCEPTION.value[1]) except ServiceException as s: clear_pull_p(pull_p, requestId) raise s except Exception: clear_pull_p(pull_p, requestId) pull_p = None width = None height = None width_height_3 = None logger.error("读流异常:{}, requestId:{}", format_exc(), requestId) return result, pull_p, width, height, width_height_3 while True: frame, pull_p, width, height, width_height_3 = pull_read_video_stream(pull_p, 'rtmp://live.play.t-aaron.com/live/THSAr', 1920, 1080*3//2, 1920*1080*3//2, 960, 540, '111') if frame is not None: push_p = push_video_stream(frame, push_p, 'rtmp://live.push.t-aaron.com/live/THSAs', p_push_status, '11') clear_pull_p(pull_p, "11111") close_all_p(push_p, None, None, "11111")