Note: This is a fork of jaminmc/tsMuxer (itself a modernized C++20/Qt6 fork of justdan96/tsMuxer). It adds multi-layer disc authoring: a menu-preserving BDMV to ISO mode, a layer-break guard band for BD-R/RE DL and BD-R XL media, a fit-to-disc capacity guard, and a layer-break calculator in the GUI. See DISC_AUTHORING.md (also available auf Deutsch and 日本語で).
This project is for tsMuxer - a transport stream muxer for remuxing/muxing elementary streams. This is very useful for transcoding and this project is used in other products such as Universal Media Server.
EVO/VOB/MPG, MKV/MKA/MK3D, WebM, MP4/MOV, TS, M2TS and IVF to TS, M2TS, MKV or WebM.
Supported video codecs H.264/AVC, H.265/HEVC, H.266/VVC (Alpha release), AV1, VC-1, MPEG2, and VP8 and VP9 (from MKV, WebM or IVF; to MKV, or demuxed to IVF). Supported audio codecs AAC, AC3 / E-AC3(DD+), DTS/ DTS-HD, TrueHD, Opus, FLAC, LPCM, MP3, Vorbis (from MKV or WebM; to MKV, or demuxed to Ogg) and ALAC (from MKV, to MKV).
TrueHD note (Blu-ray output): Blu-ray players typically expect Dolby TrueHD to be muxed in a Blu-ray style
interleaved stream with an AC-3 compatibility core. If your MKV stores TrueHD and AC-3 as separate tracks, tsMuxer
can merge them at mux time via the meta/GUI option merge-ac3-track (see docs/USAGE.md).
Some of the major features include:
- Ability to set muxing fps manually and automatically
- Ability to change level for H.264 and H.265/HEVC streams, without re-encoding
- Ability to shift a sound tracks
- Ability to extract DTS core from DTS-HD
- Ability to extract AC-3 core from E-AC3 (DD+) and TrueHD
- Ability to join files
- Output/Author to compliant Blu-ray Disc or AVCHD
- Matroska (MKV/MKA) output, with track names and flags, chapters and ordered editions, attachments and tags, and splitting by size, duration or chapters
- WebM output, for VP8, VP9 and AV1 video, Opus and Vorbis audio, and text subtitles as WebVTT
- Subtitles from Matroska in SRT, ASS, SSA, WebVTT, DVD (VobSub) and DVB form, kept in their own form in a Matroska output, or turned into PGS for a disc. DVB subtitles from a TS recording become PGS as well
- A remux of a Matroska file into a Matroska file keeps the tags about each track, the data stored beside each frame (BlockAdditions, such as HDR10+ metadata), and every edition and chapter of a single file that is not played as an ordered edition
- Blu-ray 3D support
Additions in this fork (see DISC_AUTHORING.md for details):
--bdmv-to-iso: wrap an existing unprotected BDMV folder into a burnable BD-ROM ISO byte-for-byte, keeping BD-J menus and all clip/playlist references intact--layer-break-guard: zero-fill the defect-prone sectors around each layer transition of BD-R/RE DL and BD-R XL media, so the movie plays seamlessly across the break (validated on real hardware)--layer-break-lbn: set the layer break sector(s); takes a comma list for 100/128 GB BD-R XL (2 or 3 breaks)--disc-size/--allow-oversize: abort (or warn) before muxing if the image will not fit the target disc--3d-single-copy: store a 3D disc's video once instead of twice, the way the source disc holds it, so the image is about half the size and fits back onto the disc it came from- GUI: a "BDMV folder -> ISO" tab with a layer-break calculator (you copy the blank disc's "Free Sectors" value out of ImgBurn and paste it in; the break sectors are calculated for you), colour-coded guard hints, and input sanity warnings
- GUI: fully translated interface (German, Spanish, French, Hebrew, Japanese, Russian, Chinese)
Dolby Vision and Blu-ray conformance:
- Carry a dual layer Dolby Vision disc in a single Matroska track, and split it back into two layers to author a disc again. A merged track is listed as its two layers, so it can be separated in the interface without hand writing a meta file. The rebuilt streams are byte for byte identical to the disc, measured over a whole 73 GB feature and over a seamless branching title, through both Dolby Vision profiles; see docs/DOLBY_VISION.md
- Store such a disc as Dolby Vision profile 8.1, which many more devices accept, while keeping the disc's own metadata alongside so the original disc can still be built from the file. The file does not get smaller, and that is the point of it
- Keep the AC-3 core of a TrueHD track in Matroska as its own track, instead of dropping it
- Name the IMAX variant of a DTS:X track
- HEVC: change the stream level without re-encoding, the way the H.264 path always could. A whole 4K track no longer has to be re-encoded to alter one byte
- HEVC: write access unit delimiters when a source has none. Every pressed disc carries one per picture, and the H.264 path has always added them
- HEVC: repeat the HDR mastering display and content light level at every random access point when authoring a disc. A source that states them only once leaves a player with no HDR10 metadata after a seek
How does the layer-break guard work? The layer-break buffer explains, with diagrams, how the guard protects the movie and why a block of zeros in the middle of the disc image never damages the video (also available auf Deutsch and 日本語で).
This project operates under the W3C's Code of Ethics and Professional Conduct:
W3C is a growing and global community where participants choose to work together, and in that process experience differences in language, location, nationality, and experience. In such a diverse environment, misunderstandings and disagreements happen, which in most cases can be resolved informally. In rare cases, however, behavior can intimidate, harass, or otherwise disrupt one or more people in the community, which W3C will not tolerate.
A Code of Ethics and Professional Conduct is useful to define accepted and acceptable behaviors and to promote high standards of professional practice. It also provides a benchmark for self evaluation and acts as a vehicle for better identity of the organization.
We hope that our community group act according to these guidelines, and that participants hold each other to these high standards. If you have any questions or are worried that the code isn't being followed, please contact the owner of the repository.
tsMuxer is written in C++20. It can be compiled for Windows, Linux and Mac.
Build Requirements:
- CMake 3.12 or later
- C++20 compatible compiler (GCC 10+, Clang 11+, MSVC 2019+; the Windows release builds use Visual Studio 2022)
- Qt 6 for the GUI. The Windows release builds link Qt 6.8.3 statically, using the qt6windows7 patches, and build Qt from source with Ninja (the Visual Studio generator cannot build Qt). See COMPILING.md.
Windows 7 Users: the Windows release binaries are built against Qt 6.8 with the qt6windows7 compatibility patches, so the standard 32-bit and 64-bit builds run on Windows 7 and newer. No separate build is needed.
Ready-made binaries are produced by the build workflows: open the Actions tab, pick the
newest "Build for Windows 64-bit" (or 32-bit / Linux / Mac) run and download its artifact.
The Windows zip is a self-contained folder: tsMuxeR.exe (command line), tsMuxerGUI.exe,
and the Qt and runtime DLLs they need. Unzip it and run; nothing needs installing. Tagged
versions additionally appear on the Releases page.
This project was created by Roman Vasilenko, with the last public release 20th January 2014. It was open sourced on 23rd July 2019, to aid the future development.
Please see INSTALLATION.md for installation instructions.
Please see USAGE.md for usage instructions.
The following is a list of changes that will need to be made to the original source code and project in general:
- the program doesn't support MPEG-4 ASP, even though MPEG-4 ASP is defined in the TS specification
- has issues with 24-bit DTS Express
- issues with the 3D plane lists when there are mismatches between the MPLS and M2TS
- AV1 in MPEG-TS playback depends on player/demuxer support for the AOM draft specification (not yet widely supported as of 2026)
We’re really happy to accept contributions from the community, that’s the main reason why we open-sourced it! There are many ways to contribute, even if you’re not a technical person.
We’re using the infamous simplified Github workflow to accept modifications (even internally), basically you’ll have to:
- create an issue related to the problem you want to fix (good for traceability and cross-reference)
- fork the repository
- create a branch (optionally with the reference to the issue in the name)
- make your changes
- commit incrementally with readable and detailed commit messages
- submit a pull-request against the master branch of this repository
We’ll take care of tagging your issue with the appropriated labels and answer within a week (hopefully less!) to the problem you encounter.
If you’re not familiar with open-source workflows or our set of technologies, do not hesitate to ask for help! We can mentor you or propose good first bugs (as labeled in our issues). Also welcome to add your name to Credits section of this document.
All pull requests must pass code style checks which are executed with clang-format version 18. Therefore, it is advised to install an appropriate commit hook (for example this one) to your local repository in order to commit properly formatted code right away.
Please report problems on GitHub with the bug report form. Every report helps, and a complete one can be fixed much sooner. Please include:
- the version, from the first line of the log or the title bar of the window
- the full log, especially the lines at the end of the run
- the meta file: the text in the Meta file box of the window, or your .meta file
- what you expected, and what happened instead
- for a playback problem, the player or device you used
- the source: what kind of file or disc it is, and a MediaInfo dump if you can
A short sample that shows the problem helps most of all. A result often depends on the source, the player and the settings, so something that works on one machine can still fail on another, and a report is how that comes to light.
For full details on building tsMuxer for your platform please see the document on COMPILING.
The very rough and incomplete testing document is available at TESTING.md.
We are not currently accepting any kind of donations and we do not have a bounty program.
Version numbering follows the Semantic versioning approach.
We're using the Apache 2.0 license for simplicity and flexibility. You are free to use it in your own project.
Distributed builds bundle third-party software. In particular, the graphical interface links the Qt framework under the LGPLv3. See THIRD-PARTY-NOTICES.txt and the licenses/ folder for the full license texts and the corresponding-source pointers.
Original Author Roman Vasilenko (physic)
Contributors
- Daniel Bryant (justdan96)
- Daniel Kozar (xavery)
- Jean Christophe De Ryck (jcdr428)
- Stephen Hutchinson (qyot27)
- Koka Abakum (abakum)
- Alexey Shidlovsky (alexls74)
- Lonely Crane (lonecrane)
- Markus Feist (markusfeist)
- jaminmc
- teaching-droid
For sake of brevity I am including anyone who has merged a pull request!