Starting an OS process (Gstreamer) with a port, not receiving trace printouts

Hi, I have an issue with receiving all printouts produced by an OS process.
I start Gstreamer with Gstreamers’ trace (called gst-shark) to obtain stream information every 1s (f.e. CPU usage, bitrate etc.).
So I open and monitor the Port as follows:

port ={:spawn, command}, [:binary, :exit_status, {:env, env}])
port |> Port.monitor()

where env is:

env = [
            {'GST_DEBUG', 'GST_TRACER:7'},
             |> Enum.reduce(fn x, acc -> acc <> ";" <> x end)
             |> to_charlist},
            {'GST_SHARK_CTF_DISABLE', 'TRUE'}

and the simplified command is:

command = "gst-launch-1.0 v4l2src name=video_source \
       ! videorate \
       ! 'video/x-raw,format=YUY2,framerate=30/1,width=1920,height=1080' \
       ! nvvidconv \
       ! 'video/x-raw(memory:NVMM),format=NV12' \
       ! omxh264enc \
           bitrate=3000000 \
           profile=8 \
           preset-level=3 \
       ! tee \
           name=t \
       t. \
         ! queue \
         ! h264parse name=pre_stream\
         ! hlssink2 \
             playlist-length=0 \
             max-files=50000 \
             target-duration=3 \
             location='./segment%05d.ts' \

I listen to the changes in my managing Genserver:

def handle_info({port, {:data, text_line}}, %{port: port} = state) do

My problem is that I can see in see the trace being printed out in the terminal (tested both and iex) and I receive certain standard Gstreamer messages like setting the stream start timer, but nothing from the trace.
Am I doing something wrong or the trace doesn’t provide information to the Port?


Most programs write trace like information to stderr, not stdout. Not sure if that is the case here, but you can try passing stderr_to_stdout and see if that helps.

port ={:spawn, command}, [:binary, :stderr_to_stdout, :exit_status, {:env, env}])
port |> Port.monitor()
1 Like