Доброго времени суток. Я хотел бы знать, существует ли «несложный» способ декодирования потока H.264 в формате NAL, поступающего через COM-порт, с помощью программного обеспечения?
В настоящий момент я могу покадрово декодировать поток с помощью скрипта на python. В этом скрипте я сначала записываю входящие данные в файл, и когда появляется маркер конца кадра 00_00_00_01, я отображаю кадр с помощью медиаплеера от ffmpeg - ffplay.
import serial
import subprocess
import os
import time
# Открываем последовательный порт (замени 'COM3' на свой порт)
ser = serial.Serial('COM3', 115200, timeout=1)
# Путь к файлу
output_file = "output.264"
# Переменная для хранения процесса ffplay
ffplay_process = None
# Открываем файл для записи в бинарном режиме
with open(output_file, "wb") as file:
print("Запись байтов в output.264. Ожидание окончания кадра 0x00000001.")
buffer = bytearray()
marker = b'\x00\x00\x00\x01'
try:
while True:
if ser.in_waiting: # Если в буфере есть данные
data = ser.read(ser.in_waiting) # Читаем все доступные байты
buffer.extend(data)
# Проверяем, есть ли маркер окончания кадра в буфере
while marker in buffer:
index = buffer.index(marker) + len(marker) # Позиция после маркера
frame = buffer[:index] # Извлекаем кадр
buffer = buffer[index:] # Оставляем остаток
print(f"Кадр записан: {len(frame)} байт")
file.write(frame) # Записываем кадр в файл
file.flush() # Принудительная запись на диск
# Закрываем окно ffplay, если оно уже открыто
if ffplay_process and ffplay_process.poll() is None:
ffplay_process.terminate()
ffplay_process.wait() # Дожидаемся завершения процесса
# Воспроизводим записанный кадр, окно открывается заново
ffplay_process = subprocess.Popen(["ffplay", "-f", "h264", "-i", output_file])
except KeyboardInterrupt:
print("\nЗапись завершена.")
finally:
# Закрываем порт и процесс ffplay
ser.close()
Однако каждый раз, когда обнаруживается новый маркер конца кадра, окно ffplay закрывается и снова открывается для отображения следующего кадра. При передаче видео это окно будет открываться-закрываться 30 раз в секунду :) Есть ли способ отображать кадры в одном окне для плавного воспроизведения при потоковой передаче видео?
Вообще я сомневаюсь что это правильный и оптимальный подход. Может есть какие-то общепринятые решения? Или может кто знает другое ПО, которое больше подходит для этой задачи? Я не знаю с чего начать, я нашел мало информации в интернете, поэтому буду рад любым подсказкам.