Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I generate a video file directly from an FFmpeg filter with no actual input file?

Tags:

video

ffmpeg

FFmpeg has a number of video generating filters, listed in the documentation as "video sources":

  • cellauto
  • color
  • mptestsrc
  • fei0r_src
  • life
  • nullsrc, rgbtestsrc, testsrc

Those are great for using with other filters like overlay, but is there any way that I can generate a movie consisting of just one of those video sources without any input video?

Something like:

ffmpeg -vf color=red" red_movie.mp4 

Except that that errors out with At least one input file must be specified.

like image 523
blahdiblah Avatar asked Jul 24 '12 22:07

blahdiblah


People also ask

What is Lavfi FFmpeg?

From the FFmpeg documentation: -lavfi filtergraph (global) Define a complex filtergraph, i.e. one with arbitrary number of inputs and/or outputs. Equivalent to -filter_complex.

What is FFmpeg video format?

Ffmpeg stands for Fast Forward MPEG. It's an opensource software project for working with audio and video. It is command-line based and lets you handle video, audio, multimedia files, and streams. You'll find it used for transcoding, simple editing, video scaling, video post-production effects and standards compliance.


1 Answers

It looks like the options have changed slightly in recent versions.

To use the filter input sources, you have to:

  1. Set the input format to the libavfilter virtual device using: -f lavfi
  2. Set the filter input source using the -i flag (not -vf)
  3. Provide arguments as complete key-value pairs, like: color=color=red

This works for ffplay, too, to test your filtergraph: ffplay -f lavfi -i color

Examples

In these examples I've added -t 30 to specify that I only want 30 seconds of output.

Color (Red)

ffmpeg -f lavfi -i color=color=red -t 30 red.mp4                      ^     ^    ^                      |     |    |                    filter key value 

The key can be shortened to its abbreviated form: -i color=c=red

SMPTE Color Bars Pattern

ffmpeg -f lavfi -i smptebars -t 30 smpte.mp4 

Test Source Pattern

ffmpeg -f lavfi -i testsrc -t 30 -pix_fmt yuv420p testsrc.mp4 

In order for this to playback reliably, you might need to set the pixel format with: -pix_fmt yuv420p

By default, ffmpeg will use yuv444p (x264, High 4:4:4 Predictive), which some players aren't yet able to decode.

For instance, the video it creates is crashing VLC 2.0.7 and is just 30 seconds of black in QuickTime Player 10.2 (Mac OS X 10.8.4).

More info on test source here.

RGB Test Source

ffmpeg -f lavfi -i rgbtestsrc -pix_fmt yuv420p -t 30 rgbtestsrc.mp4 

As with the last example, this might not work for you unless you set the pixel format to yuv420p as shown.

For posterity, here's the version I'm using:

ffmpeg version 1.2.1 libavutil      52. 18.100 / 52. 18.100 libavcodec     54. 92.100 / 54. 92.100 libavformat    54. 63.104 / 54. 63.104 libavdevice    54.  3.103 / 54.  3.103 libavfilter     3. 42.103 /  3. 42.103 libswscale      2.  2.100 /  2.  2.100 libswresample   0. 17.102 /  0. 17.102 libpostproc    52.  2.100 / 52.  2.100 
like image 154
jbbuckley Avatar answered Oct 10 '22 02:10

jbbuckley