本文将用libavfilter来转换原始音频格式。程序输入一个原始音频文件:pcm格式,采样率48000,2声道,AV_SAMPLE_FMT_FLT格式。输出:pcm格式,采样率44100,1声道,AV_SAMPLE_FMT_S16P格式。
程序流程如下:
上面的filter都是FFmpeg内置的,设置参数,然后调用即可。所有的filter依次连接,形成filter链。
abuffer filter:filter链的开始端,用于设置输入音频数据的格式,包括声道、采样率、存储格式等。
volume filter:用于设置音量。
aformat filter:用于设置输出音频数据的格式,包括声道、采样率、存储格式等。
abuffersink filter:filter链的结束端,用于结束整个filter链。
#include <inttypes.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include "libavutil/channel_layout.h"
#include "libavutil/md5.h"
#include "libavutil/mem.h"
#include "libavutil/opt.h"
#include "libavutil/samplefmt.h"
#include "libavfilter/avfilter.h"
#include "libavfilter/buffersink.h"
#include "libavfilter/buffersrc.h"
#define INPUT_SAMPLERATE 48000
#define INPUT_FORMAT AV_SAMPLE_FMT_FLT
#define INPUT_CHANNEL_LAYOUT AV_CH_LAYOUT_STEREO
#define OUTPUT_SAMPLERATE 44100
#define OUTPUT_FORMAT AV_SAMPLE_FMT_S16P
#define OUTPUT_CHANNEL_LAYOUT AV_CH_LAYOUT_MONO
#define VOLUME_VAL 0.90
#define FRAME_SIZE 1024
static int init_filter_graph(AVFilterGraph **graph, AVFilterContext **src,
AVFilterContext **sink)
{
AVFilterGraph *filter_graph;
AVFilterContext *abuffer_ctx;
const AVFilter *abuffer;
AVFilterContext *volume_ctx;
const AVFilter *volume;
AVFilterContext *aformat_ctx;
const AVFilter *aformat;
AVFilterContext *abuffersink_ctx;
const AVFilter *abuffersink;
AVDictionary *options_dict = NULL;
char options_str[1024];
char ch_layout[64];
int err;
/* 创建filtergraph,包含所有的filter */
filter_graph = avfilter_graph_alloc();