English | Español | Français | Italiano | 日本語 | Português | 中文
moqxr è un publisher OpenMOQ in C++20 per Linux, macOS e Windows.
Confeziona media da file e live per Media over QUIC Transport (MOQT), costruisce cataloghi e piani di pubblicazione MSF/CMSF e pubblica tramite connessioni Raw QUIC o WebTransport basate su picoquic.
- Analizza MP4 frammentati (
ftyp+moov+moof/mdat) e remuxa MP4 progressivi in oggetti media frammentati. - Estrae metadati delle tracce e identificatori codec RFC 6381, inclusa la segnalazione HEVC e la normalizzazione da
hev1ahvc1. - Costruisce cataloghi MSF/CMSF versione 1, dati di inizializzazione, timeline media opzionali e timeline di eventi SAP.
- Rileva e segnala la protezione dei contenuti CMAF CENC esistente per input batch, MP4 frammentato live su stdin e ingest CTE LL-DASH. Non cifra né decifra i media.
- Emette file di catalogo, inizializzazione, media, probe e piano di pubblicazione per l'ispezione locale.
- Pubblica con i profili draft MOQT supportati dalla CLI principale: draft 16 (predefinito) e draft 18.
- Pubblica tramite Raw QUIC o WebTransport quando picoquic e picotls sono disponibili.
- Accetta MP4 frammentato live da stdin, MPEG-TS su SRT quando libsrt è disponibile e CMAF tramite ingest CTE LL-DASH chunked HTTP/1.1.
- Analizza URL MSF con
--urle stampa l'URL di discovery del catalogo con--print-msf-urls. - Fornisce esempi dell'API Publisher C++ per media live generati da FFmpeg, autorizzazione CAT4MOQ e packaging MPEG-2 TS/M2TS.
- Può instradare la pubblicazione tramite la libreria C11 Media-over-QUIC moq5 per i draft 16 e 18.
Compilare e testare:
cmake -S . -B build -DOPENMOQ_RUN_PICOQUIC_SMOKE_TESTS=OFF
cmake --build build
ctest --test-dir build --output-on-failureIl build predefinito crea l'eseguibile openmoq-publisher e la libreria statica Publisher: build/libopenmoq_publisher.a su Linux/macOS, oppure build\<config>\openmoq_publisher.lib con i generatori Visual Studio su Windows.
Ispezionare un piano di pubblicazione:
./build/openmoq-publisher --input sample.mp4 --dump-planEmettere il catalogo e gli oggetti media confezionati:
./build/openmoq-publisher --input sample.mp4 --emit-dir out/Pubblicare verso un relay con il profilo draft-16 predefinito:
OPENMOQ_PICOQUIC_TRACE=1 ./build/openmoq-publisher \
--input sample.mp4 \
--endpoint moqt://relay.example.com:443/moq \
--namespace media \
--draft 16 \
--forward 0 \
--timeout 10 \
--paced--forward 1 invia immediatamente gli oggetti. --forward 0 attende che il relay inoltri l'interesse di un subscriber. Un connection_id= stampato conferma solo il setup del trasporto e di MOQT; non conferma l'accettazione del namespace o una sottoscrizione downstream.
Su Windows, sostituite ./build/openmoq-publisher con build\Release\openmoq-publisher.exe o con il percorso della configurazione di build selezionata.
La CLI espone una sola sorgente live alla volta:
| Sorgente | Selezione CLI | Input | Note |
|---|---|---|---|
| MP4 frammentato | --live-source stdin --input - |
CMAF/fMP4 su standard input | Disponibile su tutte le piattaforme supportate |
| SRT | --live-source srt --srt-config FILE |
MPEG-TS su SRT | Richiede libsrt; i metadati CENC non sono disponibili in questo percorso |
| CTE LL-DASH | --live-source dash --dash-listen HOST:PORT |
Richieste CMAF chunked POST o PUT |
Il listener richiede attualmente una piattaforma Unix-like |
Il publisher è un caller SRT. Creare /tmp/srt_callers.json con l'indirizzo del listener SRT e le impostazioni MPEG-TS/CMAF:
{
"srt_callers": [
{
"id": "cam1",
"srt": {
"mode": "caller",
"host": "127.0.0.1",
"port": 9000,
"latency_ms": 120
},
"mpegts": {
"auto_detect_program": true,
"program_number": null,
"video_pid": null,
"audio_pid": null
},
"cmaf": {
"fragment_on_keyframe": true,
"empty_moov": true,
"default_base_moof": true,
"separate_moof_per_track": true,
"target_fragment_duration_ms": 1000
}
}
]
}Nel primo terminale, avviare un listener SRT FFmpeg che invia MPEG-TS dopo la connessione del publisher:
ffmpeg -hide_banner -stream_loop -1 -re \
-i input.mp4 \
-map 0:v:0 -map 0:a:0 \
-c:v libx264 -preset veryfast -r 30 -g 60 -keyint_min 60 -sc_threshold 0 -bf 0 \
-c:a aac -b:a 160k -ar 48000 -ac 2 \
-f mpegts "srt://0.0.0.0:9000?mode=listener&pkt_size=1316"Nel secondo terminale, avviare il caller SRT e il publisher MoQ:
./build/openmoq-publisher \
--live-source srt \
--srt-config /tmp/srt_callers.json \
--endpoint 127.0.0.1:4443 \
--transport raw \
--namespace live \
--draft 16 \
--timeout 120 \
--forward 0L'unica modalità SRT supportata è caller; l'host e la porta configurati devono identificare un listener SRT esistente. Usare --forward 1 per uno smoke test immediato del relay oppure mantenere --forward 0 per attendere l'interesse di un subscriber.
Avviare il publisher con un listener CMAF chunked HTTP/1.1 e un relay MoQ di destinazione:
./build/openmoq-publisher \
--live-source dash \
--dash-listen 0.0.0.0:8080 \
--dash-path /ingest \
--endpoint https://127.0.0.1:4433/moq \
--transport webtransport \
--namespace live \
--draft 18 \
--publish-catalog \
--forward 1 \
--insecureInviare uno stream CMAF/fMP4 esistente con trasferimento chunked HTTP/1.1:
curl -X PUT \
-H 'Transfer-Encoding: chunked' \
-H 'Content-Type: video/iso.segment' \
--data-binary @live-video.cmaf \
http://127.0.0.1:8080/ingest/videoIn alternativa, FFmpeg può creare due rappresentazioni video più audio e inviarle direttamente al prefisso di ingest:
ffmpeg -re \
-f lavfi -i "testsrc2=size=1280x720:rate=25" \
-f lavfi -i "anullsrc=r=48000:cl=stereo" \
-filter_complex "[0:v]split=2[v1][v2];[v1]scale=1280:720[v720];[v2]scale=640:360[v360]" \
-map "[v720]" -c:v:0 libx264 -b:v:0 1500k -g 50 -keyint_min 50 -sc_threshold 0 \
-map "[v360]" -c:v:1 libx264 -b:v:1 500k -g 50 -keyint_min 50 -sc_threshold 0 \
-map 1:a -c:a aac -b:a 128k \
-f dash -seg_duration 2 -use_template 1 -use_timeline 0 \
-init_seg_name 'video$RepresentationID$' \
-media_seg_name 'video$RepresentationID$' \
-adaptation_sets "id=0,streams=v id=1,streams=a" \
-multiple_requests 1 -streaming 1 -remove_at_exit 0 \
-window_size 20 -extra_window_size 20 \
http://127.0.0.1:8080/ingest/Ogni percorso sotto /ingest mantiene uno stato del parser indipendente e produce nomi di track MoQ con prefisso del percorso. Usare --forward 1 per inviare subito gli oggetti oppure --forward 0 per attendere l'interesse di un subscriber. Il listener DASH richiede attualmente una piattaforma Unix-like.
Consultare l'avvio rapido della CLI, le ricette FFmpeg e la nota tecnica SRT per ulteriori dettagli.
Il backend opzionale moq5 instrada la pubblicazione batch, stdin live, SRT live e di oggetti live tramite il service tier di moq5. Il service tier gestisce la pubblicazione del catalogo, la validazione CMSF/CMAF, il gating basato sulla domanda dei subscriber, la backpressure limitata e il drain ordinato del trasporto.
CMake recupera la versione corrente di openmoq/moq5 main quando questo
backend è abilitato. Impostare OPENMOQ_LIBMOQ_SOURCE_DIR solo per usare una
sorgente locale o offline:
cmake -S . -B build-libmoq \
-DOPENMOQ_USE_LIBMOQ_PUBLISHER=ON
cmake --build build-libmoq
ctest --test-dir build-libmoq --output-on-failureIl build predefinito mantiene il percorso di trasporto integrato. Consultare docs/build.md per lo stato del backend, il rilevamento delle dipendenze e i dettagli di configurazione.
| Esempio | Target | Scopo |
|---|---|---|
| Publisher psychedelic live | openmoq-publisher-psychedelic-example |
Esegue una pipeline audio/video FFmpeg tramite Publisher::publish_live(...) |
| Autorizzazione CAT4MOQ | openmoq-publisher-auth-example |
Pubblica oggetti live deterministici con file token o un comando token Catapult |
| Publisher MSFTS | openmoq-publisher-msfts-example |
Pubblica oggetti MPEG-2 TS o M2TS allineati ai pacchetti tramite Publisher::publish_live_objects(...) |
L'esempio MSFTS segue il draft testuale locale in examples/msfts-publisher/docs/, rileva i dati PAT/PMT, seleziona un programma, filtra i PID non correlati ed emette un catalogo MSF versione 1 con packaging: "m2ts".
./build/examples/msfts-publisher/openmoq-publisher-msfts-example \
--input sample.m2ts \
--endpoint https://relay.example.com:443/moq \
--namespace media.msfts \
--track transport \
--draft 17Aggiungere --program NUMBER per selezionare un programma, --packets-per-object COUNT per modificare la dimensione degli oggetti oppure --insecure solo quando il certificato del relay è intenzionalmente non attendibile.
| Argomento | Link |
|---|---|
| Build e dipendenze | docs/build.md |
| Avvio rapido CLI e ingest live | docs/quickstart.md |
| Test | docs/testing.md |
| Panoramica del design | docs/design.md |
| Ricette input FFmpeg | docs/ffmpeg.md |
| Nota tecnica ingest SRT | docs/srt-ingest-technical-note.md |
| Interoperabilità relay | docs/relay-interop.md |
| API Publisher C++ | docs/publisher-api.md |
| Esempio auth CAT4MOQ | examples/auth/README.md |
| Draft testuale MSFTS | examples/msfts-publisher/docs/draft-gregoire-moq-msfts.txt |
| Mappatura protocollo | docs/protocol-mapping.md |
| Conformità WebTransport | docs/webtransport-compliance.md |
| Draft locale MSF versione 1 | docs/draft-ietf-moq-msf-01.txt |
| Draft locale CMSF versione 1 | docs/draft-ietf-moq-cmsf-01.txt |
| Comportamento di shutdown DASH su macOS | docs/macos-accept-shutdown-quirk.txt |
| Stato e roadmap | docs/status.md |
Le guide localizzate dell'API Publisher sono disponibili in spagnolo, francese, italiano, giapponese, portoghese e cinese.
include/openmoq/publisher: header C++ pubblicisrc: implementazione della libreria statica e della CLItests: copertura di test unitari e di integrazione basata su CTestdocs: testo locale dei draft, note di protocollo, guide di integrazione e riferimenti di designexamples: integrazioni dell'API Publisher.github/workflows/ci.yml: CI Linux, macOS e Windows.github/workflows/release.yml: artefatti di release per CLI, header e libreria statica
La CLI principale openmoq-publisher accetta i draft 16 e 18; il draft 16 rimane il valore predefinito, mentre il draft 18 fornisce il profilo più recente basato sui request stream. Il testo dei draft 14, 17 e 19 rimane in docs/ per la cronologia dell'implementazione e la revisione del protocollo, ma queste versioni non sono selezionabili nella CLI principale. L'esempio MSFTS separato mantiene la selezione dei draft 14/16/17/18 per test specifici del draft.
Sia il backend picoquic predefinito sia il backend moq5 opzionale sono sottoposti a test di interoperabilità attivi. Per la copertura dettagliata delle funzionalità, le limitazioni e la roadmap, consultare docs/status.md e docs/protocol-mapping.md.