【音视频】音频混流-avfilter(六)

该博客介绍了如何利用ffmpeg的filter库实现音频混流功能,通过初始化音频混合器、开启混流线程和数据源输入,详细阐述了音频融合的主要流程,并提到了关键库avfilter-7.dll的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

要实现两股音频混流功能,需要用到ffmpeg的filter库,它可以自定义过滤器并实现两股甚至多股音频的融合。

技术简介

使用ffmpeg的filter功能实现

使用模块(库)

使用ffmpeg的avfilter-7.dll

主要流程和代码

1、初始化音频混合器

int AudioMixer::init(const AUDIO_FILTER_CTX& outCtx, const AUDIO_FILTER_CTX* inCtx0, const AUDIO_FILTER_CTX* inCtx1)
{
   
	int err = ERROR_CODE_OK;

	if (m_inited) {
   
		return err;
	}

	if (inCtx0 == nullptr || inCtx1 == nullptr) {
   
		err = ERROR_CODE_PARAMS_ERROR;
		return err;
	}

	do {
   
		m_filterGraph = avfilter_graph_alloc();
		if (m_filterGraph == nullptr) {
   
			err = ERROR_CODE_FILTER_ALLOC_GRAPH_FAILED;
			break;
		}

		m_filterInCtxs = new AUDIO_FILTER_CTX[AUDIO_MIXER_FILTER_IN_CTX_MAX_SIZE];
		m_filterInCtxs[0] = *inCtx0;
		m_filterInCtxs[1] = *inCtx1;
		m_filterOutCtx = outCtx;

		m_filterInCtxs[0].filterInout = avfilter_inout_alloc();
		m_filterInCtxs[1].filterInout = avfilter_inout_alloc();
		m_filterOutCtx.filterInout = avfilter_inout_alloc();

		char filterInArgs[2][512] = {
    0 };
		for (int i = 0; i < AUDIO_MIXER_FILTER_IN_CTX_MAX_SIZE; i++) {
   
			sprintf_s(filterInArgs[i], sizeof(filterInArgs[i]), "time_base=%d/%d:sample_rate=%d:sample_fmt=%s:channel_layout=0x%I64x",
				m_filterInCtxs[i].timebase.num, m_filterInCtxs[i].timebase.den, m_filterInCtxs[i].samplerate,
				av_get_sample_fmt_name(m_filterInCtxs[i].sampleFmt), av_get_default_channel_layout(m_filterInCtxs[i].channels));
		}
		
		int ret = 0;
		for (int i = 0; i < AUDI
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值