如何从Windows上的Gstreamer子进程读取二进制数据?

时间:2012-04-18 23:50:33

标签: python windows binary pipe gstreamer

f = os.popen("gst-launch -q whateversrc ! ... ! fdsink")
f.read(1024);

在GNU / Linux上工作正常,但导致\ x0d \ x0a而不是Windows的每个\ x0a。怎么解决?

我还在控制台中尝试了gst-launch -q ..... ! matroskamux streamable=true ! fdsink > qqq3.mkv,qqq3.mkv也出现乱码。 gst-launch -q filesrc location=file ! fdsink > file2也会转换为CRLF。

怎么办?用于Windows的Gstreamer构建没有tcp {server,client} sink ...

可能有办法在Windows(或给定的应用程序)中全局关闭LF-> CRLF转换?

1 个答案:

答案 0 :(得分:0)

我想也许你不应该将shell=Truesubprocess.Popen()一起使用。

使用Windows 7 64位,在Cygwin中运行Python,我编写了这个简单的测试程序:

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.binjunk.bin的字节完美副本,所以我没有看到"\n" - > "\r\n"正在发生的转变。

编辑:我找到了一个看起来很有用的网页:

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)

如果子进程继承了父进程的stdin和stdout文件句柄的二进制模式设置,那么在Python父进程中运行上面的代码会有帮助吗?

如果没有,则尝试相同的技巧,但在stdin返回的对象中的stdoutsubprocess.Popen()句柄上。在上面的代码中,我将该对象绑定到名称p,因此它们将是p.stdinp.stdout

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

我希望这会有所帮助。