Способ графического представления пакета байт
Ситуация такая - программа на питоне принимает через 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()