ffmpeg create blank screen with text video

后端 未结 1 882
忘掉有多难
忘掉有多难 2020-12-07 16:53

I would like to create a video consisting of some text. The video will only be 0.5 seconds long. The background should just be some colour, I am able to create such video fr

相关标签:
1条回答
  • 2020-12-07 17:19

    drawtext vs subtitles

    This can be done using the drawtext or subtitles filters.

    drawtext is simpler, but subtitles has much better styling and timing options. subtitles can automatically wrap the text while drawtext cannot.


    drawtext filter examples

    Add text to solid color background

    Using the color filter for the background and the drawtext filter for the text. Example for a 320x240, 10 second, 25 fps, blue background. Text is size 30, colored white, and centered.

    ffmpeg -f lavfi -i color=size=320x240:duration=10:rate=25:color=blue -vf "drawtext=fontfile=/path/to/font.ttf:fontsize=30:fontcolor=white:x=(w-text_w)/2:y=(h-text_h)/2:text='Stack Overflow'" output.mp4
    
    • The duration=10 will make a 10 second duration output.
    • See the list of supported color names and how to use a hex code to set color.

    With audio file

    Same as above, but video will automatically match audio duration by removing duration=10 and adding -shortest:

    ffmpeg -f lavfi -i color=size=320x240:rate=25:color=blue -i audio.m4a -vf "drawtext=fontfile=/path/to/font.ttf:fontsize=30:fontcolor=white:x=(w-text_w)/2:y=(h-text_h)/2:text='Stack Overflow'" -c:a copy -shortest output.mp4
    

    With a transparent box behind text

    Another example with a white box behind the text at 25% opacity with 5 pixel padding:

    ffmpeg -f lavfi -i color=c=red:s=320x240:d=10 -vf "drawtext=fontfile=/path/to/font.ttf:fontsize=30:box=1:boxborderw=5:boxcolor=white@0.25:fontcolor=white:x=(w-text_w)/2:y=(h-text_h)/2:text='Stack Overflow'" output.mp4
    

    Multiple lines


    It's easier to center the two lines with multiple drawtext instances (left image). Right image is from the external file and line break examples.

    There are 3 methods. You can chain together two drawtext filters, or reference an external text file with the textfile option, or add the line break in the command.

    Alternatively, see the example below using the subtitles filter. This filter will automatically wrap long text.

    Method 1: Multiple drawtext instances

    ffmpeg -f lavfi -i color=c=green:s=320x240:d=10 -vf "drawtext=fontfile=/path/to/font.ttf:fontsize=30:fontcolor=white:x=(w-text_w)/2:y=(h-text_h-text_h)/2:text='Stack',drawtext=fontfile=/path/to/font.ttf:fontsize=30:fontcolor=white:x=(w-text_w)/2:y=(h+text_h)/2:text='Overflow'" output.mp4
    

    Method 2: External text file

    The contents of the text file, text.txt, looks like this:

    Stack
    Overflow
    

    The ffmpeg command:

    ffmpeg -f lavfi -i color=c=green:s=320x240:d=0.5 -vf "drawtext=fontfile=/path/to/font.ttf:fontsize=30:fontcolor=white:x=(w-text_w)/2:y=(h-text_h)/2:textfile=text.txt" output.mp4
    

    Method 3: Line break in command

    ffmpeg -f lavfi -i color=c=green:s=320x240:d=0.5 -vf "drawtext=fontfile=/path/to/font.ttf:fontsize=30:fontcolor=white:x=(w-text_w)/2:y=(h-text_h)/2:text='Stack
    Overflow'" output.mp4
    

    Positions

    • Top left: x=0:y=0 (with 10 pixel padding x=10:y=10)
    • Top center: x=(w-text_w)/2:y=0 (with 10 px padding x=(w-text_w)/2:y=10)
    • Top right: x=w-tw:y=0 (with 10 px padding: x=w-tw-10:y=10)
    • Centered: x=(w-text_w)/2:y=(h-text_h)/2
    • Bottom left: x=0:y=h-th (with 10 px padding: x=10:y=h-th-10)
    • Bottom center: x=(w-text_w)/2:y=h-th (with 10 px padding: x=(w-text_w)/2:y=h-th-10)
    • Bottom right: x=w-tw:y=h-th (with 10 px padding: x=w-tw-10:y=h-th-10)

    subtitles filter example with audio

    Using the color filter for the background and the subtitles filter for the text.

    First, create SRT (SubRip) file. This example sets the duration to 10 hours. The duration doesn't really matter: it just needs to be longer than the audio file duration.

    1
    00:00:00,000 --> 10:00:00,000
    Stack Overflow
    

    Then run ffmpeg:

    ffmpeg -f lavfi -i color=size=256x144:rate=15:color=blue -i "Audio File.m4a" -vf "subtitles=subtitles.srt:force_style='Alignment=10,Fontsize=30'" -c:a copy -movflags +faststart -shortest output.mp4
    
    • Alternatively, use Aegisub to create ASS (Advanced SubStation Alpha) subtitles and you won't have to use force_style. Downside is that ASS is a much more complicated format than SRT.

    • If you want to use force_style refer to the Format and Style lines in an ASS file to get an idea of how to use more force_style options, and also see Aegisub Manual - Ass Tags for advanced formatting.


    Output image instead of video

    If you want an image output instead replace output.mp4 with -frames:v 1 output.png.

    0 讨论(0)
提交回复
热议问题