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

本文详细介绍了如何利用libavfilter库在FFmpeg中实现原始音频格式的转换,通过示例代码展示了具体操作步骤。
摘要由CSDN通过智能技术生成

本文用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
这个命令是一个编译 `ffplay.c` 文件的命令,其中包含了 FFmpeg 库和 SDL 库的头文件路径和库文件路径。 具体来说,`-I` 选项用于指定头文件路径,`-L` 选项用于指定库文件路径,`-l` 选项用于指定需要链接的库文件名。下面是这个命令中的各个选项的含义: - `-I../libavformat`: 指定了 FFmpeg 中 `libavformat` 库的头文件路径。 - `-I../libavcodec`: 指定了 FFmpeg 中 `libavcodec` 库的头文件路径。 - `-I../libavutil`: 指定了 FFmpeg 中 `libavutil` 库的头文件路径。 - `-I../libswresample`: 指定了 FFmpeg 中 `libswresample` 库的头文件路径。 - `-I../libswscale`: 指定了 FFmpeg 中 `libswscale` 库的头文件路径。 - `-I../libavfilter`: 指定了 FFmpeg 中 `libavfilter` 库的头文件路径。 - `-L../libavcodec`: 指定了 FFmpeg 中 `libavcodec` 库的库文件路径。 - `-L../libavformat`: 指定了 FFmpeg 中 `libavformat` 库的库文件路径。 - `-L../libavutil`: 指定了 FFmpeg 中 `libavutil` 库的库文件路径。 - `-L../libswresample`: 指定了 FFmpeg 中 `libswresample` 库的库文件路径。 - `-L../libswscale`: 指定了 FFmpeg 中 `libswscale` 库的库文件路径。 - `-L../libavfilter`: 指定了 FFmpeg 中 `libavfilter` 库的库文件路径。 - `-lavformat`: 指定了需要链接的 FFmpeg 中 `libavformat` 库的名称。 - `-lavcodec`: 指定了需要链接的 FFmpeg 中 `libavcodec` 库的名称。 - `-lswresample`: 指定了需要链接的 FFmpeg 中 `libswresample` 库的名称。 - `-lswscale`: 指定了需要链接的 FFmpeg 中 `libswscale` 库的名称。 - `-lavutil`: 指定了需要链接的 FFmpeg 中 `libavutil` 库的名称。 - `-lavfilter`: 指定了需要链接的 FFmpeg 中 `libavfilter` 库的名称。 - `-lm`: 指定需要链接的数学库。 - `-lz`: 指定需要链接的压缩库。 - `-pthread`: 指定需要链接的线程库。 - `-lSDL2`: 指定需要链接的 SDL2 库的名称。 这个命令的作用是将 `ffplay.c` 编译成可执行文件 `ffplay`,并链接上 FFmpeg 和 SDL 库。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值