FFMpeg ZeroMQ 过滤器在短时间后停止工作
FFMpeg ZeroMQ Filter stops working after a short while
我运行FFMpeg如下:
#!/bin/bash
fc="[1]scale=iw/2:ih/2 [pip]; [pip] zmq=bind_address=tcp\\://127.0.0.1\\:1235,[0]overlay=x=0:y=0"
ffmpeg -v verbose -re -y -i test.mkv -i test2.mkv -filter_complex "$fc" -f mpegts -codec:v libx264 -preset ultrafast resultzmq.mp4
然后我启动一个 Python 3 应用程序来向 FFMpeg 发送 zmq 命令:
import zmq
import time
import sys
from multiprocessing import Process
context = zmq.Context()
port = "1235"
print("Connecting to server with port {}".format(port))
socket = context.socket(zmq.REQ)
socket.connect("tcp://localhost:{}".format(port))
for request in range (20):
print("Sending request ", request, "...")
socket.send_string("Parsed_overlay_2 x 200")
message = socket.recv()
print("Received reply ", request, "[", message, "]")
time.sleep (1)
当我从 Ffmpeg 得到它时 运行 直到大约 40 秒才正常(它停止接收命令):
frame= 918 fps= 24 q=19.0 size= 12192kB time=00:00:38.82 bitrate=2572.6kbits
frame= 931 fps= 24 q=19.0 size= 12402kB time=00:00:39.30 bitrate=2585.1kbits
[Parsed_zmq_1 @ 0x56185e089220] Processing command #8 target:Parsed_overlay_2 command:x arg:200
[Parsed_zmq_1 @ 0x56185e089220] Sending command reply for command #8:
0 Success
frame= 938 fps= 24 q=19.0 size= 12516kB time=00:00:39.82 bitrate=2574.1kbits/frame= 952 fps= 24 q=19.0 size= 12752kB time=00:00:40.33 bitrate=2590.0kbits/[Parsed_zmq_1 @ 0x56185e089220] Processing command #9 target:Parsed_overlay_2 command:x arg:200
[Parsed_zmq_1 @ 0x56185e089220] Sending command reply for command #9:
0 Success
frame= 963 fps= 24 q=19.0 size= 12932kB time=00:00:40.81 bitrate=2595.6kbits
frame= 976 fps= 24 q=19.0 size= 13121kB time=00:00:41.31 bitrate=2601.4kbits
frame= 992 fps= 24 q=19.0 size= 13434kB time=00:00:41.84 bitrate=2629.9kbits
frame= 1002 fps= 24 q=18.0 size= 13582kB time=00:00:42.34 bitrate=2627.2kbits
这来自 Python 3 客户:
Sending request 8 ...
Received reply 8 [ b'0 Success' ]
Sending request 9 ...
Received reply 9 [ b'0 Success' ]
Sending request 10 ...
断开连接总是同时发生,无论我何时启动 Python 客户端。如果我在 40 秒后启动它,它根本不会发送任何命令。
在我的实际应用程序中,发生了同样的事情,但大约需要 60 秒。
我尝试设置一个简单的 Python server/client 但问题没有发生。所以我认为问题一定与 FFMpeg 及其 zmq 插件有关?
如果您想自己测试,只需确保 test.mkv 和 test2.mkv 是超过 1 分钟的视频。
非常感谢任何帮助!
在任何严肃的生产级分布式系统中使用REQ/REP
原型是确实是
通往地狱的公路
永远不要选择 REQ/REP
看似平凡的虚假美。绝不。它可以而且将会陷入无法挽救的相互僵局。问题不在于是否,而在于何时。
如果/为什么 FFMPEG 出于任何特定原因使用 REP
,我没有找到任何明确的原因/如果它可以开始使用任何其他更合适的原型作为PAIR / PAIR
用于 pipeline-filter-internode-processing 或 PUSH/PULL
或一些高级复合 signalling/messaging 层组合。同样,我在 ZeroMQ 上的其他帖子带来了更多推理和示例。
在漫无目的地改了大半天代码后,我终于找到了解决方案:
#!/bin/bash
fc="[1]scale=iw/2:ih/2,[0]overlay=x=0:y=0,zmq=bind_address=tcp\\://127.0.0.1\\:1235 "
ffmpeg -v verbose -re -y -i test.mkv -i server_upgrade_2.mkv -filter_complex "$fc" -f mpegts -codec:v libx264 -preset ultrafast resultzmq.mp4
我的猜测是,即使当您尝试发出命令时 zmq 过滤器的位置无关紧要(您可以向所有过滤器发出命令),当 zmq 过滤器的输入结束时,zmq 也会结束过滤器。
我运行FFMpeg如下:
#!/bin/bash
fc="[1]scale=iw/2:ih/2 [pip]; [pip] zmq=bind_address=tcp\\://127.0.0.1\\:1235,[0]overlay=x=0:y=0"
ffmpeg -v verbose -re -y -i test.mkv -i test2.mkv -filter_complex "$fc" -f mpegts -codec:v libx264 -preset ultrafast resultzmq.mp4
然后我启动一个 Python 3 应用程序来向 FFMpeg 发送 zmq 命令:
import zmq
import time
import sys
from multiprocessing import Process
context = zmq.Context()
port = "1235"
print("Connecting to server with port {}".format(port))
socket = context.socket(zmq.REQ)
socket.connect("tcp://localhost:{}".format(port))
for request in range (20):
print("Sending request ", request, "...")
socket.send_string("Parsed_overlay_2 x 200")
message = socket.recv()
print("Received reply ", request, "[", message, "]")
time.sleep (1)
当我从 Ffmpeg 得到它时 运行 直到大约 40 秒才正常(它停止接收命令):
frame= 918 fps= 24 q=19.0 size= 12192kB time=00:00:38.82 bitrate=2572.6kbits
frame= 931 fps= 24 q=19.0 size= 12402kB time=00:00:39.30 bitrate=2585.1kbits
[Parsed_zmq_1 @ 0x56185e089220] Processing command #8 target:Parsed_overlay_2 command:x arg:200
[Parsed_zmq_1 @ 0x56185e089220] Sending command reply for command #8:
0 Success
frame= 938 fps= 24 q=19.0 size= 12516kB time=00:00:39.82 bitrate=2574.1kbits/frame= 952 fps= 24 q=19.0 size= 12752kB time=00:00:40.33 bitrate=2590.0kbits/[Parsed_zmq_1 @ 0x56185e089220] Processing command #9 target:Parsed_overlay_2 command:x arg:200
[Parsed_zmq_1 @ 0x56185e089220] Sending command reply for command #9:
0 Success
frame= 963 fps= 24 q=19.0 size= 12932kB time=00:00:40.81 bitrate=2595.6kbits
frame= 976 fps= 24 q=19.0 size= 13121kB time=00:00:41.31 bitrate=2601.4kbits
frame= 992 fps= 24 q=19.0 size= 13434kB time=00:00:41.84 bitrate=2629.9kbits
frame= 1002 fps= 24 q=18.0 size= 13582kB time=00:00:42.34 bitrate=2627.2kbits
这来自 Python 3 客户:
Sending request 8 ...
Received reply 8 [ b'0 Success' ]
Sending request 9 ...
Received reply 9 [ b'0 Success' ]
Sending request 10 ...
断开连接总是同时发生,无论我何时启动 Python 客户端。如果我在 40 秒后启动它,它根本不会发送任何命令。
在我的实际应用程序中,发生了同样的事情,但大约需要 60 秒。
我尝试设置一个简单的 Python server/client 但问题没有发生。所以我认为问题一定与 FFMpeg 及其 zmq 插件有关?
如果您想自己测试,只需确保 test.mkv 和 test2.mkv 是超过 1 分钟的视频。
非常感谢任何帮助!
在任何严肃的生产级分布式系统中使用REQ/REP
原型是确实是
通往地狱的公路
永远不要选择 REQ/REP
看似平凡的虚假美。绝不。它可以而且将会陷入无法挽救的相互僵局。问题不在于是否,而在于何时。
如果/为什么 FFMPEG 出于任何特定原因使用 REP
,我没有找到任何明确的原因/如果它可以开始使用任何其他更合适的原型作为PAIR / PAIR
用于 pipeline-filter-internode-processing 或 PUSH/PULL
或一些高级复合 signalling/messaging 层组合。同样,我在 ZeroMQ 上的其他帖子带来了更多推理和示例。
在漫无目的地改了大半天代码后,我终于找到了解决方案:
#!/bin/bash
fc="[1]scale=iw/2:ih/2,[0]overlay=x=0:y=0,zmq=bind_address=tcp\\://127.0.0.1\\:1235 "
ffmpeg -v verbose -re -y -i test.mkv -i server_upgrade_2.mkv -filter_complex "$fc" -f mpegts -codec:v libx264 -preset ultrafast resultzmq.mp4
我的猜测是,即使当您尝试发出命令时 zmq 过滤器的位置无关紧要(您可以向所有过滤器发出命令),当 zmq 过滤器的输入结束时,zmq 也会结束过滤器。