ffmpeg进行混音,将两路音频pcm数据合成一路输出
audiomixer.h
#ifndef AUDIOMIXER_H
#define AUDIOMIXER_H
#include <map>
#include <mutex>
#include <cstdio>
#include <cstdint>
#include <string>
#include <memory>
extern "C"
{
#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
#include <libavfilter/buffersink.h>
#include <libavfilter/buffersrc.h>
#include <libavutil/opt.h>
}
class AudioMixer
{
public:
AudioMixer();
virtual ~AudioMixer();
//添加音频输入通道
int addAudioInput(uint32_t index, uint32_t samplerate, uint32_t channels, uint32_t bitsPerSample, AVSampleFormat format);
//添加音频输出通道
int addAudioOutput(const uint32_t samplerate, const uint32_t channels, const uint32_t bitsPerSample, const AVSampleFormat format);
//多个通道时,混音持续到时间最长的一个通道为止
int init(const char* duration = "longest");
int exit();
int addFrame(uint32_t index, uint8_t *inBuf, uint32_t size);
int getFrame(uint8_t *outBuf, uint32_t maxOutBufSize);
private:
struct AudioInfo
{
AudioInfo()
{
filterCtx = nullptr;
}
AVFilterContext *filterCtx;
uint32_t samplerate;
uint32_t channels;
uint32_t bitsPerSample;
AVSampleFormat format;
std::string name;
};
AVFilterGraph* filterGraph;
bool inited;
std::mutex mutex;
//输入
std::map<uint32_t, AudioInfo> audio_input_infos;
//转换格式
std::shared_ptr<AudioInfo> audio_output_info_ptr;
//输出
std::shared_ptr<AudioInfo> audio_sink_info_ptr;
//混音
std::shared_ptr<AudioInfo> audio_mix_info_ptr;
};
#endif // AUDIOMIXER_H
audiomixer.cpp
#include "audiomixer.h"
#include <iostream>
AudioMixer::AudioMixer():
inited(false),
filterGraph(nullptr),
audio_output_info_ptr(nullptr)
{
//初始化重置智能指针
audio_mix_info_ptr.reset(new AudioInfo);
audio_mix_info_ptr->name = "amix";//混音
audio_sink_info_ptr.reset(new AudioInfo);
audio_sink_info_ptr->name = "sink";//输出
}
AudioMixer::~AudioMixer()
{
if(inited)
{
exit();
}
}
int AudioMixer::addAudioInput(uint32_t index, uint32_t samplerate, uint32_t channels, uint32_t bitsPerSample, AVSampleFormat format)
{
std::lock_guard<std::mutex> locker(mutex);
if(inited)
{
std::cout<< __PRETTY_FUNCTION__ << "inited return -1!" << std::endl;
return -1;
}
//根据index保存是否已经存在
if(audio_input_infos.find(index) != audio_input_infos.end())
{
return -1;
}
//
auto& filterInfo = audio_input_infos[index];
//设置音频相关参数
filterInfo.samplerate = samplerate;
filterInfo.channels = channels;
filterInfo.bitsPerSample = bitsPerSample;
filterInfo.format = format;
filterInfo.name = std::string("input") + std::to_string(index);
return 0;
}
int AudioMixer::addAudioOutput(const uint32_t samplerate, const uint32_t chann

本文介绍了一个使用FFmpeg实现多路音频混音的C++类库。通过该库可以将不同采样率、位深及声道数的音频混合并转换为指定格式输出。示例程序展示了如何添加输入音频流、初始化混音器、添加音频帧及获取输出。

1378

被折叠的 条评论
为什么被折叠?



