Skip to content

Streaming audio/video transformer from anything to anything, using WebCodecs and libav.js (transmuxer, transcoder, etc)

License

Notifications You must be signed in to change notification settings

Yahweasel/transavormer

Repository files navigation

TransAVormer

TransAVormer is a (largely) stream-based frontend for libav.js and WebCodecs. It is a system for trans-everything-ing video and audio data in a browser. By “trans-everything-ing”, I mean transmuxing and transcoding, but also simply demuxing, decoding, encoding, muxing, filtering, or most other streaming transformations to digital audiovisual media.

This is just a brief introduction to TransAVormer. The API is documented in docs/API.md.

Exactly which formats and codecs TransAVormer supports depends on which variant of libav.js you're using. Thus, you must bring your own libav.js instance.

TransAVormer provides only a single function, build, which builds transformers. It takes an initializer that describes the transformation you with to perform, and figures out any other transformation steps that are necessary based on its input.

For instance, suppose you have an MP4 file as a File object, and you wish to transmux it into a Matroska file. That can be achieved like so:

const libav = await LibAV.LibAV();
const muxer = await TransAVormer.build(libav, {
    type: "muxer",
    randomAccess: true,
    input: inputFile
});
const rdr = muxer.stream.getReader();
const out = new FileWriter("out.mkv"); // Hypothetical output class
while (true) {
    const rd = await rdr.read();
    if (rd.done) {
        out.close();
        break;
    }
    out.write(rd.value.data, rd.value.position);
}
libav.terminate();

If you also wanted to transcode it into, say, VP8 and Opus, you could replace the build call with this:

const muxer = await TransAVormer.build(libav, {
    type: "muxer",
    randomAccess: true,
    input: {
        type: "encoder",
        videoConfig: {
            codec: "vp8"
        },
        audioConfig: {
            codec: "opus"
        },
        input: inputFile
    }
});

About

Streaming audio/video transformer from anything to anything, using WebCodecs and libav.js (transmuxer, transcoder, etc)

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Contributors 3

  •  
  •  
  •