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

本文介绍如何利用FFmpeg的libavfilter库,将一个48000采样率、2声道、AV_SAMPLE_FMT_FLT格式的原始pcm音频文件,转换为44100采样率、1声道、AV_SAMPLE_FMT_S16P格式。通过abuffer、volume、aformat和abuffersink等过滤器进行处理。
摘要由CSDN通过智能技术生成

本文将用libavfilter来转换原始音频格式。程序输入一个原始音频文件:pcm格式,采样率48000,2声道,AV_SAMPLE_FMT_FLT格式。输出:pcm格式,采样率44100,1声道,AV_SAMPLE_FMT_S16P格式。

程序流程如下:

上面的filter都是FFmpeg内置的,设置参数,然后调用即可。所有的filter依次连接,形成filter链。

abuffer filter:filter链的开始端,用于设置输入音频数据的格式,包括声道、采样率、存储格式等。

volume filter:用于设置音量。 

aformat filter:用于设置输出音频数据的格式,包括声道、采样率、存储格式等。

abuffersink filter:filter链的结束端,用于结束整个filter链。

#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)
{
    AVFilterGraph *filter_graph;
    AVFilterContext *abuffer_ctx;
    const AVFilter  *abuffer;
    AVFilterContext *volume_ctx;
    const AVFilter  *volume;
    AVFilterContext *aformat_ctx;
    const AVFilter  *aformat;
    AVFilterContext *abuffersink_ctx;
    const AVFilter  *abuffersink;
    
    AVDictionary *options_dict = NULL;
    char options_str[1024];
    char ch_layout[64];
    
    int err;
    
    /* 创建filtergraph,包含所有的filter */
    filter_graph = avfilter_graph_alloc();
 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值