npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

jmuxer

v2.0.7

Published

jMuxer - a simple javascript mp4 muxer for non-standard streaming communications protocol

Downloads

29,363

Readme

Build Status Maintenance license

jMuxer

jMuxer - a simple javascript mp4 muxer that works in both browser and node environment. It is communication protocol agnostic and it is intended to play media files on the browser with the help of the media source extension. It also can export mp4 on the node environment. It expects raw H264 video data and/or AAC audio data in ADTS container as an input.

Live Demo

Click here to view a working demo

Click here to play a h264 file online

How to use?

A distribution version is available on dist folder.

  <script type="text/javascript" src="dist/jmuxer.min.js"></script>

  var jmuxer = new JMuxer(option);

Available options are:

node - String ID of a video tag / Reference of the HTMLVideoElement. Required field for browsers.

mode - Available values are: both, video and audio. Default is both

flushingTime - Buffer flushing time in milliseconds. Default value is 500 milliseconds. Set flushingTime to 0 if you want to flash buffer immediately or find any lag.

maxDelay - Maximum delay time in milliseconds. Default value is 500 milliseconds.

clearBuffer - true/false. Either it will clear played media buffer automatically or not. Default is true.

fps - Optional value. Frame rate of the video if it is known/fixed value. It will be used to find frame duration if chunk duration is not available with provided media data.

readFpsFromTrack - true/false. Will read FPS from MP4 track data instead of using (above) fps value. Default is false.

onReady - function. Will be called once MSE is ready.

onData - function. Will be called when muxed data is ready to be used. First argument is the muxed data.

onError - function. Will be fired if jMuxer encounters any buffer related errors.

onMissingVideoFrames - function. Will be fired if jMuxer encounters any missing video frames.

onMissingAudioFrames - function. Will be fired if jMuxer encounters any missing audio frames.

debug - true/false. Will print debug log in browser console. Default is false.

Complete example:


   <script type="text/javascript" src="dist/jmuxer.min.js"></script>

   <video id="player"></video>

   <script>
       var jmuxer = new JMuxer({
           node: 'player',
           mode: 'both', /* available values are: both, audio and video */
           debug: false
       });

      /* Now feed media data using feed method. audio and video is buffer data and duration is in milliseconds */
      jmuxer.feed({
         audio: audio,
         video: video,
         duration: duration
       });

   </script>

Media dataObject may have following properties:

video - h264 buffer

audio - AAC buffer

duration - duration in milliseconds of the provided chunk. If duration is not provided, it will calculate frame duration wtih the provided frame rate (fps).

compositionTimeOffset - Composition time offset, difference between decode time and presentation time of frames, in milliseconds. This is only used for video and usually needed when B-frames are present in video stream.

ES6 Example:

Install module through npm

npm install --save jmuxer

import JMuxer from 'jmuxer';

const jmuxer = new JMuxer({
              node: 'player',
              debug: true
            });

 /* Now feed media data using feed method. audio and video is buffer data and duration is in milliseconds */
 jmuxer.feed({
      audio: audio,
      video: video,
      duration: duration
 });

Node Example:

Install module through npm

npm install --save jmuxer

const JMuxer = require('jmuxer');
const jmuxer = new JMuxer({
    debug: true
});

/*
Stream in Object mode. Please check the example file for more details
*/
let h264_feeder = getFeederStreamSomehow();
let http_or_ws_or_any = getWritterStreamSomehow();
h264_feeder.pipe(jmuxer.createStream()).pipe(http_or_ws_or_any);


// OR another way

const jmuxer = new JMuxer({
	onData: function(data) {
		res.write(data); // send data to client
	}
    debug: true
});

jmuxer.feed({
	audio: audio,
	video: video,
	duration: duration
}); // feed data

Available Methods

| Name | Parameter | Remark | | ------------- |:-------------:| -----:| | feed | data object | object properites may have audio, video and duration. At least one media property i.e audio or video must be provided. If no duration is provided, it will calculate duration based on fps value | | createStream | - | Get a writeable stream to feed buffer. Available on NodeJS only | | reset | - | Reset the jmuxer and start over | | destroy | - | Destroy the jmuxer instance and release the resources |

Typescript definition

npm install --save @types/jmuxer

Compatibility

compatible with browsers supporting MSE with 'video/MP4. it is supported on:

  • Chrome for Android 34+
  • Chrome for Desktop 34+
  • Firefox for Android 41+
  • Firefox for Desktop 42+
  • IE11+ for Windows 8.1+
  • Edge for Windows 10+
  • Opera for Desktop
  • Safari for Mac 8+

Demo Server and player example

A simple node server and some demo media data are available in the example directory. In the example, each chunk/packet is consist of 4 bytes of header and the payload following the header. The first two bytes of the header contain the chunk duration and remaining two bytes contain the audio data length. Packet format is shown in the image below:

Packet format

| 2 bytes | 2 bytes | | | |-------------|-----------------|----------------|-----------------| |Duration (ms)|Audio Data Length|Audio Data (AAC)|Video Data (H264)|

A step guideline to obtain above the packet format from your mp4 file using ffmpeg:

  1. Spliting video into 2 seconds chunks: ffmpeg -i input.mp4 -c copy -map 0 -segment_time 2 -f segment %03d.mp4
  2. Extracting h264 for all chunks: for f in *.mp4; do ffmpeg -i "$f" -vcodec copy -an -bsf:v h264_mp4toannexb "${f:0:3}.h264"; done
  3. Extracting audio for all chunks: for f in *.mp4; do ffmpeg -i "$f" -acodec copy -vn "${f:0:3}.aac"; done
  4. Extracting duration for all chunks: for f in *.mp4; do ffprobe "$f" -show_format 2>&1 | sed -n 's/duration=//p'; done

(see https://github.com/samirkumardas/jmuxer/issues/20#issuecomment-470855007)

How to run example?

Demo files are available in example directory. For running the example, first run the node server by following command:

cd example

node server.js

then, visit example/index.html page using any webserver.

Player Example for raw h264 only

Assuming you are still in example directory. Now run followngs:

node h264.js

then, visit example/h264.html page using any webserver.

How to build?

A distribution version is available inside dist directory. However, if you need to build, you can do as follows:

  1. git clone https://github.com/samirkumardas/jmuxer.git
  2. cd jmuxer
  3. npm install
  4. npm run build OR npm run pro

Support

If the project helps you, buy me a cup of coffee!

Credits

Proudly inspired by hls.js, rtsp player

Cobrowse.io - for sponsoring the adaptation of jMuxer for Node.js