音频特效滤镜 via FFmpeg Filter
音频特效定义
音效或声效(Sound effects 或 Audio effects)是人工制造或加强的声音,用来增强对电影、电子游戏、音乐或其他媒体的艺术或其他内容的声音处理。
常见的音效技术有:回声、合唱、均衡(EQ)、过滤、变调、移相、压缩 / 拉伸、3D、调制和共鸣等等。
FFmpeg filter
FFmpeg 中的 libavfilter 提供了一整套的基于 filter 的机制。Filter 本身是一个插件的形式,可以快速的组装出需要的效果。
比如下面的 filter,可以实现音频的回声效果。
ffplay.exe sample.mp3 -af aecho=0.8:0.9:1000:0.3
FFmpeg 中 filter 分为:
- source filter (只有输出)
- audio filter
- video filter
- multimedia filter
- sink filter (只有输入)
这里 演示了一些非常精美的 filter。
FFmpeg filter graph
FFmpeg 将 filtergraph 分为 simple filtergraph 和 complex filtergraph。
- Simple filtergraph 通常只有一个输入和输出,FFmpeg 命令行中使用 -vf、-af 识别,基本原理图如下:

- Complex filtergraph 通常是具有多个输入输出文件,并有多条执行路径,FFmpeg 命令行中使用 -lavfi、-filter_complex 识别,基本原理图如下:

Filter graph 的语法
FFmpeg 中 filter 包含三个层次,filter → filterchain → filtergraph。
Filter 是 libavfilter 提供的基础单元。在同一个 filterchain 中的 filter 使用逗号分隔,在不同 filterchain 中的 filter 使用分号隔开,比如下面的例子:
ffmpeg -i INPUT -vf "split [main][tmp]; [tmp] crop=iw:ih/2:0:0, vflip [flip]; [main][flip] overlay=0:H/2" OUTPUT
Filtergraph 将输入流分成两个流,其中一个通过 crop filter 和 vflip filter,然后通过 overlay filter 将这个流和原始输入流合成一个流输出。如果 filter 需要输入参数,多个参数使用冒号分割。

这里 crop、vflip 处于同一个 filterchain,split、overlay 位于另一个 filterchain。二者通过命名的 label 实现连接(中括号中的即是 label 的名字)。在上例中 split filter 有两个输出,依次命名为 [main] 和 [tmp];[tmp] 作为 crop filter 的输入,之后通过 vflip filter 输出 [flip];overlay 的输入是 [main] 和 [flilp]。
av_filter_base 类
用 FFmpeg 的 filter 开发时主要区别就是把不同的 filter description string 传到 filtergraph 中,然后设定 sink 端 prefer 的参数,其他部分几乎是一样的,所以我把 filter 的使用封装成了一个 av_filter_base 类:
typedef int (*pf_filter_callback)(AVFrame *frame);
class av_filter_base
{
public:
av_filter_base();
virtual ~av_filter_base();
int init(AVCodecContext *dec_ctx, AVRational stream_time_base, const char *filters_descr);
int do_filter(AVFrame* in_frame, pf_filter_callback callback_proc);
int do_filter(AVFrame* in_frame, std::queue<AVFrame*>& out_frames);
void finalize();
protected:
virtual int init_opts(); // to override this function in sub class
private:
int audio_filter_init_begin(AVCodecContext *dec_ctx, AVRational stream_time_base);
int video_filter_init_begin(AVCodecContext *dec_ctx, AVRational stream_time_base);
int filter_init_end(const char *filters_descr

本文详细介绍FFmpeg的音频特效滤镜使用方法,包括filtergraph的构建、源滤镜和sink滤镜的创建,以及如何封装av_filter_base类简化滤镜应用。涵盖常见音效技术如回声、变调等实现。
最低0.47元/天 解锁文章
1220

被折叠的 条评论
为什么被折叠?



