Шина Gstreamer вызывает многопроцессорность icw python, что приводит к ошибкам X-сервера в Ubuntu
Я написал видеоплеер в gstreamer, как указано здесь: https://github.com/dschreij/media_player_gst/blob/master/media_player_gst.py
В Windows он работает нормально в "нормальном" и многопроцессорном режимах (то есть все части Gstreamer и объект player создаются в отдельном процессе). В Ubuntu 13.10, однако, когда игрок запускает в своем собственном процессе вызов
self.bus.peek() # Reference to the playbin2 player's bus
вызывает следующую ошибку и приводит к сбою всей программы (также родительского процесса):
python: Fatal IO error 11 (Resource temporarily unavailable) on X server :0.
python: Fatal IO error 4 (Interrupted system call) on X server :0.
В противном случае игрок работает нормально в новом процессе. Только вызов self.bus.peek() приводит к сбою. Мне нужно было проверить наличие событий в самой очереди шины, потому что подключение шины к функции, которая обрабатывает ее сообщения, также, похоже, не работало (снова только в Ubuntu!)
В основном я использую шину только для того, чтобы увидеть, достигнут ли конец потока (gst.MESSAGE_EOS), поэтому, если это возможно определить без использования шины playbin2, я тоже согласен с таким решением. Есть ли кто-нибудь, кто мог бы помочь мне с этим?
1 ответ
В то же время я нашел ответ в основном в этой теме:
http://gstreamer-devel.966125.n4.nabble.com/fork-and-then-use-gstreamer-functions-td972935.html
Использование gstreamer в разветвленных процессах - непростая задача, поскольку могут возникнуть конфликты доступа в отношении основного цикла gst и задействованных ресурсов. Тем не менее, gst.Bus.pop() не взаимодействует с внутренней структурой цикла gst (что явно делают peek() и poll()), и с помощью gst.Bus.pop () я смог получить сообщения с шины без проблем!