123 lines
4.0 KiB
Python
123 lines
4.0 KiB
Python
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
|