ebu / test-engine-live-tools

Small tools and scripts for the EBU test engine platform.
BSD 3-Clause "New" or "Revised" License
18 stars 16 forks source link

test-engine-live-tools

Small tools and scripts for the EBU test engine platform. These allow for DASH-ing and encoding a live stream.

Installation

The easiest way to install is to use the npm package. This will give you the latest released version and install all dependencies (except ffmpeg and MP4Box, you need to provide these yourself):

# npm install test-engine-live-tools

If you wish to use a different version from the Git repository you have to clone the code and install the dependencies using npm. Also, be sure to provide your own MP4Box and ffmpeg binaries, they are not included.

# git clone https://github.com/ebu/test-engine-live-tools.git
# cd test-engine-live-tools
# npm install

Usage

In general, the tool operates by looping an MPEG-2 Transport Stream and providing that to ffmpeg using the segment muxer. The generated segments are picked up and packaged/fragmented using MP4Box. After all segments for the desired representations are available they are DASH-ed by MP4Box using the --dash-ctx option. This generates the MPD for the live stream and keeps it updated.

A command-line utility is included which allows you to easily stream from the command-line. Usage:

# bin/live-stream [-c config_file] input_file

The config_file is optional and allows you to create custom settings for your live stream without having to change anything in the sources. The input_file is mandatory and it is required that this is currently muxed as a MPEG-2 Transport Stream for easy looping of the source material. The contents of the file can be either MPEG-2 video/audio or H264/AAC, or most likely anything else that ffmpeg can extract from a MPEG-2 TS container.

Using different sources

Instead of using a looped MPEG-2 TS file directly, it is also possible to read from other input sources. By specifying an input source using a URL with a protocol, this will be directly passed to ffmpeg to read from that source. This way you can for example ingest video using UDP transport. Example usage:

# bin/live-stream udp://192.168.0.10:1234

In theory any transport protocol supported by your version of ffmpeg is allowed.

Configuration

The default configuration generates one video representation and one audio representation. See lib/config.js for details. All parameter configuration is listed as an array of arguments which NodeJS understands. Custom configuration can be created by creating a valid JSON file containing an object that overrides values of the default configuration. The complete default configuration is:

{
  segmentDir: '/tmp/dash_segment_input_dir',
  outputDir: '/tmp/dash_output_dir',
  mp4box: 'MP4Box',
  ffmpeg: 'ffmpeg',
  encoding: {
    commandPrefix: [ '-re', '-i', '-', '-threads', '0', '-y' ],
    representations: {
      audio: [
        '-map', '0:1', '-vn', '-acodec', 'aac', '-strict', '-2', '-ar', '48000', '-ac', '2',
        '-f', 'segment', '-segment_time', '4', '-segment_format', 'mpegts'
      ],
      video: [
        '-map', '0:0', '-vcodec', 'libx264', '-vprofile', 'baseline', '-preset', 'veryfast',
        '-s', '640x360', '-vb', '512k', '-bufsize', '1024k', '-maxrate', '512k',
        '-level', '31', '-keyint_min', '25', '-g', '25', '-sc_threshold', '0', '-an',
        '-bsf', 'h264_mp4toannexb', '-flags', '-global_header',
        '-f', 'segment', '-segment_time', '4', '-segment_format', 'mpegts'
      ]
    }
  },
  packaging: {
    mp4box_opts: [
      '-dash-ctx', '/tmp/dash_output_dir/dash-live.txt', '-dash', '4000', '-rap', '-ast-offset', '12',
      '-no-frags-default', '-bs-switching', 'no', '-min-buffer', '4000', '-url-template', '-time-shift',
      '1800', '-mpd-title', 'MPEG-DASH live stream', '-mpd-info-url', 'http://ebu.io/', '-segment-name',
      'live_$RepresentationID$_', '-out', '/tmp/dash_output_dir/live', '-dynamic', '-subsegs-per-sidx', '-1'
    ]
  }
}

You can use this as a basis for your own configuration. Both the ffmpeg command and MP4Box commands are generated using this configuration. You can add extra representations by overriding the encoding object.

Please not that some options are required to be able to create a valid live stream. For example: it is required that we read from stdin using ffmpeg, so -i - is required. Also it is preferred to read realtime, so -re is also needed.

The full ffmpeg command is generated by concatenating encoding.commandPrefix with the configurations in encoding.represenations. Output files will be automatically added and you should not specify those yourself.

More example configuration will be added add a later stage.

Caveats / pitfalls

Live streaming using MPEG-DASH is not always easy. To make sure that you are compatible with most DASH clients take extra care to make sure you're always generating closed GOPs, fixed segment durations and constant bit rates and that timing over segments is continuous and identical across representations. The default configuration should do just that, but be sure to keep this in mind.

Requirements

License

Available under the BSD 3-clause license.