Способ графического представления пакета байт

Рейтинг: 1Ответов: 0Опубликовано: 03.02.2023

Ситуация такая - программа на питоне принимает через gstreamer поток данных(аудио) по rtp. Cнимаю с помощью API Gi данные со входа приемника udpsrc. Получаю пакеты данных по 4096 байт - это маленькие куски аудио кода морзе. Мне нужно каким-то образом эти данные визуализировать. Желательно с помощью matplotlib или PyQt5.

То есть мне нужно создать визуализацию получаемого по rtp аудио. Желательно получить вот примерно такую картину в которой я могу продемонстрировать все полученные за время передачи аудио данные. Суть в том, что бы можно было морзянку не только прослушать, но и просмотреть. Пример картинки которую я хочу в итоге получить:

введите сюда описание изображения

Я уже попробовал решать эту задачу через matplotlib, но получается, признаться какая-то ерунда - скачущая на одном месте гистограмма.

Дефолтные визуализаторы gstreamer для этого, увы, не годятся просто по той причине, что они постоянно обновляются и с помощью них нельзя получить картины всех полученных данных за все время приема(ну или я просто неправильно прочитал документацию).

Я пробовал использовать вот такой код - это пример с самого matlib. К сожалению я никак не соображу как сохранять отрисованное значение и дополнять его новым, так что бы потом можно было просмотреть всю картину:

HIST_BINS = np.linspace(100, 1000, 100)

class Draw:

    def __init__(self, queue=None):
        self.__blank_line = []
        self.__queue = queue
        self.__data = None
        self.__data_now = [0] * 4096
        self.__count = 0

    def prepare_animation(self, bar_container):
        def animate(frame_number):

            if not self.__queue.empty():
                self.__data_now = self.__queue.get(True, 1)

            n, _ = np.histogram(self.__data_now, HIST_BINS)
            for count, rect in zip(n, bar_container.patches):
                rect.set_height(count)
            return bar_container.patches

        return animate

    def start(self):
        fig, ax = plt.subplots()

        plt.gca().set_axis_off()
        plt.subplots_adjust(top=1, bottom=0, right=1, left=0, hspace=0, wspace=0)
        plt.margins(0, 0)
        data = 0
        _, _, bar_container = ax.hist(data, HIST_BINS, lw=1, ec="black", fc="blue", alpha=0.5)
        ax.set_ylim(top=255)  

        ani = animation.FuncAnimation(fig, self.prepare_animation(bar_container), interval=50, repeat=False, blit=True)
        plt.show()

Ответы

Ответов пока нет.