我有一个与this question非常相似的问题,但提供的解决方案对我不起作用。实际上我想做一些不同的事情,所以也许有更好的方法。
我希望将UDP单播数据包(视频流)发送到服务器。服务器会将这些数据包转发到另一台计算机。可选地,登录服务器的人将能够使用诸如mplayer之类的东西来观看视频流。我非常确定我可以将视频流式传输到服务器和视频源的最终目的地,但我真的希望服务器能够控制它。
首次尝试: 下载了nmap以获取ncat工具。以为我可以使用它来下载和管道字节到mplayer并转发另一个ncat进程。我可以管道到mplayer并且效果很好,我不能同时前进。如果我使用Linux,显然我可以使用tee和进程替换,但我正在寻找Windows解决方案。
第二次尝试 我找到了一种解决方案,可以在PowerShell中实现对多个程序的隐含管道。但我发现二元管道不起作用。
第三次尝试 我试图编写一个类似T恤的可执行文件,可以编写两个程序。这跟我一样接近,但视频流似乎有点破坏了。我认为这不仅仅是一个性能问题。
第四次尝试 现在,我正处于发现socat的地步,这引发了我与之相关的问题。这看起来很奇怪,但我认为解决方案是我的服务器将数据包转发到目的地并将数据包转发到服务器上的另一个端口,该端口将与netcat或socat一起用于管道输入mplayer。我宁愿不用掉服务器上的另一个端口,但如果那是我必须做的事情,那么好吧。但就像我说的那样,另一个问题的解决方案似乎没有用。 Mplayer开始缓冲,然后很快就停了下来。
按此顺序在单独的cmd窗口中运行其中每个窗口。请注意,我还没有尝试转发到目标计算机,只是试图让mplayer在服务器上运行。
socat UDP4-LISTEN:5000 UDP-DATAGRAM:224.10.10.10:5001
socat UDP4-RECVFROM:5001,ip-add-membership = 224.10.10.10:0.0.0.0,reuseaddr,fork UDP-DATAGRAM:192.168.16.33:5002
ncat -l -u -p 5002 | mplayer -vo direct3d -cache 1024 -
根据MPlayer输出,我似乎得到了大约924个字节。
尽管我会继续学习socat,但我还是有很多想法。我假设我没有正确运行socat,但我不确定问题出在哪里。如果有人能指出我的错误或提供替代解决方案,我真的很感激。感谢。修改:
我做了一些测试,如果我改变第二个socat来做这个:
socat UDP4-RECVFROM:5001,ip-add-membership = 224.10.10.10:0.0.0.0,reuseaddr,fork - | mplayer -vo direct3d -cache 1024 -
我发现它将播放来自多播地址的流。但显然转发到端口5002上的单播地址是没有用的。
答案 0 :(得分:0)
好吧,我不确定为什么会这样,但是netcat进程可以很好地接收来自发送方的UDP数据包并通过管道传输到MPlayer,但这里不起作用。我不确定问题是什么。
所以而不是:
ncat -l -u -p 5002 | mplayer -vo direct3d -cache 1024 -
我不得不使用:
socat UDP4-RECVFROM:5002,fork - | mplayer -vo direct3d -cache 1024 -
虽然我还有一个小问题。如果我关闭MPlayer,我会收到大量的消息:
2015/02/24 11:14:04 socat [5888] E write(1,0x800432e8,986):破碎 管
此外,如果我从命令行按Ctrl-C需要几次尝试,然后当MPlayer停止时,我的键盘不再工作,我必须启动一个新的cmd窗口。