Files
js-encoding-samples/README.md
T
2020-10-26 11:08:25 +01:00

5.9 KiB

Video Encoding Samples

Video Encoding Samples (VES) is a project to determine the ideal (or even best) settings for any available encoder through comparison with VMAF, SSIM and PSNR. It was previously used to generate the data shown on the old website which will eventually be replaced by new, up to date information.

Requirements

Usage

The tool currently has no special parameters and reads its entire configuration from the config.json file, so you can invoke it by calling node.js with the script argument:

  • Default (usually fits): node ./ves.js
  • Or for larger configuraitons: node --max-old-space-size=8192 ./ves.js

Installation

  1. Grab the latest release source code (or just master source code) and extract it to any directory.
  2. Install the latest FFmpeg versions for your platform that supports libvmaf (or built it yourself):
    • Windows: Extract this archive into ffmpeg/.
    • Linux (apt): apt-get install ffmpeg
  3. Grab the recommended model (see requirements) and place it into ffmpeg/vmaf/.
    • It is possible to use different models, however this model has so far given the most accurate results.
  4. Put any source video files in videos/.
    • Videos must be properly tagged or they will be treated as bt709/bt709/bt709/tv.
    • Video files must be in .mkv format.
  5. Adjust the config.json file to your needs.
  6. Run the tool.

Configuration

The tool comes with a relatively simple configuration based on the JSON format. Almost every aspect of the tool is configurable.

Paths

paths.ffmpeg

Where to find both the FFmpeg binaries as well as the VMAF model directory.

paths.videos

The location of the video files used as input.

paths.cache

Where to store the intermediate cache videos to speed up the encoding process and waste less energy and time on identical work.

paths.output

The directory to store the resulting .JSON files in that VMAF generates.

Encoders

An object of encoder objects with the structure:

"encoder_name": {
	<options>
}

encoders.<encoder>.enabled

Enable or disable a certain encoder. Enabled encoders will be ignored if they are not supported by the tool or FFmpeg binary.

encoders.<encoder>.pool

The resource pool to put this encoder into in order to prevent

Encoder: libx264

encoders.libx264.cost_scale

encoders.libx264.threads

The number of threads to let libx264 to use. If this is reduced below 32 or increased above 32, the cost for an encode is adjusted by the formula cost *= (32.0 / n), as the original cost measurements were done at 32 threads.

encoders.libx264.presets

encoders.libx264.tunes

encoders.libx264.scenecut

Encoder: h264_nvenc

encoders.h264_nvenc.parallel

The maximum amount of encodes of this type to run in parallel.

encoders.h264_nvenc.gpu

The GPU index to run h264_nvenc on, or -1 to automatically select. You can figure out the proper index with the following FFmpeg command:

ffmpeg -hide_banner -f lavfi -i color=size=64x64:duration=1:rate=30:color=black -c:v h264_nvenc -gpu -2 -an -f null -

encoders.h264_nvenc.presets

Array of arguments to the -preset option.

encoders.h264_nvenc.tunes

Array of arguments to the -tune option, or null if the option should be omitted.

encoders.h264_nvenc.rc-lookahead

Array of arguments to the -rc-lookahead option, which controls the number of frames to look into the future.

encoders.h264_nvenc.bframes

Array of arguments to the -bf option, controlling the maximum amount of B-Frames to insert. If rc-lookahead is set to 0, controls the absolute number of B-Frames to insert.

encoders.h264_nvenc.bframe_reference_mode

Array of arguments to the -b_ref_mode option.

encoders.h264_nvenc.scenecut

Array of boolean options where true enables scenecut if rc-lookahead is greater than 0, and false disables it always.

Videos

An object of video objects with the structure:

"file_base_name": {
	<options>
}

videos.<video>.enabled

Enable or disable a certain video. Missing videos are ignored.

Options

options.transcode.format

The pixel format to transcode to. The current common streaming and VoD format is yuv420p or nv12.

options.transcode.color.matrix

Color Matrix to use for transcoded files.

options.transcode.color.trc

Transfer Characteristics to use for transcoded files.

options.transcode.color.primaries

Color Primaries to use for transcoded files.

options.transcode.color.range

Color range to use for transcoded files.

options.vmaf.model

Model that VMAF is using, relative to the <config.paths.ffmpeg>/vmaf/ directory. May not contain special symbols.

options.vmaf.threads

Number of threads that VMAF is allowed to use.

options.resolutions

Array of resolutions ([Width, Height]) to transcode to. Only the first element of the inner array is used, the height is calculated from the input video's aspect ratio.

options.framerate_scalings

Array of numbers to scale the framerate by. Values should be kept below 1.0, as values above 1.0 simply introduce duplicated frames and do not magically generate new information.

options.bitrates

Array of numbers to use as possible bitrates.

options.keyframeinterval

Array of numbers to multiply with the framerate to determine the keyframe interval with.