FFmpeg 内置的一个无中生有的音视频输入数据

2021年9月19日 470点热度 0人点赞 0条评论


背景


相信很多人在遇到音视频处理的时候,或者做音视频数据测试的时候,会因为把握不好音视频输入源的而苦恼。当然,有的人有很多种子的可能不但不会苦恼而且还会很欢乐。可是我们用在工作中的测试视频,总不能拿那些用种子下载下来的葫芦娃、黑猫警长、汪汪队立大功来测试吧?毕竟那是有版权的视频,拿来乱用也不太合适。而开放版权测试素材也有,但是并不多,例如大雄兔(Big Buck Bunny),长这样:

图片


还有一个钢铁之泪(Tears of Steel),长这样:

图片


除了这些,再就是常见的花花公子经典照片Lena这种图片了。而视频呢,上面两种应该是比较常用的,其实也不太够用,尤其是想要逐帧确认,或者测试音频之类的情况的时候,并且这些视频一直在电脑里存着也挺占地方的,现场下载也挺浪费时间的,所以 FFmpeg 提供了一组虽然看上去不那么美观,但是应该足够用调试和测试用的视频源数据生成的方法。


初步讲解

首先如果信息的朋友,或者是在用ffmpeg的时候用过这条命令查看ffmpeg在当前电脑中支持的设备的时候,应该能够看到这样的输出信息:

(base) liuqideMacBook-Pro:ffmpeg liuqi$ ffmpeg -hide_banner -devicesDevices: D. = Demuxing supported .E = Muxing supported --  E audiotoolbox    AudioToolbox output device D  avfoundation    AVFoundation input device D  lavfi           Libavfilter virtual input device  E sdl,sdl2        SDL2 output device(base) liuqideMacBook-Pro:ffmpeg liuqi$

其实吧,这样的命令行在《FFmpeg 从入门到精通》中也有介绍,只是好多人可能只顾着吐槽命令行太多,而忽略了输出内容的有用性和知识的有用性,其中Demuxing在这里是输入设备的意思,Muxing在这里是输出设备的意思。那么从这条命令的输出信息中可以看到,输入设备支持avfoundation和lavfi,avfoundation如果你用的是苹果电脑,这个就是苹果设备采集桌面、摄像头、音频采集设备(为啥我不说麦克风呢?因为现在好多杠精很会杠,你说麦克风他可能会说小爱同学、小度小度、你好小迪这种音频采集设备,所以叫音频采集设备是为了‘泛’一下,尽量让杠精无逼可装),这些不是重点,看一下另外一个输入设备 -- lavfi,从后面的说明信息可以知道,他是一个用libavfilter虚拟的输入设备,明面文字已经很好理解了,他是一个输入设备,而且是虚拟的,那么我们看一下这个虚拟设备咋用。

这个设备没有list_devices参数,有兴趣的朋友可以考虑给ffmpeg加一个,或者等我们有空的时候加一个,目前看上去只能看文档了

音频的在这:

https://ffmpeg.org/ffmpeg-filters.html#Audio-Sources

可用的源有这些:

abufferaevalsrcafirsrcanullsrcfliteanoisesrchilbertsincsine

视频的在这:

https://ffmpeg.org/ffmpeg-filters.html#Video-Sources

可用的源有这些:

buffercellautocoreimagesrcgradientsmandelbrotmptestsrcfrei0r_srclifeallrgb, allyuv, color, haldclutsrc, nullsrc, pal75bars, pal100bars, rgbtestsrc, smptebars, smptehdbars, testsrc, testsrc2, yuvtestsrcopenclsrcsierpinski

因为源太多,就不一一讲解了,随便找几个举举例子,剩下的大伙可以自己挨个尝试了解。

进一步讲解

音频我们举两个例子,其中有一个在咱们这个公众号的历史分享中音频处理相关的内容中有用到。

静音源 - anullsrc


当我们想要给音频加一个静音背景的时候,用这个滤镜比较好,我们可以试一下:

ffmpeg -f lavfi -i anullsrc=r=48000:cl=mono -acodec aac -r:a 48000 -b:a 128k output.aac

这样的话,将会生成一个静音的音频内容,采样率是48000 hz,声道布局是front center。

表达式生成音频数据 -- aevalsrc

当我们想要自己生成一个耳朵能听到的声音的时候,用这个滤镜比较好,而且生成音频的表达式我们可以自己根据个人喜好调整。我们可以试一下:

ffmpeg -f lavfi -i aevalsrc="sin(440*2*PI*t):s=8000" -acodec aac -r:a 8000 -b:a 128k output.aac

这样的话将会生成频率为 440 hz 的正弦信号,采样率设置为 8000 hz:

以上两种音频生成的方式都可以与其他音频通过音频滤镜混合使用,例如amerge、amix等。

这些源还有一些额外的参数可以设置:

n   采样数信息t   生成音频的总时长,从0开始计算s   音频采样率cl  channel layout设置,个别音频源支持

如果想快速验证其他音频源的信息并且不想生成文件的话,可以用ffplay挨个试试看:

ffplay -f lavfi -i aevalsrc="sin(440*2*PI*t):s=8000"

纯色视频源 -- color

当我们想要生成一个纯色的视频,例如黑色,例如红色,例如绿色的视频,可以考虑使用color设备源,如果生成纯红色的视频,试一下:

ffmpeg -hide_banner -f lavfi -i color=c=red:s=176x144 -vcodec libx264 -t 1 -y out.mp4

这样的话会生成一个红色,分辨率是176x144的1秒钟的视频,看一下效果:

图片

带时间及帧序信息源 -- testsrc2

当我们不确定编解码器是否有丢帧,或者想跟一下帧序,或者了解一下视频图像前后序列相关的信息的时候,可以用testsrc2这个源,这个源可以生成比较复杂的视频,有运动,有彩条,有时间信息,有帧序号。试一下:

ffmpeg -hide_banner -f lavfi -i testsrc2=s=1280x720 -vcodec libx264 -y -t 5 output.mp4

这样的话会生成一个分辨率为1270x720的视频5秒钟的视频,看一下效果:

左上角是视频的时间信息、帧序列信息,其他部分是视频测试的彩条,运动相关的内容。

这些源还有一些额外的参数可以设置:

c   颜色,比如red红色,blue蓝色,yellow黄色,ffmpeg -colors可以看到颜色信息,这个用于纯色源s   分辨率,比如176x144,1280x720,1920x1080 blablaxblablad   总时长,从0开始算r   帧率,一秒钟几图像

其他还需要自己看文档,目前看这几个应该够大部分场景用了。

深度了解一些


那就得看源代码了,都是像素内容生成的,文件在这里:

http://git.videolan.org/?p=ffmpeg.git;a=blob;f=libavfilter/vsrc_testsrc.c;h=414950c4423618d7c8bcc60987ab6eef1ef19126;hb=HEAD

算法和技巧类的内容,自己看吧,挨个讲解太闹心。testsrc2关键图像生成内容在这里:

test2_fill_picture

需要有一定的RGB色彩图像基础知识,根据宽高在画布中绘制步骤也已经在代码中有注释。

79360FFmpeg 内置的一个无中生有的音视频输入数据

这个人很懒,什么都没留下

文章评论