2012-04-18 2 views
2
f = os.popen("gst-launch -q whateversrc ! ... ! fdsink") 
f.read(1024); 

Работает отлично на GNU/Linux, но приводит к \ x0d \ x0a вместо каждого \ x0a Windows. Как исправить?Как читать двоичные данные из дочернего процесса Gstreamer в Windows?

Я также пробовал только gst-launch -q ..... ! matroskamux streamable=true ! fdsink > qqq3.mkv в консоли и qqq3.mkv также искажен. gst-launch -q filesrc location=file ! fdsink > file2 также преобразуется в CRLF.

Что делать? Gstreamer build для windows не имеет tcp {server, client} sink ...

Может быть, есть способ отключить это преобразование LF-> CRLF глобально в Windows (или для данного приложения)?

+0

Вы должны действительно рассмотреть возможность использования модуля [subprocess] (http://docs.python.org/library/subprocess.html#module-subprocess), а не 'os.popen'. Кроме того, какую версию Python вы используете? – srgerg

+0

«Python 2.6.5» в Cygwin –

+0

Вы пытались указать режим вызова 'os.popen'? Например, вы можете попробовать либо «os.popen» («gst-launch ...», «r») 'или' os.popen («gst-launch ...», «rb») '. Первый должен быть по умолчанию, а последний явно указывает чтение двоичных данных. – srgerg

ответ

0

Возможно, вы не должны использовать shell=True с subprocess.Popen().

Использование Windows 7 64-бит, с Python работает в Cygwin, я написал эту простую тестовую программу:

import subprocess as sp 

p = sp.Popen(['cat', 'junk.bin'], stdin=sp.PIPE, stdout=sp.PIPE, stderr=sp. 
PIPE) 
stdin, stdout = p.communicate() 

with open('junk1.bin', "wb") as f: 
    f.write(stdin) 

Для меня junk1.bin побайтные идеальный экземпляр junk.bin, поэтому я не видя "\n" ->"\r\n" Преобразование, которое происходит с вами.

EDIT: Я нашел веб-страницу, которая выглядит полезным:

http://blog.rubypdf.com/2009/11/03/how-to-let-python-send-binary-data-to-stdout-under-windows/

import sys 

if sys.platform == "win32": 
    import os, msvcrt 
    msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY) 

Если дочерний процесс наследует бинарные настройки режима из стандартного устройства ввода и файлов STDOUT ручками родительского процесса, то, возможно, выполнение вышеуказанного кода в родительском процессе Python поможет?

Если это не так, попробуйте тот же трюк, но на stdin и stdout ручками в объекте, возвращаемом subprocess.Popen(). В моем коде выше, я связываю этот объект с именем p, чтобы они были p.stdin и p.stdout:

msvcrt.setmode(p.stdin.fileno(), os.O_BINARY) 
msvcrt.setmode(p.stdout.fileno(), os.O_BINARY) 

Я надеюсь, что это помогает.

+0

'subprocess.Popen ([" gst-launch "," -q "," whateversrc ", .........,"! "," Matroskamux "," streamable = true ","! ", «fdsink»], shell = False, bufsize = 1024, stdout = subprocess.PIPE) .stdout' - те же проблемы –

+0

Очень маловероятно, что модуль «fdsink» Gstreamer делает «_binmode (... O_BINARY)» (или другие Windows -специфические вещи). Как заставить другой процесс иметь все дескрипторы по умолчанию? –

+0

Мне любопытно узнать, поможет ли вам 'msvcrt.setmode()' материал. Пожалуйста, опубликуйте обновление при попытке! – steveha

Смежные вопросы