本文用libavfilter的另一种方法来转换原始音频格式,见代码。
#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)
{
char filter_descr[512];
char ch_string[20];
char args[512];
int ret = 0;
AVFilterGraph *filter_graph;
AVFilterContext *abuffer_ctx;
AVFilterContext *abuffersink_ctx;
const AVFilter *abuffersrc = avfilter_get_by_name("abuffer");
const AVFilter *abuffersink = avfilter_get_by_name("abuffersink");
AVFilterInOut *outputs = avfilter_inout_alloc();
AVFilterInOut *inputs = avfilter_inout_alloc();
static const enum AVSampleFormat out_sample_fmts[] = { OUTPUT_FORMAT, -1 };
static const int64_t out_channel_layouts[] = { OUTPUT_CHANNEL_LAYOUT, -1 };
static const int out_sample_rates[] = { OUTPUT_SAMPLERATE, -1 };
const AVFilterLink *outlink;
AVRational time_base = (AVRational){1, INPUT_SAMPLERATE};
filter_graph = avfilter_graph_alloc();
if (!outputs || !inputs || !filter_graph) {
ret = AVERROR(ENOMEM);
goto end;
}
snpr