According to gst-inspect-1.0 mpegtsmux
, mpegtsmux’s sink pads have writable stream-number
property:
...
Pad Templates:
SINK template: 'sink_%d'
Availability: On request
Capabilities:
...
Type: GstBaseTsMuxPad
Pad Properties:
...
stream-number : stream number
flags: readable, writable
Integer. Range: 0 - 31 Default: 0
But when I try to set it, GStreamer says there’s no such property. The following listing shows I can run a multi-stream pipeline without setting that property, but when I add that property it doesn’t work.
PS C:\gstreamer\1.0\msvc_x86_64\bin> ./gst-launch-1.0 mpegtsmux name=mux ! udpsink host=192.168.144.255 port=5600 sync=no `
>> videotestsrc is-live=true pattern=ball ! "video/x-raw, width=1920, height=1080, profile=main" ! x264enc ! mux.sink_300 `
>> videotestsrc is-live=true ! "video/x-raw, width=720, height=576" ! x264enc ! mux.sink_301
Use Windows high-resolution clock, precision: 1 ms
Setting pipeline to PAUSED ...
Pipeline is live and does not need PREROLL ...
Pipeline is PREROLLED ...
Setting pipeline to PLAYING ...
New clock: GstSystemClock
Redistribute latency...
Redistribute latency...
Redistribute latency...
handling interrupt.9.
Interrupt: Stopping pipeline ...
Execution ended after 0:00:03.773243400
Setting pipeline to NULL ...
Freeing pipeline ...
PS C:\gstreamer\1.0\msvc_x86_64\bin> ./gst-launch-1.0 mpegtsmux name=mux sink_300::stream-number=1 ! udpsink host=192.168.144.255 port=5600 sync=no `
>> videotestsrc is-live=true pattern=ball ! "video/x-raw, width=1920, height=1080, profile=main" ! x264enc ! mux.sink_300 `
>> videotestsrc is-live=true ! "video/x-raw, width=720, height=576" ! x264enc ! mux.sink_301
WARNING: erroneous pipeline: no property "sink_300::stream-number" in element "mpegtsmux"
PS C:\gstreamer\1.0\msvc_x86_64\bin> .\gst-launch-1.0.exe --version
gst-launch-1.0 version 1.24.8
GStreamer 1.24.8
Unknown package origin
PS C:\gstreamer\1.0\msvc_x86_64\bin> .\gst-launch-1.0.exe --version
gst-launch-1.0 version 1.24.9
GStreamer 1.24.9
Unknown package origin
PS C:\gstreamer\1.0\msvc_x86_64\bin> ./gst-launch-1.0 mpegtsmux name=mux sink_300::stream-number=1 ! udpsink host=192.168.144.255 port=5600 sync=no `
>> videotestsrc is-live=true pattern=ball ! "video/x-raw, width=1920, height=1080, profile=main" ! x264enc ! mux.sink_300 `
>> videotestsrc is-live=true ! "video/x-raw, width=720, height=576" ! x264enc ! mux.sink_301
WARNING: erroneous pipeline: no property "sink_300::stream-number" in element "mpegtsmux"
I even updated GStreamer but had no luck. I tried that because I found news saying there were updates regarding that property:
397 ### MPEG-TS improvements
398
399 - mpegtsdemux gained support for
400 - segment seeking for seamless non-flushing looping, and
401 - synchronous KLV
402 - mpegtsmux now
403 - allows attaching PCR to non-PES streams
404 - allows setting of the PES stream number for AAC audio and AVC video streams via a new “stream-number” property on the
405 muxer sink pads. Currently, the PES stream number is hard-coded to zero for these stream types.
The syntax seems correct (pad_name::pad_prop_name on the element). I ran out of ideas about what I’m doing wrong with that property.
Broader context:
I save the MPEG-TS I get from UDP to a .ts
file. I want to set that property because I want an exact sequence of streams I muxing.
When I feed mpegtsmux
with two video streams and one audio stream (from capture devices) without specifying the stream numbers I get them muxed in a random sequence (checking it using ffprobe
). Sometimes they are in the desired sequence, but sometimes they aren’t. The worst case is when the audio stream is the first stream in the file, so video players get mad when trying to play such a .ts
file. I have to remux such files using a -map
key of ffmpeg
. If I could set exact stream indices in mpegtsmux
(not to be confused with stream PID) I could avoid analyzing the actual stream layout of the .ts
file and remuxing.
Example of the real layout of the streams (ffprobe
output) in .ts
file:
Input #0, mpegts, from '████████████████████████████████████████':
Duration: 00:20:09.64, start: 3870.816656, bitrate: 6390 kb/s
Program 1
Stream #0:2[0x41]: Video: h264 (Baseline) (HDMV / 0x564D4448), yuvj420p(pc, bt709, progressive), 1920x1080, 30 fps, 30 tbr, 90k tbn
Stream #0:1[0x4b]: Audio: aac (LC) ([15][0][0][0] / 0x000F), 48000 Hz, mono, fltp, 130 kb/s
Program 2
Stream #0:0[0x42]: Video: h264 (High) (HDMV / 0x564D4448), yuv420p(progressive), 720x576, 25 fps, 25 tbr, 90k tbn
You can see 3 streams:
- FullHD video with PID 0x41 (defined by me as
mpegtsmux0.sink_65
) has index 2 while I want it to be 0 - PAL video with PID 0x42 (defined by me as
mpegtsmux0.sink_66
) has index 0 while I want it to be 1 - Audio with PID 0x4b (defined by me as
mpegtsmux0.sink_75
) has index 1 while I want it to be 2