一、音频滤波建立
描述:
啥都不干,就建立滤波模块,然后输入输出。
总体过程参看init_filter函数就行
环境:
QT5.7.1
#include <QDebug>
extern "C" {
#include <libavfilter/avfilter.h>
#include <libavfilter/buffersink.h>
#include <libavfilter/buffersrc.h>
#include <libavformat/avformat.h>
#include <libavcodec/avcodec.h>
#include <libavutil/opt.h>
#include <libavutil/dict.h>
}
#define LOG qDebug()
static void log_errstr(int ret)
{
char err[AV_ERROR_MAX_STRING_SIZE];
av_make_error_string(err, AV_ERROR_MAX_STRING_SIZE, ret);
LOG << "error:" << err;
}
int filter_graph_create_filter(AVFilterContext **filt_ctx, const AVFilter *filt,
const char *name, const char *args, void *opaque,
AVFilterGraph *graph_ctx)
{
int ret;
*filt_ctx = avfilter_graph_alloc_filter(graph_ctx, filt, name);
if (!*filt_ctx)
return AVERROR(ENOMEM);
ret = avfilter_init_str(*filt_ctx, args);
if (ret < 0){
log_errstr(ret);
goto fail;
}
return 0;
fail:
if (*filt_ctx)
avfilter_free(*filt_ctx);
*filt_ctx = NULL;
return ret;
}
struct Stream
{
AVCodec* c;
AVCodecContext* cc;
AVStream* st;
AVFrame* frame;
void free(){
avcodec_free_context(&cc);
av_frame_free(&frame);
}
};
struct Filter
{
AVFilterContext* filt;
AVFilterContext* src;
AVFilterContext* sink;
AVFilterGraph* graph;
int init(const char* descr, AVCodecContext* cc)
{
int ret;
const AVFilter* abuffer= avfilter_get_by_name("abuffer"),
* buffersink= avfilter_get_by_name("abuffersink");
AVFilterInOut* inputs= avfilter_inout_alloc(),
*outputs= avfilter_inout_alloc();
static const enum AVSampleFormat out_sample_fmts[] = { AV_SAMPLE_FMT_S16, (AVSampleFormat)-1 };
static const int64_t out_channel_layouts[] = { AV_CH_LAYOUT_MONO, -1 };
static const int out_sample_rates[] = { 8000, -1 };
//! init graph
graph= avfilter_graph_alloc();
if(!graph || !inputs || !outputs)
return AVERROR(ENOMEM);
//! init src filter
if(!cc->channel_layout)
cc->channel_layout= av_get_default_channel_layout(cc->channels);
char args[512]= {0};
_sprintf_p(args, sizeof(args), "time_base=%d%d : sample_rate=%d : sample_fmt=%s : channel_layout=0x%"PRIX64,
cc->time_base.num, cc->time_base.den,
cc->sample_rate,
av_get_sample_fmt_name(cc->sample_fmt),
cc->channel_layout);
ret= filter_graph_create_filter(&src, abuffer, "in", args, NULL, graph);