English | Español | Français | Italiano | 日本語 | Português | 中文
moqxr est un publisher OpenMOQ en C++20 pour Linux, macOS et Windows.
Il conditionne les médias sur fichier et en direct pour Media over QUIC Transport (MOQT), construit des catalogues et des plans de publication MSF/CMSF, puis publie via des connexions Raw QUIC ou WebTransport basées sur picoquic.
- Analyse les MP4 fragmentés (
ftyp+moov+moof/mdat) et remuxe les MP4 progressifs en objets média fragmentés. - Extrait les métadonnées de tracks et les identifiants de codecs RFC 6381, y compris la signalisation HEVC et la normalisation de
hev1enhvc1. - Construit des catalogues MSF/CMSF version 1, des données d'initialisation, des timelines média optionnelles et des timelines d'événements SAP.
- Détecte et signale la protection de contenu CMAF CENC existante pour les entrées batch, le MP4 fragmenté en direct via stdin et l'ingest CTE LL-DASH. Il ne chiffre ni ne déchiffre les médias.
- Émet des fichiers de catalogue, d'initialisation, de média, de probe et de plan de publication pour inspection locale.
- Publie avec les profils de draft MOQT pris en charge par la CLI principale : draft 16 (par défaut) et draft 18.
- Publie via Raw QUIC ou WebTransport lorsque picoquic et picotls sont disponibles.
- Accepte le MP4 fragmenté en direct depuis stdin, le MPEG-TS sur SRT lorsque libsrt est disponible, et le CMAF via l'ingest CTE LL-DASH chunked HTTP/1.1.
- Analyse les URL MSF avec
--urlet affiche l'URL de découverte du catalogue avec--print-msf-urls. - Fournit des exemples de l'API Publisher C++ pour les médias en direct générés par FFmpeg, l'autorisation CAT4MOQ et le conditionnement MPEG-2 TS/M2TS.
- Peut acheminer la publication via la bibliothèque C11 Media-over-QUIC moq5 pour les drafts 16 et 18.
Construire et tester :
cmake -S . -B build -DOPENMOQ_RUN_PICOQUIC_SMOKE_TESTS=OFF
cmake --build build
ctest --test-dir build --output-on-failureLe build par défaut crée l'exécutable openmoq-publisher et la bibliothèque statique Publisher : build/libopenmoq_publisher.a sous Linux/macOS, ou build\<config>\openmoq_publisher.lib avec les générateurs Visual Studio sous Windows.
Inspecter un plan de publication :
./build/openmoq-publisher --input sample.mp4 --dump-planÉmettre le catalogue et les objets média conditionnés :
./build/openmoq-publisher --input sample.mp4 --emit-dir out/Publier vers un relay avec le profil draft-16 par défaut :
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 envoie les objets immédiatement. --forward 0 attend que le relay transmette l'intérêt d'un abonné. Un connection_id= affiché confirme uniquement l'établissement du transport et de MOQT ; il ne confirme ni l'acceptation du namespace ni un abonnement en aval.
Sous Windows, remplacez ./build/openmoq-publisher par build\Release\openmoq-publisher.exe ou par le chemin correspondant à la configuration de build sélectionnée.
La CLI expose une seule source en direct à la fois :
| Source | Sélection CLI | Entrée | Remarques |
|---|---|---|---|
| MP4 fragmenté | --live-source stdin --input - |
CMAF/fMP4 sur l'entrée standard | Disponible sur toutes les plateformes prises en charge |
| SRT | --live-source srt --srt-config FILE |
MPEG-TS sur SRT | Nécessite libsrt ; les métadonnées CENC ne sont pas disponibles sur ce chemin |
| CTE LL-DASH | --live-source dash --dash-listen HOST:PORT |
Requêtes CMAF chunked POST ou PUT |
Le listener nécessite actuellement une plateforme de type Unix |
Le publisher est un caller SRT. Créez /tmp/srt_callers.json avec l'adresse du listener SRT et les paramètres 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
}
}
]
}Dans le premier terminal, démarrez un listener SRT FFmpeg qui envoie du MPEG-TS après la connexion du 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"Dans le second terminal, démarrez le caller SRT et le 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 0Le seul mode SRT pris en charge est caller ; l'hôte et le port configurés doivent désigner un listener SRT existant. Utilisez --forward 1 pour un test immédiat du relay, ou conservez --forward 0 pour attendre l'intérêt d'un abonné.
Démarrez le publisher avec un listener CMAF chunked HTTP/1.1 et un relay MoQ cible :
./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 \
--insecureEnvoyez un stream CMAF/fMP4 existant avec le transfert 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/videoFFmpeg peut à la place créer deux représentations vidéo plus l'audio et les envoyer directement au préfixe d'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/Chaque chemin sous /ingest conserve un état de parser indépendant et produit des noms de tracks MoQ préfixés par le chemin. Utilisez --forward 1 pour envoyer les objets immédiatement, ou --forward 0 pour attendre l'intérêt d'un abonné. Le listener DASH nécessite actuellement une plateforme de type Unix.
Consultez le démarrage rapide de la CLI, les recettes FFmpeg et la note technique SRT pour plus de détails.
Le backend optionnel moq5 achemine la publication batch, stdin en direct, SRT en direct et d'objets en direct via la couche de service de moq5. Cette couche gère la publication du catalogue, la validation CMSF/CMAF, le gating selon la demande des abonnés, la backpressure bornée et le drainage propre du transport.
CMake récupère la version actuelle de openmoq/moq5 main lorsque ce backend
est activé. Définissez OPENMOQ_LIBMOQ_SOURCE_DIR uniquement pour utiliser une
source locale ou hors ligne :
cmake -S . -B build-libmoq \
-DOPENMOQ_USE_LIBMOQ_PUBLISHER=ON
cmake --build build-libmoq
ctest --test-dir build-libmoq --output-on-failureLe build par défaut conserve le chemin de transport intégré. Consultez docs/build.md pour l'état du backend, la découverte des dépendances et les détails de configuration.
| Exemple | Target | Objectif |
|---|---|---|
| Publisher psychedelic en direct | openmoq-publisher-psychedelic-example |
Exécute un pipeline audio/vidéo FFmpeg via Publisher::publish_live(...) |
| Autorisation CAT4MOQ | openmoq-publisher-auth-example |
Publie des objets en direct déterministes avec des fichiers de token ou une commande de token Catapult |
| Publisher MSFTS | openmoq-publisher-msfts-example |
Publie des objets MPEG-2 TS ou M2TS alignés sur les paquets via Publisher::publish_live_objects(...) |
L'exemple MSFTS suit le draft texte local dans examples/msfts-publisher/docs/, découvre les données PAT/PMT, sélectionne un programme, filtre les PID non associés et émet un catalogue MSF version 1 avec 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 17Ajoutez --program NUMBER pour sélectionner un programme, --packets-per-object COUNT pour modifier la taille des objets, ou --insecure uniquement lorsque le certificat du relay est intentionnellement non approuvé.
| Sujet | Lien |
|---|---|
| Build et dépendances | docs/build.md |
| Démarrage rapide CLI et ingest en direct | docs/quickstart.md |
| Tests | docs/testing.md |
| Aperçu de conception | docs/design.md |
| Recettes d'entrée FFmpeg | docs/ffmpeg.md |
| Note technique d'ingest SRT | docs/srt-ingest-technical-note.md |
| Interopérabilité relay | docs/relay-interop.md |
| API Publisher C++ | docs/publisher-api.md |
| Exemple d'auth CAT4MOQ | examples/auth/README.md |
| Draft texte MSFTS | examples/msfts-publisher/docs/draft-gregoire-moq-msfts.txt |
| Mapping du protocole | docs/protocol-mapping.md |
| Conformité WebTransport | docs/webtransport-compliance.md |
| Draft local MSF version 1 | docs/draft-ietf-moq-msf-01.txt |
| Draft local CMSF version 1 | docs/draft-ietf-moq-cmsf-01.txt |
| Comportement d'arrêt DASH sous macOS | docs/macos-accept-shutdown-quirk.txt |
| État et roadmap | docs/status.md |
Les guides localisés de l'API Publisher sont disponibles en espagnol, français, italien, japonais, portugais et chinois.
include/openmoq/publisher: headers C++ publicssrc: implémentation de la bibliothèque statique et de la CLItests: couverture unitaire et d'intégration basée sur CTestdocs: texte local des drafts, notes de protocole, guides d'intégration et références de conceptionexamples: intégrations de l'API Publisher.github/workflows/ci.yml: CI Linux, macOS et Windows.github/workflows/release.yml: artefacts de release pour la CLI, les headers et la bibliothèque statique
La CLI principale openmoq-publisher accepte les drafts 16 et 18 ; le draft 16 reste la valeur par défaut, tandis que le draft 18 fournit le profil plus récent basé sur les request streams. Le texte des drafts 14, 17 et 19 reste dans docs/ pour l'historique d'implémentation et la revue du protocole, mais ces versions ne sont pas sélectionnables dans la CLI principale. L'exemple MSFTS distinct conserve la sélection des drafts 14/16/17/18 pour les tests spécifiques à chaque draft.
Le backend picoquic par défaut et le backend moq5 optionnel font tous deux l'objet de tests d'interopérabilité actifs. Pour la couverture détaillée des fonctionnalités, les limitations et la roadmap, consultez docs/status.md et docs/protocol-mapping.md.