LINUX.ORG.RU

Сообщения bomvar74

 

Декодирование потока h.264 из COM-порта

Доброго времени суток. Я хотел бы знать, существует ли «несложный» способ декодирования потока 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 раз в секунду :) Есть ли способ отображать кадры в одном окне для плавного воспроизведения при потоковой передаче видео?

Вообще я сомневаюсь что это правильный и оптимальный подход. Может есть какие-то общепринятые решения? Или может кто знает другое ПО, которое больше подходит для этой задачи? Я не знаю с чего начать, я нашел мало информации в интернете, поэтому буду рад любым подсказкам.

 , , ,

bomvar74
()

RSS подписка на новые темы