среда, 18 февраля 2009 г.

Python, subprocess и MPlayer

Какое-то время назад возникла проблема играть из программы звук в нечеловеческих форматах. Кроссплатформено. Сначала я хотел использовать существующие библиотеки (Audiere например), но в конце-концов решил использовать MPlayer в slave mode. Всё работает БОДРЯЧКОМ под Linux естественно. А под Windows?

А ситуация с Windows описывается словом "жопа". Научить MPlayer понимать команды я не смог (что-то с пайпами, лень возиться). К счастью бегать по одному треку или ставить на паузу не надо, процесс можно просто убивать. Просто хак с проверкой что мы под Windows и всё.

Новая проблема возникла далее - MPlayer просто не запускался. Если программа запускается из консоли или собирается с помощью py2exe как console - всё ОК, но как GUI не работает. Проблема оказалась снова в пайпах. Решение - при создании процесса с помощью subprocess.Popen задать все потоки (stdin, stdout, stderr), а не только нужные нам.

Но тут вылезла проблема номер 3. MPlayer выкидывал некрасивое пустое консольное окошечко поверх нашей Qt-морды. Решение было найдено в гугле минуты за 2 тут

В итоге всё даже работает. Осталось только поизучать исходники SMPlayer'а чтобы узнать как обойтись без хаков. А всё почему? Потому что Windows - говно.