音视频过滤器实战--音频混音

文章详细描述了一个名为AudioMixer的类,用于处理音频输入和输出,包括添加流、初始化、混音和文件操作。它利用FFmpeg库中的滤镜进行音频格式转换和混合,适用于多媒体处理应用。

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

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_H

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;      // 已经存在则返回-1
    }

    // 初始化一个input 可以有多个输入
    auto& filterInfo = audio_input_info_[index];
    // 初始化音频相关的参数
    filterInfo.samplerate = samplerate;
    filterInfo.channels = channels;
    filterInfo.bitsPerSample = bitsPerSample;
    filterInfo.format = format;
    filterInfo.name = std::string
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值