To attempt a live publish against a relay:
OPENMOQ_PICOQUIC_TRACE=1 ./build/openmoq-publisher \
--input sample.mp4 \
--endpoint moqt://relay.example.com:443/moq \
--namespace interop \
--forward 0 \
--timeout 10 \
--pacedPublish the same stream with SAP timeline tracks included:
OPENMOQ_PICOQUIC_TRACE=1 ./build/openmoq-publisher \
--input sample.mp4 \
--endpoint moqt://relay.example.com:443/moq \
--namespace interop \
--forward 0 \
--timeout 10 \
--paced \
--sapIf you need to connect to a relay by IP while still presenting the relay hostname in TLS SNI:
OPENMOQ_PICOQUIC_TRACE=1 ./build/openmoq-publisher \
--input sample.mp4 \
--endpoint 203.0.113.10:443 \
--sni relay.example.com \
--namespace interop \
--forward 0 \
--timeout 10Use --insecure only when intentionally testing a relay with an untrusted or self-signed certificate. Public relays should be exercised with normal TLS verification so certificate and SNI regressions are visible.
Server certificate verification is enforced for both the raw QUIC and WebTransport transports unless --insecure is passed. The trust anchors are resolved in this order: --ca <bundle.pem> if provided, then the SSL_CERT_FILE environment variable, then the platform's system CA bundle (e.g. /etc/ssl/certs/ca-certificates.crt). If none of these yields a usable PEM bundle, the connection fails with an explanatory error instead of silently skipping verification. Hostname (or IP address) checking is performed against --sni when given, otherwise against the host used to connect, so relays reached by IP need a certificate with a matching IP subjectAltName or an explicit --sni matching the certificate. Note that verified TLS also broadens the signature algorithms offered in the ClientHello (adding e.g. Ed25519), so relays with Ed25519 certificates require verification to be enabled.
OPENMOQ_PICOQUIC_TRACE=1 ./build/openmoq-publisher \
--input tmp-relay-test.mp4 \
--transport webtransport \
--endpoint https://<moqx-relay-host>:4433/moq-relay \
--namespace live/paul1 \
--forward 0 \
--timeout 10 \
--paced \
--draft 16OPENMOQ_PICOQUIC_TRACE=1 ./build/openmoq-publisher \
--input tmp-relay-test.mp4 \
--transport webtransport \
--endpoint https://moq-relay.red5.net:4433/moq \
--namespace live/paul1 \
--forward 0 \
--timeout 10 \
--paced \
--draft 16moq-relay.red5.net:4433 currently accepts WebTransport on /moq; /moq-relay returns HTTP 404 during CONNECT. The moqx relay examples use a placeholder hostname because those relay hostnames are not public yet; moqx uses /moq-relay.
For moqx services with auth enabled, use the auth example instead of the generic CLI. It obtains CAT4MOQ token bytes from a file or Catapult command, configures PublisherConfig::authorization, and publishes a deterministic live-object track.
Build the example:
cmake --build build --target openmoq-publisher-auth-exampleRun against an already-started relay:
CAT4MOQ_TOKEN_FILE=/tmp/publish-token.cwt \
CAT4MOQ_ENDPOINT='https://127.0.0.1:4433/moq-relay' \
CAT4MOQ_NAMESPACE='cat4moq.example' \
CAT4MOQ_TRACK='video' \
./examples/auth/run-cat4moq-auth-example.shRun with separate setup/action tokens:
CAT4MOQ_SETUP_TOKEN_FILE=/tmp/setup.cwt \
CAT4MOQ_ACTION_TOKEN_FILE=/tmp/publish.cwt \
CAT4MOQ_ENDPOINT='https://127.0.0.1:4433/moq-relay' \
./examples/auth/run-cat4moq-auth-example.shRun with moqx as the Catapult/CAT4MOQ issuer command:
CATAPULT_CAT4MOQ_COMMAND='../moqx/build/moqx issue-cat-token --config /tmp/moqx-auth.yaml --auth-service live --auth-key-id cat-dev --auth-actions client_setup,publish_namespace,publish --auth-namespace {namespace} --auth-track {track}' \
CAT4MOQ_ENDPOINT='https://127.0.0.1:4433/moq-relay' \
./examples/auth/run-cat4moq-auth-example.shWhen using the default CAT wrapper, configure moqx service auth with
token_type: 16, matching the token type wrapped by moqxr. If using
CAT4MOQ_TOKEN_WRAPPER=out-of-band, configure token_type: 0. See
examples/auth/README.md for the local moqx auth
config, token generation, token encoding, and focused-test workflow.
If you want a per-object CSV trace for pacing and enqueue correlation, set OPENMOQ_PICOQUIC_TRACE_CSV alongside OPENMOQ_PICOQUIC_TRACE:
OPENMOQ_PICOQUIC_TRACE=1 \
OPENMOQ_PICOQUIC_TRACE_CSV=/tmp/openmoq-publisher-trace.csv \
./build/openmoq-publisher \
--input sample.mp4 \
--endpoint moqt://relay.example.com:443/moq \
--namespace interop \
--forward 0 \
--timeout 10 \
--pacedRows include pacing_before, pacing_after, enqueue, and served/sent events for media objects.
--forward 0waits for inboundSUBSCRIBErequests before sending matching media objects- with
--forward 0, subscribers are still expected to request tracks explicitly - by default, subscribers should subscribe to
catalogif they need track discovery --publish-catalogkeeps--forward 0for media tracks but proactively publishes thecatalogtrack through the normalPUBLISH/PUBLISH_OKpath--sapadds per-track*_sapevent timeline tracks and metadata objects- media packaging defaults to lower-latency split MOQT objects per group when chunk/sample boundaries are available
--coalesce-cmaf-chunksdisables that split and falls back to one media object per group- when multiple tracks are subscribed, matching objects are served in publish-plan order so time-aligned audio/video stay interleaved
--forward 1proactively publishes tracks and objects after namespace setup completes--timeout <seconds>controls how long the publisher waits for inboundSUBSCRIBErequests; the default is 30 seconds--sni <value>overrides the TLS SNI sent to the relay, useful when--endpointuses a raw IP address- WebTransport still sends HTTP authority from the configured endpoint host
--pacedapplies pacing only to media-object sends; setup and publish control messages are sent immediately