要实现两股音频混流功能,需要用到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