FFmpeg生成静音音频和黑屏视频命令

开发中有时需要生成静音音频或者纯色黑屏视频为便于测试或其他特殊应用场景,可以使用FFmpeg命令-f lavfi来搞定。

生成静音音频

可以使用anullsrc或者aevalsrc来生成静音音频,aevalsrc还可以生成其他类型声音。

以下命令生成10s特定采样率和声道的静音音频,可以指定编码器进行编码。

anullsrc

1
2
3
ffmpeg -f lavfi -i anullsrc -t 10 silent-audio.mp3
# or
ffplay -f lavfi -i anullsrc=r=44100:cl=stereo -t 10 silent-audio.mp3
  • sample_rate, r

    指定采样率,默认44100。

  • channel_layout, cl

    指定通道布局,详见 libavutil/channel_layout.cchannel_layout_map 定义,常见mono stereo 5.1

  • -t

    文件时长,不指定就一直生成。

aevalsrc

1
ffmpeg -f lavfi -i aevalsrc=0 -t 10 silent-audio.mp3

生成纯色视频

可以使用color或者nullsrc源来生成指定格式的纯色视频。

color

1
2
3
ffmpeg -f lavfi -i color=size=1920x1080:rate=25:color=black:duration=5 black.mp4
# or
ffmpeg -f lavfi -i color=s=1920x1080:r=25:c='#FF00FF':d=5 purple.mp4
  • color,c:

    视频颜色,可以是颜色名或者数值#RRGGBB,详见ffmpeg color

nullsrc

1
2
3
ffmpeg -f lavfi -i nullsrc=size=1280x720:rate=25:duration=5,lutrgb=0:0:0 black.mp4
# or
ffmpeg -f lavfi -i nullsrc=s=1280x720:r=25:d=5,lutrgb=255:0:255 purple.mp4
  • size, s:

    图像分辨率

  • rate, r:

    视频帧率

  • duration, d:

    视频时长

生成纯色图像

生成纯色图片仅需要把上述生成视频的帧率和时长都设置为1即可。

1
2
3
4
ffmpeg -f lavfi -i color=s=1920x1080:r=1:c='#FF00FF':d=1 purple.jpg

# or
ffmpeg -f lavfi -i nullsrc=s=1280x720:r=1:d=1,lutrgb=255:0:255 purple.png

下面弄点好玩的

正弦信号音频

aevalsrc源可以产生特定参数的波形信号,前面aevalsrc=0产生静音信号,可以使用表达式来表示其信号波形。

生成48kHz采样率,频率为400Hz的长度10s的正弦信号单声道音频。

可以使用 Foobar2000 的 示波仪 看到正弦信号波形。

1
ffmpeg -f lavfi -i aevalsrc="sin(400*2*PI*t):s=48000:d=10" sin-400hz.mp3

生成正弦+余弦 双声道信号

1
ffmpeg -f lavfi -i aevalsrc="sin(400*2*PI*t)|cos(420*2*PI*t):d=10" sin-cos.mp3

长度可以使用d=10 或者 -t 10来指定。

白噪声信号音频

可以使用aevalsrc 或者 anoisesrc 函数来产生白噪声信号。

aevalsrc

使用随机数函数生成信号值

1
ffmpeg -f lavfi -i aevalsrc="-2+random(0)" -t 10 wn.mp3

anoisesrc

anoisesrc是专门用于产生噪声的源。

1
ffmpeg -f lavfi -i anoisesrc=c=white:c=white:r=44100:a=0.5:d=3 white.mp3
  • sample_rate, r

    采样率

  • amplitude, a

    声音幅值,0.0-1.0。

  • duration, d

    时长

  • color, colour, c

    噪声类型,white, pink, brown, blue, violet and velvet,默认白色。

文字转语音音频

这个功能需要集成libflite库,编译时配置参数--enable-libflite

1
2
3
4
5
# 读文本
ffmpeg -f lavfi -i flite=text='How are you? I am fine. Thank you and you?':voice=slt -t 10 voice.mp3

# 读文件
ffmpeg -f lavfi -i flite=textfile=speech.txt -t 10 voice.mp3

默认是男声,voice=slt是女声。

ffplay -f lavfi -i flite=list_voices=1可以列出所有支持的voice,例如:kal, slt, rms

测试发现不能识别中文,不知道是不是库版本原因。