2016-11-17 17 views
1

используя python3, gtk3. Я работаю над приложением для компьютерного зрения, которому нужно манипулировать и отображать (воспроизводить) кадры из видео.Воспроизведение видео путем извлечения и манипулирования по кадре: создает новый pixbuf в каждом кадре, чтобы идти или есть более простой способ?

В настоящее время я создаю новый Pixbuf со статическим методом new_from_data, питаемой последовательность байтов, созданных из Numpy массива, который содержал манипулируют кадр, и у меня возникли проблемы с производительностью, например, не будучи в состоянии играть видео со скоростью 20 кадров в секунду.

Интересно: это путь для решения этой проблемы? Является ли создание нового Pixbuf для каждого кадра относительно дешевым или дорогим? Должен ли я использовать другие методы, например, используя new_from_stream? (не знакомы с ним)

+0

Попробуйте GStreamer? Я не знаю, сколько будет работать ваша установка ... – andlabs

+0

Объем работы не является проблемой – fstab

+0

Да, создание нового Pixbuf для каждого фрейма очень, очень, дорого. К сожалению, у меня нет хорошего ответа на потоковое видео на лету, потому что оно в значительной степени зависит от того, как вы генерируете фреймы, и других требований, но этот способ, конечно, не самый лучший способ. – ptomato

ответ

2

Это не «простой» способ, но если у вас проблемы с производительностью, попробуйте использовать Clutter через Clutter-Gtk, который будет использовать аппаратное ускорение для рисования кадров.

Вы можете создать виджет GtkClutterEmbed, который предоставит вам ClutterStage, который является ClutterActor. Каждый раз, когда у вас есть новый фрейм, вы можете создать новый ClutterImage и сделать clutter_image_set_data() (что точно так же, как new_from_data для Pixbuf), а затем установить ClutterContent ClutterActor (например: ClutterStage) в качестве нового ClutterImage.

Это то, как Gnome-Ring воспроизводит видео, вы можете взглянуть на его source code here для вдохновения.