Я работаю над проектом по потоковой передаче видеофайла H.264 с использованием RabbitMQ (протокол AMQP) и его отображению в веб-приложении. Настройка включает захват видеокадров, их кодирование, отправку в RabbitMQ, а затем их использование и декодирование на стороне веб-приложения с помощью Flask и Flask-SocketIO.
Однако я сталкиваюсь с проблемой производительности. проблемы со скоростью публикации и подписки в RabbitMQ. Кажется, я не могу достичь более 10 сообщений в секунду. Этого недостаточно для плавной потоковой передачи видео.
Мне нужна помощь в диагностике и устранении узких мест в производительности.
Вот мой код:
app = Flask(__name__)
CORS(app)
socketio = SocketIO(app, cors_allowed_origins="*")
RABBITMQ_HOST = 'localhost'
EXCHANGE = 'DRONE'
CAM_LOCATION = 'Out_Front'
QUEUE_NAME = f'DRONE_{CAM_LOCATION}_video_queue'
def initialize_rabbitmq():
connection = pika.BlockingConnection(pika.ConnectionParameters(RABBITMQ_HOST))
channel = connection.channel()
channel.exchange_declare(exchange=EXCHANGE, exchange_type='direct')
channel.queue_declare(queue=QUEUE_NAME)
channel.queue_bind(exchange=EXCHANGE, queue=QUEUE_NAME, routing_key=f'DRONE_{CAM_LOCATION}')
return connection, channel
def decode_frame(frame_data):
# FFmpeg command to decode H.264 frame data
ffmpeg_path = 'ffmpeg/bin/ffmpeg.exe'
cmd = [
ffmpeg_path,
'-f', 'h264',
'-i', 'pipe:0',
'-pix_fmt', 'bgr24',
'-vcodec', 'rawvideo',
'-an', '-sn',
'-f', 'rawvideo',
'pipe:1'
]
process = subprocess.Popen(cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
start_time = time.time() # Start timing the decoding process
out, err = process.communicate(input=frame_data)
decoding_time = time.time() - start_time # Calculate decoding time
if process.returncode != 0:
print("ffmpeg error: ", err.decode())
return None
frame_size = (960, 1280, 3) # frame dimensions expected by the frontend
frame = np.frombuffer(out, np.uint8).reshape(frame_size)
print(f"Decoding time: {decoding_time:.4f} seconds")
return frame
def format_timestamp(ts):
dt = datetime.fromtimestamp(ts)
return dt.strftime('%H:%M:%S.%f')[:-3]
def rabbitmq_consumer():
connection, channel = initialize_rabbitmq()
for method_frame, properties, body in channel.consume(QUEUE_NAME):
message_receive_time = time.time() # Time when the message is received
# Extract the timestamp from the message body
timestamp_bytes = body[:8]
frame_data = body[8:]
publish_timestamp = struct.unpack('d', timestamp_bytes)[0]
print(f"Message Receive Time: {message_receive_time:.4f} ({format_timestamp(message_receive_time)})")
print(f"Publish Time: {publish_timestamp:.4f} ({format_timestamp(publish_timestamp)})")
frame = decode_frame(frame_data)
decode_time = time.time() - message_receive_time # Calculate decode time
if frame is not None:
_, buffer = cv2.imencode('.jpg', frame)
frame_data = buffer.tobytes()
socketio.emit('video_frame', {'frame': frame_data, 'timestamp': publish_timestamp}, namespace='/')
emit_time = time.time() # Time after emitting the frame
# Log the time taken to emit the frame and its size
rtt = emit_time - publish_timestamp # Calculate RTT from publish to emit
print(f"Current Time: {emit_time:.4f} ({format_timestamp(emit_time)})")
print(f"RTT: {rtt:.4f} seconds")
print(f"Emit time: {emit_time - message_receive_time:.4f} seconds, Frame size: {len(frame_data)} bytes")
channel.basic_ack(method_frame.delivery_tag)
@app.route('/')
def index():
return render_template('index.html')
@socketio.on('connect')
def handle_connect():
print('Client connected')
@socketio.on('disconnect')
def handle_disconnect():
print('Client disconnected')
if __name__ == '__main__':
consumer_thread = threading.Thread(target=rabbitmq_consumer)
consumer_thread.daemon = True
consumer_thread.start()
socketio.run(app, host='0.0.0.0', port=5000)
Как оптимизировать скорость публикации и подписки, чтобы обрабатывать большее количество сообщений в секунду?
Будем очень благодарны за любую помощь или предложения!
Я пытался использовать многопоточность и многопроцессорную обработку для одновременной обработки нескольких кадров, а также пытался оптимизировать функцию декодирования кадров, чтобы сделать ее быстрее, но безуспешно.>
Я работаю над проектом по потоковой передаче видеофайла H.264 с использованием RabbitMQ (протокол AMQP) и его отображению в веб-приложении. Настройка включает захват видеокадров, их кодирование, отправку в RabbitMQ, а затем их использование и декодирование на стороне веб-приложения с помощью Flask и Flask-SocketIO. Однако я сталкиваюсь с проблемой производительности. проблемы со скоростью публикации и подписки в RabbitMQ. Кажется, я не могу достичь более 10 сообщений в секунду. Этого недостаточно для плавной потоковой передачи видео. Мне нужна помощь в диагностике и устранении узких мест в производительности. Вот мой код: [list] [*]Скрипт захвата и публикации видео: [/list] [code]# RabbitMQ setup RABBITMQ_HOST = 'localhost' EXCHANGE = 'DRONE' CAM_LOCATION = 'Out_Front' KEY = f'DRONE_{CAM_LOCATION}' QUEUE_NAME = f'DRONE_{CAM_LOCATION}_video_queue'
# Path to the H.264 video file VIDEO_FILE_PATH = 'videos/FPV.h264'
def capture_video(channel): """Read video from the file, encode frames, and send them to RabbitMQ.""" if not os.path.exists(VIDEO_FILE_PATH): logging.error("Error: Video file does not exist.") return cap = cv2.VideoCapture(VIDEO_FILE_PATH) if not cap.isOpened(): logging.error("Error: Could not open video file.") return try: while True: start_time = time.time() ret, frame = cap.read() read_time = time.time() - start_time if not ret: break frame_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) frame_rgb = np.ascontiguousarray(frame_rgb) # Ensure the frame is contiguous send_frame(channel, frame_rgb) cv2.imshow('Video', frame) if cv2.waitKey(1) & 0xFF == ord('q'): break logging.info(f"Read time: {read_time:.4f} seconds") finally: cap.release() cv2.destroyAllWindows() [/code] [list] [*]бэкэнд (flask): [/list] [code]app = Flask(__name__) CORS(app) socketio = SocketIO(app, cors_allowed_origins="*")
def rabbitmq_consumer(): connection, channel = initialize_rabbitmq() for method_frame, properties, body in channel.consume(QUEUE_NAME): message_receive_time = time.time() # Time when the message is received
# Extract the timestamp from the message body timestamp_bytes = body[:8] frame_data = body[8:] publish_timestamp = struct.unpack('d', timestamp_bytes)[0]
if frame is not None: _, buffer = cv2.imencode('.jpg', frame) frame_data = buffer.tobytes() socketio.emit('video_frame', {'frame': frame_data, 'timestamp': publish_timestamp}, namespace='/') emit_time = time.time() # Time after emitting the frame
# Log the time taken to emit the frame and its size rtt = emit_time - publish_timestamp # Calculate RTT from publish to emit print(f"Current Time: {emit_time:.4f} ({format_timestamp(emit_time)})") print(f"RTT: {rtt:.4f} seconds") print(f"Emit time: {emit_time - message_receive_time:.4f} seconds, Frame size: {len(frame_data)} bytes") channel.basic_ack(method_frame.delivery_tag)
[/code] Как оптимизировать скорость публикации и подписки, чтобы обрабатывать большее количество сообщений в секунду? Будем очень благодарны за любую помощь или предложения! Я пытался использовать многопоточность и многопроцессорную обработку для одновременной обработки нескольких кадров, а также пытался оптимизировать функцию декодирования кадров, чтобы сделать ее быстрее, но безуспешно.>
Я работаю над проектом по потоковой передаче видеофайла H.264 с использованием RabbitMQ (протокол AMQP) и его отображению в веб-приложении. Настройка включает в себя захват видеокадров, их кодирование, отправку в RabbitMQ, а затем их использование и...
Я читаю из публикации/подписки, используя скользящие окна Dataflow, применяю некоторые преобразования перед созданием сущностей и записываю в собственный формат Firestore. Я вижу, что луч не поддерживает встроенную библиотеку ввода-вывода Firestore,...
У меня есть конечная точка, которая передает List как IAsyncEnumerable в ответе, и поэтому при использовании в браузере ответ загружается с эффектом потоковой передачи по мере записи данных в поток ответа.
Теперь у меня также есть сквозное...
I have 2 search form where user can search the celebrity name, in the result, Post Title, Post Featured Image, Post Exrept and Post full content shows. Everything is okay to show but full post content is not showing. Below is my code:
Кто-нибудь знает, оптимизирует ли API Android Transformer входное видео для потоковой передачи через Интернет (путем перемещения атома moov вперед)? Есть ли какие-либо настройки, которые вы можете установить для этого?