我正在使用 FFmpeg,并且制作了一个自定义应用程序,它是 TCP 服务器。我在 ffmpeg 中使用重复输出。
我想要的是,对于每个输出,我想启动我的程序来侦听特定端口。例如我现在可以做什么:
ffmpeg -i "stream_link" -codec copy -f mpegts - \
| myprogram -h 127.0.0.1 -p 12345 -f -
我的程序从 ffmpeg 获取数据并将它们存储在服务器内。现在,我不能做以下事情
ffmpeg -i "stream_link" -codec copy -f mpegts - -codec copy -f flv - \
| myprogram -h 127.0.0.1 -p 12345 -f - \
| myprogram -h 127.0.0.1 -p 12345 -f -
我想你明白了我。我正在尝试输出 2 个不同的容器 mpegts、flv 并再次打开我的程序的 2 个实例。那么我怎样才能做到呢?
这个问题仅与管道相关。我只是举了一个使用 FFmpeg 的真实例子。
答案1
ffmpeg -i "stream_link" -codec copy -f mpegts - -codec copy -f flv - |
myprogram -h 127.0.0.1 -p 12345 -f - |
myprogram -h 127.0.0.1 -p 12345 -f -
所以如果我理解正确的话,您正在尝试将这两个命令合并为一个。
mpegts格式
ffmpeg -i "stream_link" -codec copy -f mpegts - |
myprogram -h 127.0.0.1 -p 12345 -f -
电影格式
ffmpeg -i "stream_link" -codec copy -f flv - |
myprogram -h 127.0.0.1 -p 12345 -f -
所以,如果我的上述理解是正确的,我相信你可以使用tee
命令来完成它。您可以从这个问题中获得更多详细信息这里。
因此,您可以将命令改写为:
ffmpeg -i "stream_link" -codec copy -f mpegts - -codec copy -f flv - |
tee >(myprogram -h 127.0.0.1 -p 12345 -f -)
>(myprogram -h 127.0.0.1 -p 12346 -f -)
然而,作为用户麦克塞夫他在评论中指出,
ffmpeg
正在将两个流写入一个文件。 thempegts
和 the都flv
转到标准输出这是|
管道。
因此,解决方案必须涉及ffmpeg
写入两个不同的文件。类似的,ffmpeg flv processing -o flvfile, mpegts processing -o mpegtsfile
两个进程从两个输出中读取数据。
无论是该进程还是接收输入的进程都必须解析ffmpeg
的输出,以了解从哪个偏移量开始读取其预期的流。
因此,该方法的问题tee
在于tee
可能会重复 的输入,并且可以使用ffmpeg
两个。ffmpeg
因此,解决此问题的更好方法是使用以下方法:
{ { ffmpeg -i "stream_link" #one input stream
-codec copy -f flv /dev/fd/3 #duped and processed, out >&3
-codec copy -f mpegts - | #duped and processed, out >&1
myprogram1 >&4 #receives >&1 on <&0, out >&4
} 3>&1 | myprogram2 #receives >&3 on <&0, out >&1
} 4>&1 #ensures both myprograms write to >&1
当我们使用上述方法时,ffmpeg
显式地分割其输出。它确实取决于在理解链接的系统上运行/dev/fd/[num]
。