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 = Port.open({:spawn, command}, [:binary, :exit_status, {:env, env}])
port |> Port.monitor()

where env is:

env = [
            {'GST_DEBUG', 'GST_TRACER:7'},
            {'GST_TRACERS',
             [
               "bitrate(period=1)",
               "cpuusage(period=1)",
               "framerate(period=1)"
             ]
             |> 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' \
             playlist-location='./playlist.m3u8'"

I listen to the changes in my managing Genserver:

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

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?
Thanks

2 Likes

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 = Port.open({:spawn, command}, [:binary, :stderr_to_stdout, :exit_status, {:env, env}])
port |> Port.monitor()
1 Like