ya-webadb/libraries/scrcpy-decoder-tinyh264
2023-12-13 13:58:20 +08:00
..
src refactor: migrate to ES private fields 2023-07-11 21:05:39 +08:00
.eslintrc.cjs chore: integrate ESLint 2022-12-22 01:42:24 +08:00
.npmignore chore: integrate ESLint 2022-12-22 01:42:24 +08:00
CHANGELOG.json chore: bump version 2023-12-13 13:58:20 +08:00
CHANGELOG.md chore: bump version 2023-12-13 13:58:20 +08:00
jest.config.js chore: update dependencies 2023-07-07 18:30:13 +08:00
LICENSE chore: update license year 2023-01-13 02:02:31 +08:00
package.json chore: bump version 2023-12-13 13:58:20 +08:00
README.md chore: add discord link to README 2023-12-12 17:44:31 +08:00
tsconfig.build.json chore: update dependencies 2023-05-22 12:57:03 +08:00
tsconfig.json chore: update dependencies 2023-05-22 12:57:03 +08:00
tsconfig.test.json refactor(scrcpy): move decoders to own packages 2022-07-19 16:36:34 +08:00

@yume-chan/scrcpy-decoder-tinyh264

Decode and render H.264 streams using TinyH264, the old Android H.264 software decoder (now deprecated and removed), compiled into WebAssembly and wrapped in a Web Worker.

The video stream will be decoded into YUV frames on CPU, then converted to RGB using a WebGL shader (using GPU). It's slow, but works on most browsers.

WARNING: The public API is UNSTABLE. Open a GitHub discussion if you have any questions.

Compatibility

Chrome Firefox Safari Performance Supported H.264 profile/level
57 52 11 Poor Baseline level 4

Usage

The bundler you use must support the new Worker(new URL('./worker.js', import.meta.url)) syntax. It's known that Webpack 5 works.

Limit profile/level

Because it only supports Baseline level 4 codec, but many newer devices default to higher profiles/levels, you can limit it by using the codecOptions option:

new ScrcpyOptions1_24({
    codecOptions: new CodecOptions({
        profile: TinyH264Decoder.maxProfile,
        level: TinyH264Decoder.maxLevel,
    }),
});

However, it can fail on some very old devices that doesn't support even Baseline level 4 codec. You can retry without the codecOptions option if that happens.

Render the video

It draws frames onto decoder.renderer (a <canvas> element), you can insert it anywhere you want to display the video.

const decoder = new TinyH264Decoder();
document.body.appendChild(decoder.renderer);

videoPacketStream // from `@yume-chan/scrcpy`
    .pipeTo(decoder.writable)
    .catch(() => {});