首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Windows上读取GStreamer子进程中的二进制数据?

如何在Windows上读取GStreamer子进程中的二进制数据?
EN

Stack Overflow用户
提问于 2012-04-19 07:50:33
回答 1查看 1.7K关注 0票数 2
代码语言:javascript
复制
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。

该怎么办呢?Gstreamer build for windows没有tcp{server,client}接收器...

也许有一种方法可以在Windows中全局关闭LF->CRLF转换(或者对于给定的应用程序)?

EN

回答 1

Stack Overflow用户

发布于 2012-04-19 09:41:28

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

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

代码语言:javascript
复制
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/

代码语言:javascript
复制
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

代码语言:javascript
复制
msvcrt.setmode(p.stdin.fileno(), os.O_BINARY)
msvcrt.setmode(p.stdout.fileno(), os.O_BINARY)

我希望这能帮到你。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10219759

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档