Hook for Quantum Break that enables offline playback of live episodes and subtitle override.
| Type | Value |
|---|---|
| Developer(s) | Remedy Entertainment |
| Publisher(s) | Microsoft Studios |
| Director(s) | Sam Lake, Mikael Kasurinen |
| Producer(s) | Miloš Jeřábek |
| Engine | Northlight Engine |
| Platform(s) | Windows, Xbox One |
| Genre(s) | Action-adventure, third-person shooter |
| Mode(s) | Single-player |
- The project doesn't contain any original assets from the game!
- To use this project you need to have an original copy of the game (bought from Steam), the project doesn't make piracy easier and doesn't break any of the DRM included in-game.
- Offline playback (see QuantumFetcher)
- Subtitles override support (you can translate/edit subtitles in episodes, please use QuantumFetcher to get the original subtitles)
- Optionally remove closed-caption annotations and music notes from overridden captions
- Visual Studio 2026
- Poco
- GoogleTest (unit tests)
See one of build workflows for more detailed steps
- Integrate vcpkg with Visual Studio
- Build the solution
QuantumStreamer.slnxin Visual Studio (x64 Release for the hook) - Run
x64\Release\QuantumStreamer.Tests.exeto run the unit tests
- In the game's
dx11folder, rename the originalloc_x64_f.dlltoloc_x64_f_o.dll - Copy
loc_x64_f.dllthere, either from the latest build in GitHub Releases or fromx64\Releaseif you compiled it yourself
You can change the default behavior of the hook by creating a config file named after the game executable, QuantumBreak, next to it (in the dx11 folder) or in the game folder.
The following formats are supported:
QuantumBreak.properties- properties fileQuantumBreak.ini- initialization fileQuantumBreak.json- JSON fileQuantumBreak.xml- XML file
In the config, you can set following values (dot separates section and key). Relative paths start from the game folder.
| Key | Description | Allowed Values | Default Value |
|---|---|---|---|
| Logger.ShowConsole | Show hook log in console | Boolean | false |
| Logger.SaveToLogFile | Save hook log to file | Boolean | false |
| Logger.LogFile | Path to where save log file | String | QuantumStreamer.log |
| Logger.LogLevel_Core | Changes how detailed Core logging is | Poco::Message::Priority | 6 (PRIO_INFORMATION) |
| Logger.LogLevel_Network | Changes how detailed Network logging is (HTTP Requests/Responses) | Poco::Message::Priority | 6 (PRIO_INFORMATION) |
| Logger.LogLevel_VideoList | Changes how detailed Video List subsystem logging is | Poco::Message::Priority | 6 (PRIO_INFORMATION) |
| Logger.LogLevel_OfflineStreaming | Changes how detailed Offline Streaming subsystem logging is | Poco::Message::Priority | 6 (PRIO_INFORMATION) |
| Logger.LogLevel_SubtitleOverride | Changes how detailed Subtitle Override subsystem logging is | Poco::Message::Priority | 6 (PRIO_INFORMATION) |
| Server.EpisodesPath | Path to where episodes data are located | String | ./videos/episodes |
| Server.MaxQueued | Max queued HTTP requests | Integer | 100 |
| Server.MaxThreads | Max threads (HTTP server) | Integer | Logical CPU count or 2 if failed |
| Server.OfflineMode | Disable online streaming, episodes stored locally will continue to work | Boolean | false |
| Server.Port | Port for HTTP server (game has to point to this port), if 0 will use random unused port | Unsigned short | 0 |
| Server.VideoListPath | Path to original, unmodified ./data/videoList.rmdj file |
String | ./data/videoList_original.rmdj |
| Subtitles.ClosedCaptioning | Keep closed-caption annotations such as [ door slams ] in overridden captions |
Boolean | false |
| Subtitles.MusicNotes | Keep ♪♪ music notes in overridden captions |
Boolean | true |
| VideoList.PatchFile | Patch ./data/videoList.rmdj to point to server on startup |
Boolean | true |
The default config should work for most of the users, but if you have special requirements you can change above settings.
Example config that disables online streaming and keeps closed-caption annotations:
[Server]
OfflineMode=true
[Subtitles]
ClosedCaptioning=true
Initially, after installing the hook, with default config - nothing should change in-game.
Quantum Streamer on game launch will try to load Server.VideoListPath, after that hook will scan Server.EpisodesPath directory for the locally stored episodes and/or captions_overrides.
VideoList loaded by game (data/videoList.rmdj) has to point to the Quantum Streamer server, by default Quantum Streamer will patch this file, but you can disable this behaviour by setting VideoList.PatchFile to false, but then, you have to patch that file manually - for that, you can use QuantumFetcher tool.
Before the first patch, the hook keeps the game's own list as Server.VideoListPath. A kept copy that already points at Quantum Streamer is removed, since it no longer holds the episodes' addresses; verify the game files in Steam to restore the original list.
Each episode data is expected to be in dedicated episode directory (e.g. ./videos/episodes/J1A-X1-X2 is where hook will look for episode J1A-X1-X2 (assuming Server.EpisodesPath is not changed))
Local episodes are expected to be in ISM Smooth Stream format:
*.ism (Server Manifest) should at least define clientManifestRelativePath in head section which should reference filename/relative path for client manifest file.
All media files referenced in the Server Manifest will be loaded (if media file exist); each has to end with an mfra fragment index, as QuantumFetcher writes them.
Additionally, SubRip (.srt) files which contain _captions in their filename will be loaded, after that hook will replace captions in specific track (e.g. enus_captions.srt will override enus_captions track) with the ones from the file, allowing you to translate or edit captions in the live action. The .srt files have to be saved as UTF-8.
Special thanks to:
- Remedy Entertainment (for making the game)
- Microsoft Studios (for publishing the game on PC)
- r00t0 - For help with decoding
videoList.rmdj
