{"id":31601497,"url":"https://github.com/eyevinn/moqlivemock","last_synced_at":"2025-10-06T07:10:33.445Z","repository":{"id":289236641,"uuid":"966761540","full_name":"Eyevinn/moqlivemock","owner":"Eyevinn","description":"Test application simulating a live MoQ video+audio publisher. Includes a subscriber app.","archived":false,"fork":false,"pushed_at":"2025-07-18T18:44:18.000Z","size":2840,"stargazers_count":6,"open_issues_count":6,"forks_count":2,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-08-01T00:30:58.527Z","etag":null,"topics":["aac","avc","cmaf","moq","quic","video","warp","webtransport"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Eyevinn.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-04-15T12:18:35.000Z","updated_at":"2025-07-20T17:48:09.000Z","dependencies_parsed_at":"2025-04-22T08:56:27.730Z","dependency_job_id":"8f51cb21-355e-442a-a698-4ae973e581b0","html_url":"https://github.com/Eyevinn/moqlivemock","commit_stats":null,"previous_names":["eyevinn/moqlivemock"],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/Eyevinn/moqlivemock","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Eyevinn%2Fmoqlivemock","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Eyevinn%2Fmoqlivemock/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Eyevinn%2Fmoqlivemock/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Eyevinn%2Fmoqlivemock/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Eyevinn","download_url":"https://codeload.github.com/Eyevinn/moqlivemock/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Eyevinn%2Fmoqlivemock/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":278572003,"owners_count":26008686,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-06T02:00:05.630Z","response_time":65,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["aac","avc","cmaf","moq","quic","video","warp","webtransport"],"created_at":"2025-10-06T07:10:27.965Z","updated_at":"2025-10-06T07:10:33.438Z","avatar_url":"https://github.com/Eyevinn.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# moqlivemock\n\n![Test](https://github.com/Eyevinn/moqlivemock/workflows/Go/badge.svg)\n[![Coverage Status](https://coveralls.io/repos/github/Eyevinn/moqlivemock/badge.svg?branch=master)](https://coveralls.io/github/Eyevinn/moqlivemock?branch=master)\n[![GoDoc](https://godoc.org/github.com/Eyevinn/moqlivemock?status.svg)](http://godoc.org/github.com/Eyevinn/moqlivemock)\n[![Go Report Card](https://goreportcard.com/badge/github.com/Eyevinn/moqlivemock)](https://goreportcard.com/report/github.com/Eyevinn/moqlivemock)\n[![license](https://img.shields.io/github/license/Eyevinn/moqlivemock.svg)](https://github.com/Eyevinn/moqlivemock/blob/master/LICENSE)\n\nmoqlivemock is a simple media test service for [MoQ][moq] (Media over QUIC)\nand the [WARP][WARP] streaming format by providing a server which\npublishes an asset with wall-clock synchronized multi-bitrate video and\ntwo audio tracks, as well as a client that can receive these streams and even multiplex\nthem for playback with ffplay like `mlmsub -muxout - | ffplay -`.\n\nThe input media is 10s of video and audio which is then disassembled\ninto frames. One or more frames are then combined into a MoQ object as a CMAF chunk.\nHow many frames are combined is configurable via the `-audiobatch` and `-videobatch` options.\n\nLOC is currently not supported, but one possible scenario is to send LOC over the wire and\nthen reassamble CMAF on the receiving side again.\n\nThis project uses [moqtransport][moqtransport] for the MoQ transport layer.\nAs the MoQ transport layer is still work in progress, this project is also\nwork in progress.\n\n## Session setup\n\nThe first things that happens after the session establishment is that the namespace is\nannounced by the server. The client next subscribes to the WARP catalog.\nOnce it has the catalog, it subscribes to the first video and audio track from the catalog\nor tracks that match the `-videoname` and `-audioname` options.\n\nIt should later be possible to switch bitrate by unsubscribing to one\ntrack and subscribing to another, with no repeated or lost frames.\n\n## Requirements\n\n* Go 1.23 or later\n\n## Installation and Usage\n\nAs usual with Go, run\n\n```shell\ngo mod tidy\n```\n\nto get up and running.\n\nThere are two commands\n\n* `mlmpub` is the server and publisher\n* `mlmsub` is the client and subscriber\n\nThe content used is in the `assets/test10s` directory, and was\ngenerate using the code in `utils/videogen`.\n\nTo run the system, first start the publisher\n\n```shell\ncd cmd/mlmpub\ngo run .\n```\n\nYou can also build the binary and then run it\n\n```shell\ncd cmd/mlmpub\ngo build .\n./mlmpub\n```\n\nYou can also specify options for the publisher:\n\n```shell\n./mlmpub -audiobatch 4 -videobatch 2\n```\n\nIn another shell, start the subscriber and choose if the video, the audio,\nor a muxed combination should be output, e.g. \n\n```shell\ncd cmd/mlmsub\ngo run . -muxout - | ffplay -\n```\n\nor build it similarly to `mlmpub` before you run it. This time with some other options\n\n```shell\ncd cmd/mlmsub\ngo build .\n./mlmsub -videoname 600 -audioname scale -loglevel debug -muxout - | ffplay -\n```\n\nto directly play with ffplay.\nThere are more options to change the loglevel, choose track etc.\n\nThe subscriber will connect to the publisher and start receiving\nvideo and audio frames if some tracks are selected.\n\n### WARP browser player\n\nThe browser player [warp-player][warp-player] has been created to match the\nmlmpub publisher. It will subscribe to and read a catalog.\nOne can then choose video and audio tracks and start playing synchronized\nvideo and audio.\n\nFor that to work, one typically need better certificates.\n\n#### Using mkcert (recommended for development)\n\nOne way to do that is with mkcert:\n\n```sh\n\u003e mkcert -key-file key.pem -cert-file cert.pem localhost 127.0.0.1 ::1\n\u003e mkcert -install\n\u003e go run . -cert cert.pem -key key.pem\n```\n\n#### Using certificate fingerprint\n\nFor browsers that support WebTransport certificate fingerprints (e.g., Chrome), you can use self-signed certificates without installing them:\n\n**Run mlmpub with fingerprint support**:\n```sh\n\u003e go run . -fingerprintport 8081\n```\n\nThis will automatically generate a WebTransport-compatible certificate with:\n- ECDSA algorithm (not RSA)\n- 14-day validity (WebTransport maximum)\n- Self-signed\n\nAlternatively, you can use your own certificate (e.g., generated with the included `generate-webtransport-cert.sh` script):\n```sh\ncd cmd/mlmpub\n./generate-webtransport-cert.sh\ngo run . -cert cert-fp.pem -key key-fp.pem -fingerprintport 8081\n```\n\nThis will:\n- Start the MoQ server on port 4443 (default address is `0.0.0.0:4443`, listening on all interfaces)\n- Start an HTTP server on port 8081 that serves the certificate's SHA-256 fingerprint\n- Validate that the certificate meets WebTransport requirements\n\nThe warp-player (fingerprint branch) can then connect using:\n- Server URL: `https://localhost:4443/moq` or `https://127.0.0.1:4443/moq`\n- Fingerprint URL: `http://localhost:8081/fingerprint` or `http://127.0.0.1:8081/fingerprint`\n\n**Notes**: \n- The fingerprint server is disabled by default (`-fingerprintport 0`). Only enable it when using certificates that meet WebTransport's strict requirements.\n- If no certificate files are provided, mlmpub will generate WebTransport-compatible certificates automatically.\n\n\n## Development\n\nUse plain Go environment, with go 1.23 or later.\nThe Makefile helps out with some tasks.\n\n## Contributing\n\nSee [CONTRIBUTING](CONTRIBUTING.md)\n\n## License\n\nThis project is licensed under the MIT License, see [LICENSE](LICENSE).\nSome code is based on [moqtransport][moqtransport which is also licensed under MIT]\n\n# Support\n\nJoin our [community on Slack](http://slack.streamingtech.se) where you can post any questions regarding any of our open source projects. Eyevinn's consulting business can also offer you:\n\n- Further development of this component\n- Customization and integration of this component into your platform\n- Support and maintenance agreement\n\nContact [sales@eyevinn.se](mailto:sales@eyevinn.se) if you are interested.\n\n# About Eyevinn Technology\n\n[Eyevinn Technology](https://www.eyevinntechnology.se) is an independent consultant firm specialized in video and streaming. Independent in a way that we are not commercially tied to any platform or technology vendor. As our way to innovate and push the industry forward we develop proof-of-concepts and tools. The things we learn and the code we write we share with the industry in [blogs](https://dev.to/video) and by open sourcing the code we have written.\n\nWant to know more about Eyevinn and how it is to work here. Contact us at work@eyevinn.se!\n\n[moq]: https://datatracker.ietf.org/doc/draft-ietf-moq-transport/\n[WARP]: https://datatracker.ietf.org/doc/html/draft-ietf-moq-warp-00\n[moqtransport]: https://github.com/mengelbart/moqtransport\n[warp-player]: https://github.com/Eyevinn/warp-player\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Feyevinn%2Fmoqlivemock","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Feyevinn%2Fmoqlivemock","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Feyevinn%2Fmoqlivemock/lists"}