Casper Alant
Casper Alant

Reputation: 462

FFMpeg ZeroMQ Filter stops working after a short while

I run FFMpeg as follows:

#!/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

I then start a Python 3 app to send zmq commands to FFMpeg:

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)

Which runs fine up until about 40 seconds when I get this from Ffmpeg (it stops getting the command):

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

and this from the Python 3 client:

Sending request  8 ...
Received reply  8 [ b'0 Success' ]
Sending request  9 ...
Received reply  9 [ b'0 Success' ]
Sending request  10 ...

The disconnect always happens at the same time, no matter when I start the Python client. If I start it after 40 seconds, it won't send any commands at all.

On my actual application, the same thing happens but at about 60 seconds.

I tried setting up a simple Python server/client and the problem does not occur. So I assume the problem must have something to do with FFMpeg and its zmq plugin?

If you would like to test this yourself, just make sure test.mkv and test2.mkv is some video longer than 1 minute.

I would really appreciate any assistance!

Upvotes: 2

Views: 2081

Answers (2)

user3666197
user3666197

Reputation: 1

Using REQ/REP archetype in any seriously meant, production-grade distributed system is indeed a

Highway to Hell

Never opt in for a trivially looking false beauty of REQ/REP. Never. It can and will fall into an unsalvagable mutual deadlock. The matter is not if, but just when.

I have found not any explicit reason if / why FFMPEG used REP for any particular reason / if it can start to use any other, more suitable archetype as PAIR / PAIR for pipeline-filter-internode-processing or PUSH/PULL or some advanced, composite signalling/messaging layer compositions. Again, my other posts here on ZeroMQ bring more reasoning and examples.

Upvotes: 1

Casper Alant
Casper Alant

Reputation: 462

After aimlessly changing the code for the better part of the day, I finally found the solution:

#!/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

My guess is that even though the position of the zmq filter does not matter when you try to issue commands (you can issue commands to all the filters), when the input to the zmq filter ends, so does the zmq filter.

Upvotes: 5

Related Questions