import json import time import subprocess as sp from concurrent.futures import ThreadPoolExecutor from traceback import format_exc import ffmpeg import sys import numpy as np """ 获取视频基本信息 """ def get_video_info(in_file): try: probe = ffmpeg.probe( 'https://vod.play.t-aaron.com/customerTrans/edc96ea2115a0723a003730956208134/55547af9-184f0827dae-0004-f90c-f2c-7ec68.mp4') # format = probe['format'] # size = int(format['size'])/1024/1024 video_stream = next((stream for stream in probe['streams'] if stream['codec_type'] == 'video'), None) if video_stream is None: print('No video stream found', file=sys.stderr) return width = int(video_stream['width']) height = int(video_stream['height']) num_frames = int(video_stream['nb_frames']) up, down = str(video_stream['r_frame_rate']).split('/') fps = eval(up) / eval(down) print("fbs:", fps) # duration = float(video_stream['duration']) bit_rate = int(video_stream['bit_rate']) / 1000 print('width: {}'.format(width)) print('height: {}'.format(height)) # print('num_frames: {}'.format(num_frames)) print('bit_rate: {}k'.format(bit_rate)) # print('fps: {}'.format(fps)) # print('size: {}MB'.format(size)) # print('duration: {}'.format(duration)) return video_stream except Exception as err: if isinstance(err, ffmpeg._run.Error): print(err.stderr.decode(encoding='utf-8')) raise err def aa(p1, in_bytes): try: p1.stdin.write(in_bytes) except Exception: print(format_exc()) if __name__ == '__main__': file_path = 'rtsp://localhost:8554/live' command = ['ffmpeg', '-c:v', 'h264_cuvid', '-i', file_path, '-f', 'rawvideo', '-pix_fmt', 'bgr24', '-an', '-'] p = sp.Popen(command, stdout=sp.PIPE) command1 = ['ffmpeg', '-y', "-an", '-f', 'rawvideo', '-vcodec', 'rawvideo', '-pix_fmt', 'bgr24', '-thread_queue_size', '1024', '-s', "{}x{}".format(1280, 720), '-i', '-', # 指定输入文件 '-r', str(25), '-g', str(25), '-maxrate', '6000k', '-b:v', '4000k', '-c:v', 'h264_nvenc', # '-bufsize', '4000k', '-pix_fmt', 'yuv420p', '-preset', 'p6', '-tune', 'll', '-f', 'flv', "rtmp://192.168.10.101:19350/rlive/stream_124?sign=YJ8aBPFp"] # # 管道配置 p1 = sp.Popen(command1, stdin=sp.PIPE, shell=False) command2 = ['ffmpeg', '-y', "-an", '-f', 'rawvideo', '-vcodec', 'rawvideo', '-pix_fmt', 'bgr24', '-thread_queue_size', '1024', '-s', "{}x{}".format(1280, 720), '-i', '-', # 指定输入文件 '-r', str(25), '-g', str(25), '-maxrate', '6000k', '-b:v', '4000k', '-c:v', 'h264_nvenc', # '-bufsize', '4000k', '-pix_fmt', 'yuv420p', '-preset', 'p6', '-tune', 'll', '-f', 'flv', "rtmp://192.168.10.101:19350/rlive/stream_125?sign=uMdRHj9R"] # # 管道配置 p2 = sp.Popen(command1, stdin=sp.PIPE, shell=False) start1 = time.time() num = 0 with ThreadPoolExecutor(max_workers=100) as t: while True: in_bytes = p.stdout.read(1280 * 720 * 3) if in_bytes: img = (np.frombuffer(in_bytes, np.uint8)).reshape((720, 1280, 3)) for i in range(1): t.submit(aa, p1, in_bytes) t.submit(aa, p2, in_bytes) else: break