2
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 转换?

4

1 回答 1

0

我想也许你不应该使用shell=Truewith subprocess.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.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)

如果子进程继承了父进程的标准输入和标准输出文件句柄的二进制模式设置,那么在您的 Python 父进程中运行上述代码可能会有所帮助?

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

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

我希望这有帮助。

于 2012-04-19T01:41:28.060 回答