FFmpeg代码记录——滤波模块

一、音频滤波建立
描述:
啥都不干,就建立滤波模块,然后输入输出。
总体过程参看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);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值