25.FFmpeg学习笔记 - 用libavfilter转换原始音频格式2

本文用libavfilter的另一种方法来转换原始音频格式,见代码。

#include 
#include 
#include 
#include 

#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

你可能感兴趣的:(FFmpeg)