【问题标题】:How to read binary data from Gstreamer child process on Windows?如何从 Windows 上的 Gstreamer 子进程读取二进制数据?
【发布时间】:2012-04-30 11:26:19
【问题描述】:
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 转换?

【问题讨论】:

  • 你真的应该考虑使用subprocess module而不是os.popen。另外,您使用的是什么版本的 Python?
  • Cygwin 中的“Python 2.6.5”
  • 您是否尝试过在os.popen 调用中指定模式?例如,您可以尝试os.popen("gst-launch ...", "r")os.popen("gst-launch ...", "rb")。前者应该是默认行为,而后者明确指定读取二进制数据。
  • 也试过subprocess.Popen(cam_cmd, shell=True, bufsize=1024, stdout=subprocess.PIPE).stdout - 同样的问题
  • srgerg,试过“rb” - 一样。

标签: python windows binary pipe gstreamer


【解决方案1】:

我认为也许您不应该将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)

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

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

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

我希望这会有所帮助。

【讨论】:

  • subprocess.Popen(["gst-launch", "-q", "whateversrc", ........., "!", "matroskamux", "streamable=true", "!", "fdsink"], shell=False, bufsize=1024, stdout=subprocess.PIPE).stdout - 同样的问题
  • “fdsink”Gstreamer 模块不太可能执行“_binmode(... O_BINARY)”(或其他特定于 Windows 的操作)。如何强制其他进程默认拥有所有句柄二进制?
  • 我很想知道msvcrt.setmode() 的东西是否对您有帮助。请在尝试时发布更新!
  • 如果数据在进入我的程序之前就被破坏了,您认为这会有所帮助吗?它会为我的 python 进程和子进程设置更多二进制文件吗? (在没有手动编译 Gstreamer for windows 的情况下让它工作失去了希望)
  • 我不确定它是如何工作的,但至少有可能如果你在父进程的文件句柄上设置二进制模式,那么后续的子进程将继承该设置,因此所有子进程都将使用二进制模式文件句柄进行通信。很抱歉,我没有安装适用于 Windows 的 GStreamer,我无法为此运行测试。
猜你喜欢
  • 2010-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-24
  • 2011-11-27
  • 2019-03-15
  • 1970-01-01
  • 2011-03-12
相关资源
最近更新 更多