1、添加并初始化音频输入、输出流
2、打开输入、输出音频文件
3、添加音频帧数据,然后循环获取输出的音频帧,将音频数据写文件保存
4、代码实例
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;
}
uint32_t samplerate;
uint32_t channels;
uint32_t bitsPerSample;
AVSampleFormat format;
std::string name;
AVFilterContext *filterCtx;
};
bool initialized_ = false;
std::mutex mutex_;
std::map<uint32_t, AudioInfo> audio_input_info_;
std::shared_ptr<AudioInfo> audio_output_info_;
std::shared_ptr<AudioInfo> audio_mix_info_;
std::shared_ptr<AudioInfo> audio_sink_info_;
AVFilterGraph *filter_graph_ = nullptr;
};
#endif
audiomixer.cpp
#include "audiomixer.h"
AudioMixer::AudioMixer()
: initialized_(false)
, filter_graph_(nullptr)
, audio_output_info_(nullptr)
{
audio_mix_info_.reset(new AudioInfo);
audio_mix_info_->name = "amix";
audio_sink_info_.reset(new AudioInfo);
audio_sink_info_->name = "sink";
}
AudioMixer::~AudioMixer()
{
if(initialized_) {
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 (initialized_)
{
return -1;
}
if (audio_input_info_.find(index) != audio_input_info_.end())
{
return -1;
}
auto& filterInfo = audio_input_info_[index];
filterInfo.samplerate = samplerate;
filterInfo.channels = channels;
filterInfo.bitsPerSample = bitsPerSample;
filterInfo.format = format;
filterInfo.name = std::string