tuoheng_algN/vodsdk/test/ffmpeg11/test222.py

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")