All Projects → samirkumardas → Jmuxer

samirkumardas / Jmuxer

Licence: other
jMuxer - a simple javascript mp4 muxer that works in both browser and node environment.

Programming Languages

javascript
184084 projects - #8 most used programming language

Projects that are alternatives of or similar to Jmuxer

Media Stream Library Js
JavaScript library to handle media streams on the command line (Node.js) and in the browser.
Stars: ✭ 192 (-13.51%)
Mutual labels:  mp4, rtsp, video-streaming, aac, h264
demuxer
A tool for demux ts/mp4/flv by typescript. Support HEVC/AVC/AAC codec
Stars: ✭ 108 (-51.35%)
Mutual labels:  h264, mp4, hls, aac
Zlmediakit
WebRTC/RTSP/RTMP/HTTP/HLS/HTTP-FLV/WebSocket-FLV/HTTP-TS/HTTP-fMP4/WebSocket-TS/WebSocket-fMP4/GB28181 server and client framework based on C++11
Stars: ✭ 5,248 (+2263.96%)
Mutual labels:  mp4, rtsp, hls
Rtsp Stream
Out of box solution for RTSP - HLS live stream transcoding. Makes RTSP easy to play in browsers.
Stars: ✭ 349 (+57.21%)
Mutual labels:  rtsp, video-streaming, hls
Trinity
android video record editor muxer sdk
Stars: ✭ 609 (+174.32%)
Mutual labels:  mp4, aac, h264
RokuKast
A Chrome extension to stream web videos to Roku devices.
Stars: ✭ 63 (-71.62%)
Mutual labels:  mp4, hls, video-streaming
Node Video Lib
Node.js Video Library / MP4 & FLV parser / MP4 builder / HLS muxer
Stars: ✭ 264 (+18.92%)
Mutual labels:  mp4, h264, hls
Lal
🔥 Golang live stream lib/client/server. support RTMP/RTSP/HLS/HTTP[S]-FLV/HTTP-TS, H264/H265/AAC, relay, cluster, record, HTTP API/Notify, GOP cache. 官方文档见 https://pengrl.com/lal
Stars: ✭ 480 (+116.22%)
Mutual labels:  rtsp, aac, hls
ZLMediaKit
WebRTC/RTSP/RTMP/HTTP/HLS/HTTP-FLV/WebSocket-FLV/HTTP-TS/HTTP-fMP4/WebSocket-TS/WebSocket-fMP4/GB28181/SRT server and client framework based on C++11
Stars: ✭ 7,790 (+3409.01%)
Mutual labels:  rtsp, mp4, hls
Haishinkit.swift
Camera and Microphone streaming library via RTMP, HLS for iOS, macOS, tvOS.
Stars: ✭ 2,237 (+907.66%)
Mutual labels:  aac, h264, hls
Rtsp Simple Server
ready-to-use RTSP / RTMP server and proxy that allows to read, publish and proxy video and audio streams
Stars: ✭ 882 (+297.3%)
Mutual labels:  rtsp, aac, h264
Ksylive ios
金山云直播SDK [ iOS推流+播放 ]融合版 支持美颜滤镜(Beauty Filter)、美声(Beauty Voice)、软硬编(Software/Hardware Encoder) 、网络自适应(Network Auto Adapt)、混音(Audio Mixer)、混响(Reverb)、画中画(PIP)
Stars: ✭ 861 (+287.84%)
Mutual labels:  video-streaming, aac, h264
wsa
WSA(Websocket Streaming Agent) is a stream server target for mp4/h264 streaming over websocket
Stars: ✭ 35 (-84.23%)
Mutual labels:  h264, rtsp, hls
laav
Asynchronous Audio / Video Library for H264 / MJPEG / OPUS / AAC / MP2 encoding, transcoding, recording and streaming from live sources
Stars: ✭ 50 (-77.48%)
Mutual labels:  h264, aac, video-streaming
Ott Packager
OTT/ABR streaming encoder (H264/HEVC) and packager for DASH and HLS
Stars: ✭ 148 (-33.33%)
Mutual labels:  video-streaming, h264, hls
smart rtmpd
RTMP server, smart, compact, high performance(c, c++), high concurrency, easy to maintain, easy to deploy, (supports multiple operating systems Windows and Linux, ARM, FreeBSD)
Stars: ✭ 159 (-28.38%)
Mutual labels:  h264, rtsp, hls
Awesome Video
A curated list of awesome streaming video tools, frameworks, libraries, and learning resources.
Stars: ✭ 397 (+78.83%)
Mutual labels:  mp4, video-streaming, hls
rrtsp client
Rust high level RTSP client
Stars: ✭ 12 (-94.59%)
Mutual labels:  h264, rtsp, mp4
Ffmpeg
Mirror of https://git.ffmpeg.org/ffmpeg.git
Stars: ✭ 27,382 (+12234.23%)
Mutual labels:  mp4, rtsp, hls
Media Server
RTSP/RTP/RTMP/FLV/HLS/MPEG-TS/MPEG-PS/MPEG-DASH/MP4/fMP4/MKV/WebM
Stars: ✭ 1,363 (+513.96%)
Mutual labels:  mp4, rtsp, hls

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 seconds. Default value is 1500 miliseconds.

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.

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

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 miliseconds */
      jmuxer.feed({
         audio: audio,
         video: video,
         duration: duration
       });
   
   </script>

Media dataObject may have folloiwng properties:

video - h264 buffer

audio - AAC buffer

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

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 miliseconds */
 jmuxer.feed({
      audio: audio,
      video: video,
      duration: duration
 });

Node Example:

Install module through npm

npm install --save-dev 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);

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
destroy - Destroy the jmuxer instance and release the resources

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

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].