{"_id":"@alessmicrosystems/mpegts.js","_rev":"4-c6bb2849d051c58f0d078a311b74ffc1","name":"@alessmicrosystems/mpegts.js","dist-tags":{"latest":"1.8.4"},"versions":{"1.8.1":{"name":"@alessmicrosystems/mpegts.js","version":"1.8.1","keywords":["html5","mpegts","m2ts","mse","arib","dvb"],"author":{"name":"Albert Blasczykowski","email":"albertalesso@gmail.com"},"license":"Apache-2.0","_id":"@alessmicrosystems/mpegts.js@1.8.1","maintainers":[{"name":"alessmicro","email":"squarecherry.anish@gmail.com"}],"homepage":"https://github.com/alessblaze/mpegts.js#readme","bugs":{"url":"https://github.com/alessblaze/mpegts.js/issues"},"dist":{"shasum":"e6701b04988af01e2d9961a838730bc876d3955a","tarball":"https://registry.npmjs.org/@alessmicrosystems/mpegts.js/-/mpegts.js-1.8.1.tgz","fileCount":121,"integrity":"sha512-ejcE/905JztoBidwVPTejE9K8r73BGCSjJQ1+Mubge1iDDU9XFw+dTcIsAPFvV7krGCezBCz99J7L1LlOnJbnw==","signatures":[{"sig":"MEUCIAcGLpz3EhtwEdcE72jEL1u9VI1rxn0CzrL+IqVWTmYpAiEAp543YQa57BY8irYzHpOy25k4aoIPwfJsfMKpmtmzuW4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2098516},"main":"./dist/mpegts.js","types":"./d.ts/mpegts.d.ts","gitHead":"bb54c035685d0ebd7d9185492b1ef0d9dda33f49","scripts":{"build":"webpack --mode=production --progress","serve":"webpack serve --mode=development --progress","watch":"webpack --mode=development --progress --watch","build:debug":"webpack --mode=development --progress"},"_npmUser":{"name":"alessmicro","email":"squarecherry.anish@gmail.com"},"repository":{"url":"git+https://github.com/alessblaze/mpegts.js.git","type":"git"},"_npmVersion":"11.4.2","description":"HTML5 MPEG2-TS Stream Player","directories":{},"_nodeVersion":"22.17.0","dependencies":{"es6-promise":"^4.2.5"},"_hasShrinkwrap":false,"devDependencies":{"ws":">=7.4.6","ssri":">=8.0.1","eslint":"^10.4.0","webpack":"^5.106.2","minimist":">=1.2.6","ts-loader":"^8.4.0","typescript":"^5.2.2","@types/node":"^10.12.18","file-loader":"^3.0.1","webpack-cli":"^5.1.4","browser-sync":"^3.0.4","loader-utils":">=1.4.1","exports-loader":"^0.7.0","socket.io-parser":">=3.3.3","source-map-loader":"^0.2.4","webpack-dev-server":"^5.2.4","xmlhttprequest-ssl":">=1.6.2","terser-webpack-plugin":"^5.6.0","@typescript-eslint/parser":"^8.59.3","@types/express-serve-static-core":"4.17.37","@typescript-eslint/eslint-plugin":"^8.59.3"},"_npmOperationalInternal":{"tmp":"tmp/mpegts.js_1.8.1_1778896811819_0.651661765739078","host":"s3://npm-registry-packages-npm-production"}},"1.8.2":{"name":"@alessmicrosystems/mpegts.js","version":"1.8.2","keywords":["html5","mpegts","m2ts","mse","arib","dvb"],"author":{"name":"Albert Blasczykowski","email":"albertalesso@gmail.com"},"license":"Apache-2.0","_id":"@alessmicrosystems/mpegts.js@1.8.2","maintainers":[{"name":"alessmicro","email":"squarecherry.anish@gmail.com"}],"homepage":"https://github.com/alessblaze/mpegts.js#readme","bugs":{"url":"https://github.com/alessblaze/mpegts.js/issues"},"dist":{"shasum":"58012812c7ccb6b005dcf27f6387ca67376d9479","tarball":"https://registry.npmjs.org/@alessmicrosystems/mpegts.js/-/mpegts.js-1.8.2.tgz","fileCount":121,"integrity":"sha512-HrLNqKTGhuV47cT8TsE1cULHiPULIHp4e+lN1TE0PfJviSzCmqITy6MnTh0WryiYjzeKrU3BGWkvir6yTtGb6Q==","signatures":[{"sig":"MEYCIQCmXZ238xjkUCrig8VptJjugohxtZxEae2uKus7MIbjxQIhAMWL97JaMDHROX0/fSO9iG4FNYL59m71ffzrGzom9KwC","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2124707},"main":"./dist/mpegts.js","types":"./d.ts/mpegts.d.ts","gitHead":"0fd23e237eb6cf0cbb7beda86d6bd880aad325cc","scripts":{"build":"webpack --mode=production --progress","serve":"webpack serve --mode=development --progress","watch":"webpack --mode=development --progress --watch","build:debug":"webpack --mode=development --progress"},"_npmUser":{"name":"alessmicro","email":"squarecherry.anish@gmail.com"},"repository":{"url":"git+https://github.com/alessblaze/mpegts.js.git","type":"git"},"_npmVersion":"11.4.2","description":"HTML5 MPEG2-TS Stream Player","directories":{},"_nodeVersion":"22.17.0","dependencies":{"es6-promise":"^4.2.5"},"_hasShrinkwrap":false,"devDependencies":{"ws":">=7.4.6","ssri":">=8.0.1","eslint":"^10.4.0","webpack":"^5.106.2","minimist":">=1.2.6","ts-loader":"^8.4.0","typescript":"^5.2.2","@types/node":"^10.12.18","file-loader":"^3.0.1","webpack-cli":"^5.1.4","browser-sync":"^3.0.4","loader-utils":">=1.4.1","exports-loader":"^0.7.0","socket.io-parser":">=3.3.3","source-map-loader":"^0.2.4","webpack-dev-server":"^5.2.4","xmlhttprequest-ssl":">=1.6.2","terser-webpack-plugin":"^5.6.0","@typescript-eslint/parser":"^8.59.3","@types/express-serve-static-core":"4.17.37","@typescript-eslint/eslint-plugin":"^8.59.3"},"_npmOperationalInternal":{"tmp":"tmp/mpegts.js_1.8.2_1778909769025_0.3980890910909236","host":"s3://npm-registry-packages-npm-production"}},"1.8.3":{"name":"@alessmicrosystems/mpegts.js","version":"1.8.3","keywords":["html5","mpegts","m2ts","mse","arib","dvb"],"author":{"name":"Albert Blasczykowski","email":"albertalesso@gmail.com"},"license":"Apache-2.0","_id":"@alessmicrosystems/mpegts.js@1.8.3","maintainers":[{"name":"alessmicro","email":"squarecherry.anish@gmail.com"}],"homepage":"https://github.com/alessblaze/mpegts.js#readme","bugs":{"url":"https://github.com/alessblaze/mpegts.js/issues"},"dist":{"shasum":"82830d570652582e43e3fc0bad2725a751a220b9","tarball":"https://registry.npmjs.org/@alessmicrosystems/mpegts.js/-/mpegts.js-1.8.3.tgz","fileCount":121,"integrity":"sha512-43XviwFBd5GktkW9i9CKLPWMjuox/YIojhqprbNN/klH+budN9F6PwjvSMzU7xPLdXfueUVtusw7uDJqZSixrQ==","signatures":[{"sig":"MEYCIQCuLdNBR9XBpd2dD+UNr4iDQDhxIBrWXA1JnF6QLN4d5gIhAIHn0i2MyvbWm7bay1HhSNTV67f1Ekt2VCWDzHbGyAt6","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2141016},"main":"./dist/mpegts.js","types":"./d.ts/mpegts.d.ts","gitHead":"21f96529521b4b8dfb3cb13ad61ddaf857fc997b","scripts":{"build":"webpack --mode=production --progress","serve":"webpack serve --mode=development --progress","watch":"webpack --mode=development --progress --watch","build:debug":"webpack --mode=development --progress"},"_npmUser":{"name":"alessmicro","email":"squarecherry.anish@gmail.com"},"repository":{"url":"git+https://github.com/alessblaze/mpegts.js.git","type":"git"},"_npmVersion":"11.4.2","description":"HTML5 MPEG2-TS Stream Player","directories":{},"_nodeVersion":"22.17.0","dependencies":{"es6-promise":"^4.2.5"},"_hasShrinkwrap":false,"devDependencies":{"ws":">=7.4.6","ssri":">=8.0.1","eslint":"^10.4.0","webpack":"^5.106.2","minimist":">=1.2.6","ts-loader":"^8.4.0","typescript":"^5.2.2","@types/node":"^10.12.18","file-loader":"^3.0.1","webpack-cli":"^5.1.4","browser-sync":"^3.0.4","loader-utils":">=1.4.1","exports-loader":"^0.7.0","socket.io-parser":">=3.3.3","source-map-loader":"^0.2.4","webpack-dev-server":"^5.2.4","xmlhttprequest-ssl":">=1.6.2","terser-webpack-plugin":"^5.6.0","@typescript-eslint/parser":"^8.59.3","@types/express-serve-static-core":"4.17.37","@typescript-eslint/eslint-plugin":"^8.59.3"},"_npmOperationalInternal":{"tmp":"tmp/mpegts.js_1.8.3_1779157442825_0.4024237325328013","host":"s3://npm-registry-packages-npm-production"}},"1.8.4":{"name":"@alessmicrosystems/mpegts.js","version":"1.8.4","description":"HTML5 MPEG2-TS Stream Player","main":"./dist/mpegts.js","types":"./d.ts/mpegts.d.ts","repository":{"type":"git","url":"git+https://github.com/alessblaze/mpegts.js.git"},"keywords":["html5","mpegts","m2ts","mse","arib","dvb"],"scripts":{"build":"webpack --mode=production --progress","build:debug":"webpack --mode=development --progress","watch":"webpack --mode=development --progress --watch","serve":"webpack serve --mode=development --progress"},"dependencies":{"es6-promise":"^4.2.5"},"devDependencies":{"@types/express-serve-static-core":"4.17.37","@types/node":"^10.12.18","@typescript-eslint/eslint-plugin":"^8.59.3","@typescript-eslint/parser":"^8.59.3","browser-sync":"^3.0.4","eslint":"^10.4.0","exports-loader":"^0.7.0","file-loader":"^3.0.1","loader-utils":">=1.4.1","minimist":">=1.2.6","socket.io-parser":">=3.3.3","source-map-loader":"^0.2.4","ssri":">=8.0.1","terser-webpack-plugin":"^5.6.0","ts-loader":"^8.4.0","typescript":"^5.2.2","webpack":"^5.106.2","webpack-cli":"^5.1.4","webpack-dev-server":"^5.2.4","ws":">=7.4.6","xmlhttprequest-ssl":">=1.6.2"},"author":{"name":"Albert Blasczykowski","email":"albertalesso@gmail.com"},"license":"Apache-2.0","_id":"@alessmicrosystems/mpegts.js@1.8.4","gitHead":"e3caf952bf8c65024c7db86f7fca908f0ebba047","bugs":{"url":"https://github.com/alessblaze/mpegts.js/issues"},"homepage":"https://github.com/alessblaze/mpegts.js#readme","_nodeVersion":"22.17.0","_npmVersion":"11.4.2","dist":{"integrity":"sha512-2wourC5Ph03qD0jTApN5gfXMXjSa08ZqYfMKAjQoNlUVKIECRNkQB/HXjCdL4O0CBxspsPw63rh3g/Vnv+7sfA==","shasum":"0d3869178d6d1576a829373462808d8fe64f9878","tarball":"https://registry.npmjs.org/@alessmicrosystems/mpegts.js/-/mpegts.js-1.8.4.tgz","fileCount":121,"unpackedSize":2150391,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCXgVblRUb4V1IbZJAhtr+8DoBNvZg89cJGanWpfjVaywIhAMKuWLNW5LS68f81oxEG3kcdf41qKMpJMyQQFjiqeQDL"}]},"_npmUser":{"name":"alessmicro","email":"squarecherry.anish@gmail.com"},"directories":{},"maintainers":[{"name":"alessmicro","email":"squarecherry.anish@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/mpegts.js_1.8.4_1779371039419_0.39199843664837974"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-16T02:00:11.698Z","modified":"2026-05-21T13:43:59.787Z","1.8.1":"2026-05-16T02:00:11.997Z","1.8.2":"2026-05-16T05:36:09.228Z","1.8.3":"2026-05-19T02:24:02.997Z","1.8.4":"2026-05-21T13:43:59.662Z"},"bugs":{"url":"https://github.com/alessblaze/mpegts.js/issues"},"author":{"name":"Albert Blasczykowski","email":"albertalesso@gmail.com"},"license":"Apache-2.0","homepage":"https://github.com/alessblaze/mpegts.js#readme","keywords":["html5","mpegts","m2ts","mse","arib","dvb"],"repository":{"type":"git","url":"git+https://github.com/alessblaze/mpegts.js.git"},"description":"HTML5 MPEG2-TS Stream Player","maintainers":[{"name":"alessmicro","email":"squarecherry.anish@gmail.com"}],"readme":"mpegts.js  [![npm](https://img.shields.io/npm/v/mpegts.js.svg?style=flat)](https://www.npmjs.com/package/mpegts.js)\n======\n[日本語](README_ja.md)  [中文说明](README_zh.md)\n\nHTML5 MPEG2-TS stream player written in TypeScript & JavaScript.\n\nmpegts.js is optimized for low-latency live stream playback, such as DVB/ISDB television or surveillance cameras.\n\nThis project is based on [flv.js](https://github.com/bilibili/flv.js).\n\n## Overview\nmpegts.js works by transmuxing MPEG2-TS stream into ISO BMFF (Fragmented MP4) segments, followed by feeding mp4 segments into an HTML5 `<video>` element through [Media Source Extensions][] API.\n\n[Media Source Extensions]: https://w3c.github.io/media-source/\n\n## News\n- **v1.8.4** (alessmicrosystems fork)\n\n    **Configurable audio timestamp correction policy:**\n    - Added `audioTimestampCorrectionPolicy` with `strict`, `lenient`, and `off` modes\n    - Added `audioTimestampCorrectionThresholdMs` for tuning startup audio anchoring and lenient stale pre-wrap acceptance\n    - Keeps existing safe behavior by default while allowing problematic live MPEG-TS streams to be relaxed per deployment\n\n    **Safer timestamp handling diagnostics:**\n    - Logs accepted stale pre-wrap audio timestamp corrections in lenient/off modes\n    - Continues rate-limited warnings for dropped stale timestamps and startup anchor normalization\n\n- **v1.8.3** (alessmicrosystems fork)\n\n    **Audio startup failure recovery:**\n    - When audio init never becomes ready (dead audio PID, corrupt stream), the demuxer now abandons audio and proceeds video-only\n    - `isInitSegmentDispatched()` allows video-only dispatch when `audio_startup_failed_` is flagged\n    - Prevents indefinite stall waiting for audio that will never arrive\n    - 6-second timeout before audio is declared failed\n\n    **Startup stash capped at 12 payloads:**\n    - Audio stash limited to 12 most recent payloads during video init wait\n    - Prevents unbounded memory growth on slow-IDR streams\n    - Stash filter threshold tightened from 1500ms to 500ms for cleaner first-sample alignment\n\n    **StartupStallJumper improved for slow canplay:**\n    - Allows seek after 3 progress checks + 750ms buffer even if `canplay` hasn't fired yet\n    - Recovers streams where browser never emits `canplay` but buffered data is available\n    - Counter reset on `canplay` receipt keeps normal path unaffected\n\n    **`selectAudioPid` idempotent guard:**\n    - No-ops when the requested PID is already active — avoids unnecessary audio init reset\n    - Prevents brief audio dropout on redundant PID selection calls\n\n    **Diagnostic logging:**\n    - First 3 media dispatches log video/audio sample counts, DTS values, and keyframe status\n    - Startup stash trim events logged with rate-limited counters\n\n- **v1.8.2** (alessmicrosystems fork)\n\n    **Audio PTS wrap-around detection and correction:**\n    - Detects 33-bit PTS counter wrap-around in live MPEG-TS audio streams\n    - Automatically normalizes forward-wrapped timestamps to maintain monotonic time\n    - Drops stale pre-wrap timestamps that arrive after the wrap point\n\n    **Audio timestamp discontinuity resilience (mp4-remuxer):**\n    - Detects massive audio timestamp discontinuities (>30s or >180 frame durations) caused by audio PID switching\n    - Resets the audio timeline reference instead of dropping all frames (backward) or generating thousands of silent frames (forward)\n    - Prevents audio dropout and long silence gaps when switching audio tracks on live streams\n\n    **Startup audio timestamp anchoring:**\n    - Snaps the first audio sample's PTS to the video anchor DTS when drift exceeds 5 seconds\n    - Filters out stashed audio payloads with timestamps more than 1.5s behind the video anchor before replay\n    - Prevents remuxer-level discontinuity events on audio PID switches during stream startup\n    - Applied to all six audio codecs (AAC, LOAS-AAC, AC-3, E-AC-3, Opus, MP3)\n\n    **`selectAudioPid` hardened against stale codec state:**\n    - Clears all legacy codec PID mappings and rebuilds only the requested track\n    - `selectAudioPid(0)` correctly restores the default audio route\n    - Resets audio init state on PID switch so the new codec config is cleanly dispatched\n\n    **Stashed audio codec-aware replay:**\n    - Audio payloads stashed before video init are tagged with their codec\n    - Replayed through the correct parser instead of always using AAC\n    - Fixes silent/garbled audio on tracks switched during stream startup\n\n    **`preferredAudioPid` extended to all stream types:**\n    - Previously only applied during AC-3/E-AC-3 auto-fallback\n    - Now also selects the preferred track on AAC, MP3, and other codec streams\n    - Respects the config option on first PMT parse regardless of primary codec\n\n- **v1.8.1** (alessmicrosystems fork)\n\n    **Audio track selection for MPEG-TS live streams:**\n    - `TRACKS_UPDATED` player event reports all available audio tracks (PID, codec, language) and subtitle tracks from PMT parsing\n    - `switchAudioPid(pid)` API for in-place audio PID switching\n    - `preferredAudioPid` config option for pre-selecting an audio track before `load()`\n    - ISO 639 language descriptor extraction for all audio PIDs\n\n    **AC-3 / E-AC-3 auto-fallback:**\n    - Detects browser-incompatible AC-3/E-AC-3 primary audio\n    - Auto-switches to the first compatible AAC or MP3 alternative without user intervention\n    - Respects `preferredAudioPid` config when set\n\n    **Keyframe-gated media dispatch:**\n    - Media segments are held until the first H.264/H.265 IDR keyframe is seen after init segment dispatch\n    - Audio data before the first keyframe is stashed with its codec tag and replayed through the correct parser\n    - 6-second fallback timeout prevents indefinite stalling on streams with missing keyframes\n\n    **SEI support:**\n    - `SEI_ARRIVED` event for H.264/H.265 Supplemental Enhancement Information NAL units\n    - `SEIData` type with `type`, `size`, `uuid`, `user_data`, and optional `pts` fields\n\n    **Bug fixes:**\n    - Fixed stashed audio replay always using AAC parser regardless of actual codec (affected MP3 fallback streams)\n    - Fixed `selectAudioPid(0)` not restoring default audio route — now clears all stale codec PID mappings\n    - Fixed `audio_metadata_changed_` flag being set to `false` on video init instead of audio init (copy-paste bug)\n    - Fixed `parseMP3Payload` missing `audio_last_sample_pts_` tracking\n    - Fixed MP3 init segment missing `refSampleDuration`\n    - Fixed PMT multi-section parsing — `parsed_sections` map prevents duplicate audio entries\n\n- **v1.8.0**\n\n    Support working on **iOS Safari** with iOS 17.1+ through Apple's [ManagedMediaSource API](https://github.com/w3c/media-source/issues/320)\n\n    Great performance improvements by supporting [MSE in Workers](https://github.com/w3c/media-source/issues/175) on Chrome, Safari 18 (includes iOS)\n\n    Introduced support for [AV1 over MPEG-TS](https://aomediacodec.github.io/av1-mpeg2-ts/)\n\n    Introduced support for AV1 over HTTP-FLV defined in [Enhanced RTMP](https://github.com/veovera/enhanced-rtmp)\n\n    Support chasing live latency more smoothly by changing playback rate\n\n    Introduced ATSC EAC-3 audio codec in MPEG-TS\n\n    Support Opus and FLAC audio codec over HTTP-FLV (Enhanced RTMP)\n\n- **v1.7.3**\n\n    Introduced [Enhanced RTMP] with HEVC support for FLV.\n\n    Introduced Opus and ATSC AC-3 audio codec support for MPEG-TS.\n\n    Introduced LOAS AAC support for MPEG-TS.\n\n- **v1.7.0**\n\n    Introduced H.265/HEVC over MPEG-TS/FLV support.\n\n[Enhanced RTMP]: https://github.com/veovera/enhanced-rtmp\n## Demo\n[http://xqq.github.io/mpegts.js/demo/](http://xqq.github.io/mpegts.js/demo/)\n\n[demo with aribb24.js](http://xqq.github.io/mpegts.js/demo/arib.html)\n\n## Features\n- Playback for MPEG2-TS stream with H.264/H.265 + AAC codec transported in http(s) or WebSocket\n- Playback for FLV stream with H.264/H.265 + AAC codec transported in http(s) or WebSocket\n- Extremely low latency of less than 1 second in the best case\n- Playback for `.m2ts` file like BDAV/BDMV with 192 bytes TS packet, or 204 bytes TS packet\n- Support handling dynamic codec parameters change (e.g. video resolution change)\n- Support Chrome, FireFox, Safari, Edge (Old or Chromium) or any Chromium-based browsers\n- Support chasing latency automatically for internal buffer of HTMLMediaElement\n- Low CPU overhead and low memory usage (JS heap takes about 10MiB for each instance)\n- Support extracting PES private data (stream_type=0x06) like ARIB B24 subtitles (with [aribb24.js][])\n- Support Timed ID3 Metadata (stream_type=0x15) callback (TIMED_ID3_METADATA_ARRIVED)\n- Multi-audio track support with PID switching for MPEG-TS live streams\n- Automatic AC-3 / E-AC-3 fallback to AAC or MP3 for browser compatibility\n\n[aribb24.js]: https://github.com/monyone/aribb24.js\n\n## CORS\nIf you use standalone video server for MPEG2-TS stream, `Access-Control-Allow-Origin` header must be configured correctly on video server for cross-origin resource fetching.\n\nSee [cors.md](docs/cors.md) for more details.\n\n## Installation\n```bash\nnpm install --save mpegts.js\n```\n\n## Build\n```bash\nnpm install                 # install dev-dependencies\nnpm install -g webpack-cli  # install build tool\nnpm run build               # packaged & minimized js will be emitted in dist folder\n```\n\n[cnpm](https://github.com/cnpm/cnpm) mirror is recommended if you are in Mainland China.\n\n## Getting Started\n```html\n<script src=\"mpegts.js\"></script>\n<video id=\"videoElement\"></video>\n<script>\n    if (mpegts.getFeatureList().mseLivePlayback) {\n        var videoElement = document.getElementById('videoElement');\n        var player = mpegts.createPlayer({\n            type: 'mse',  // could also be mpegts, m2ts, flv\n            isLive: true,\n            url: 'http://example.com/live/livestream.ts'\n        });\n        player.attachMediaElement(videoElement);\n        player.load();\n        player.play();\n    }\n</script>\n```\nmpegts.js could be tested with [Simple Realtime Server](https://github.com/ossrs/srs/).\n\n## TODO\n- MPEG2-TS static file playback (seeking is not supported now)\n\n## Limitations\n- mpeg2video is not supported\n- HTTP MPEG2-TS live stream could not work on old browsers like IE11\n- mpegts.js is not usable on iOS version 17.0 or older caused by the banning of [Media Source Extensions][] (available on iPadOS), iOS 17.1 works through Managed Media Source API\n\n## Features inherited from flv.js\n- FLV container with H.264 + AAC / MP3 codec playback\n- Multipart segmented video playback\n- HTTP FLV low latency live stream playback\n- FLV over WebSocket live stream playback\n- Compatible with Chrome, FireFox, Safari 10, IE11 and Edge\n- Extremely low overhead, and hardware accelerated by your browser!\n\n## FLV playback limitations\n- MP3 audio codec is currently not working on IE11 / Edge\n- HTTP FLV live stream is not currently working on all browsers, see [livestream.md](docs/livestream.md)\n\n## FLV Multipart playback\nYou only have to provide a playlist for `MediaDataSource`. See [multipart.md](docs/multipart.md)\n\n## Livestream playback\nSee [livestream.md](docs/livestream.md)\n\n## API and Configuration\nSee [api.md](docs/api.md)\n\n## Debug\n```bash\nnpm install                 # install dev-dependencies\nnpm install -g webpack-cli  # install build tool\nnpm run build:debug         # packaged & minimized js will be emitted in dist folder\n```\n\n## Design\nSee [design.md](docs/design.md)\n\n## License\n```\nCopyright (C) 2021 magicxqq. All Rights Reserved.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n```\n","readmeFilename":"README.md"}