tuoheng_algN/vodsdk/test/ffmpeg11/test1.py

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