There are several ways to utilize "null" in
ffmpeg. This can be useful for testing and benchmarking purposes, creating inputs, and filtering. For example:
- testing decoding speed
- testing encoding speed without the cost of disk writes
- testing speed of input from a device
- creating a blank video "canvas" for filtering
- making silent audio
The null muxer does not generate any output file. It is mainly useful for testing or benchmarking purposes. The null muxer uses a wrapped frame so there is no muxing overhead (i.e. it can accept any type of input codec, doesn't have to be rawvideo for instance).
Decoding & demuxing
To test decoding and demuxing (using null muxer):
ffmpeg -i input -f null -
It can also be used to test encoding without the overhead of outputting a file. This example will map the first video stream, encode with libx264, then discard the output:
ffmpeg -i input -map 0:v:0 -c:v libx264 -f null -
With a particular muxer
You can output to
NUL in Windows, if you want to choose a muxer but not actually output a file:
ffmpeg -y -i input -c:v mpeg4 -f mp4 /dev/null
-benchmark global option will output benchmarking information at the end of an encode which can be informative with the null muxer. Shows CPU time used and maximum memory consumption. Maximum memory consumption is not supported on all systems; it will usually display as 0 if not supported.
$ ffmpeg -benchmark -i input output ... bench: utime=8.483s bench: maxrss=52736000kB
*nix users can also use the
$ time ffmpeg -i input output ... real 0m3.365s user 0m8.533s sys 0m0.541s
There is a variety of null filters:
The anull audio filter will pass the audio source unchanged to the output.
The null video filter will pass the video source unchanged to the output.
The anullsrc audio source filter can create silent audio. For example, to add a silent audio stream to a video:
ffmpeg -i input.mp4 -f lavfi -i anullsrc -c:v copy -c:a aac -shortest output.mp4
anullsrc can be particularly useful with the concat filter because all inputs to the filter must have the same number of streams. Example where
input1 have video and stereo audio with 48000 Hz sample rate, and
input2 has video only:
ffmpeg -i input0 -i input1 -i input2 -t 1 -f lavfi -i anullsrc=r=48000:cl=stereo -filter_complex \ "[0:v][0:a][1:v][1:a][2:v][3:a]concat=n=3:v=1:a=1[v][a]" \ -map "[v]" -map "[a]" output
-t 1 input option: you do not need to match this duration value with the associated video stream. It only needs to be shorter as the concat filter will pad the remaining duration with additional silence.
The nullsrc video source filter returns unprocessed (i.e. "raw uninitialized memory") video frames. It can be used as a foundation for other filters where the input is ignored or you don't mind somewhat random input. Example to generate noise in the luminance plane with the geq filter:
ffmpeg -f lavfi -i nullsrc=s=256x256:d=5 -vf "geq=random(1)*255:128:128" output
The anullsink audio sink with do absolutely nothing with the input audio.
The nullsink video sink will do absolutely nothing with the input video.
ffmpeg is "greedy" and will grab whatever stream it can find, so if your filtergraph does not "output" anything it will just re-encode the inputs and ignore the filter. Example:
ffmpeg -i input -filter_complex "[0:v]split[a][b];[a]nullsink" -map "[b]" output.mkv
In this case the
ffmpeg output specifies:
split:output1 -> Stream #0:0 (libx264)
...which means the second output from the split is being encoded and the first output has been sent to nullsink.