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

Python 如何在Windows上从Gstreamer子进程读取二进制数据?,python,windows,binary,pipe,gstreamer,Python,Windows,Binary,Pipe,Gstreamer,在GNU/Linux上工作正常,但会导致\x0d\x0a而不是Windows的每个\x0a。如何修复 我也试过了,gst-launch-q!matroskamux streamable=真!控制台中的fdsink>qq3.mkv,qq3.mkv也出现了乱码gst启动-q filesrc location=file!fdsink>file2也会转换为CRLF 怎么办?windows的Gstreamer生成没有tcp{server,client}接收器 是否有一种方法可以在Windows中全局关闭L

在GNU/Linux上工作正常,但会导致\x0d\x0a而不是Windows的每个\x0a。如何修复

我也试过了,
gst-launch-q!matroskamux streamable=真!控制台中的fdsink>qq3.mkv
,qq3.mkv也出现了乱码<代码>gst启动-q filesrc location=file!fdsink>file2也会转换为CRLF

怎么办?windows的Gstreamer生成没有tcp{server,client}接收器


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

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

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

f = os.popen("gst-launch -q whateversrc ! ... ! fdsink")
f.read(1024);
对我来说,
junk1.bin
junk.bin
的一个字节完美副本,所以我没有看到发生在你身上的
“\n”
->
“\r\n”
转换

编辑:我发现一个看起来很有用的网页:

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

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

import sys

if sys.platform == "win32":
    import os, msvcrt
    msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)

我希望这能有所帮助。

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

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

f = os.popen("gst-launch -q whateversrc ! ... ! fdsink")
f.read(1024);
对我来说,
junk1.bin
junk.bin
的一个字节完美副本,所以我没有看到发生在你身上的
“\n”
->
“\r\n”
转换

编辑:我发现一个看起来很有用的网页:

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

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

import sys

if sys.platform == "win32":
    import os, msvcrt
    msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)

我希望这有帮助。

你应该考虑使用而不是<代码> OS.POPON 。另外,您使用的是什么版本的Python?“Cygwin中的Python 2.6.5”您是否尝试过在
os.popen
调用中指定模式?例如,您可以尝试
os.popen(“gst-launch…”,“r”)
os.popen(“gst-launch…”,“rb”)
。前者应该是默认行为,后者则是明确地指定读取二进制数据。也尝试<代码>子进程。Popen(CAMYCMD,shell=true,BufStase= 1024,StdOut= SudiPurtual.Cube)。StdOut<<代码> -相同的发行版本,尝试“RB”-相同。您应该真正考虑使用而不是<代码> OS.POPON < /代码>。另外,您使用的是什么版本的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
-相同的issuergerg,尝试了“rb”-相同的。
subprocess.Popen([“gst-launch”、“-q”、“whateversrc”、“…!”、“matroskamux”,“streamable=true”、“!”、“fdsink”]、shell=False、bufsize=1024、stdout=subprocess.PIPE)。stdout
-同样的问题“fdsink”Gstreamer模块不太可能执行“\u binmode(…O_BINARY)”(或其他特定于Windows的操作)。如何强制其他进程在默认情况下将所有句柄都设置为二进制?我很想知道
msvcrt.setmode()
的东西是否对您有帮助。请在尝试时发布更新!您认为如果数据在进入我的程序之前被破坏会有帮助吗?它会为我的python进程和子进程设置更多的二进制吗?(在没有手动编译Gstreamer for windows的情况下让它正常工作的希望渺茫)我不知道它是如何工作的,但如果您在父进程的文件句柄上设置二进制模式,则后续子进程将继承该设置,因此所有子进程都将使用二进制模式文件句柄进行通信。很抱歉,我没有安装适用于Windows的GStreamer,并且无法为此运行测试。
subprocess.Popen([“gst-launch”、“-q”、“whateversrc”、……“!”、“matroskamux”、“streamable=true”、“!”、“fdsink”]、shell=False、bufsize=1024、stdout=subprocess.PIPE)。stdout
-与“fdsink”Gstreamer模块不太可能出现相同的问题“\u binmode(…O\u BINARY)”(或其他特定于Windows的东西)。如何强制其他进程在默认情况下使所有句柄都是二进制的?我很想知道
msvcrt.setmode()
stuff对您有帮助。请在尝试时发布更新!您认为如果数据在进入我的程序之前被破坏会有帮助吗?它会为我的python进程和子进程设置更多的二进制文件吗?(在没有手动编译Gstreamer for windows的情况下让它工作的希望破灭)我不知道它是如何工作的,但如果您在父进程的文件句柄上设置二进制模式,则后续子进程将继承该设置,因此所有子进程都将使用二进制模式文件句柄进行通信。很抱歉,我没有安装适用于Windows的GStreamer,并且无法为此运行测试。