80 lines
3.5 KiB
Python
80 lines
3.5 KiB
Python
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") |