繁体   English   中英

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

[英]How to read binary data from Gstreamer child process on Windows?

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 gst-launch -q ..... ! matroskamux streamable=true ! fdsink > qqq3.mkv 控制台中的gst-launch -q ..... ! matroskamux streamable=true ! fdsink > qqq3.mkv和qqq3.mkv也出现乱码。 gst-launch -q filesrc location=file ! fdsink > file2 gst-launch -q filesrc location=file ! fdsink > file2也将转换为CRLF。

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

可能有一种方法可以在Windows(或给定应用程序)中全局关闭LF-> CRLF转换吗?

我认为也许您不应该在subprocess.Popen()使用shell=True

使用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.bin是一个字节完美复制junk.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父进程中运行上述代码会有所帮助?

如果不是,请尝试相同的技巧,但要使用subprocess.Popen()返回的对象中的stdinstdout句柄。 在上面的代码中,我将该对象绑定到名称p因此它们将是p.stdinp.stdout

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

我希望这有帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM