我是靠谱客的博主 震动导师,最近开发中收集的这篇文章主要介绍使用C++ 封装一个FFmpeg通用性Muxer和Encoder组件-3音频重采样,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

主要代码 这个逻辑简单 (S16 -> FLTP(AAC 默认格式))


源码github

AudioResampler 类的定义

extern "C"
{
#include "libavcodec/avcodec.h"
#include "libswresample/swresample.h"
#include "libavformat/avformat.h"
}


AVFrame* AllocFltpPcmFrame(int channls,int nb_samples);
void FreePcmFrame(AVFrame* frame);
class AudioResampler {
public:
    AudioResampler();
    ~AudioResampler();
    int InitFromS16ToFLTP(int in_channels,int in_sample_rate,int out_channels,int out_sample_rate);
    int ResampleFromS16ToFLTP(uint8_t* in_data, AVFrame *out_frame);
    void DeInit();

private:
    int in_channels_;
    int in_sample_rate_;
    int out_channels_;
    int out_sample_rate_;
    SwrContext* ctx_ = NULL;

};

实现类

#include "AudioResampler.h"

AudioResampler::AudioResampler() {}

AudioResampler::~AudioResampler() {
    if (ctx_){
        DeInit();
    }
}

void AudioResampler::DeInit() {
    if (ctx_){
        swr_free(&ctx_);
    }
}

// 初始化 重采样输入输出数据   一个初始化重采样上下文

int AudioResampler::InitFromS16ToFLTP(int in_channels, int in_sample_rate, int out_channels, int out_sample_rate) {
   in_channels_ = in_channels;
   in_sample_rate_ = in_sample_rate;
   out_channels_ = out_channels;
   out_sample_rate_ = out_sample_rate;

   ctx_ = swr_alloc_set_opts(ctx_,
                             av_get_default_channel_layout(out_channels),
                             AV_SAMPLE_FMT_FLTP,
                             out_sample_rate,
                             av_get_default_channel_layout(in_channels_),
                             AV_SAMPLE_FMT_S16,
                             in_sample_rate_,
                             0,
                             NULL);
    if(!ctx_){
        printf("swr_alloc_set_opts failedn");
        return -1;
    }

    int ret = swr_init(ctx_);
    if(ret < 0) {
        char errbuf[1024] = {0};
        av_strerror(ret, errbuf, sizeof(errbuf) - 1);
        printf("swr_init  failed:%sn",  errbuf);
        return -1;
    }
    return 0;

}
// 开始重采样 
int AudioResampler::ResampleFromS16ToFLTP(uint8_t *in_data, AVFrame *out_frame) {
    const uint8_t* indata[AV_NUM_DATA_POINTERS]={0};
    indata[0] = in_data;
    int samples = swr_convert(ctx_,out_frame->data,out_frame->nb_samples,indata,out_frame->nb_samples);
    if(samples <= 0) {
        return -1;
    }
    return samples;
}

// 创建一个新的frame
AVFrame* AllocFltpPcmFrame(int channels,int nb_samples){
    AVFrame* pcm = NULL;
    pcm = av_frame_alloc();
    pcm->format = AV_SAMPLE_FMT_FLTP;
    pcm->channels = channels;
    pcm->channel_layout = av_get_default_channel_layout(channels);
    pcm->nb_samples = nb_samples;

    int ret = av_frame_get_buffer(pcm,0);
    if(ret != 0) {
        char errbuf[1024] = {0};
        av_strerror(ret, errbuf, sizeof(errbuf) - 1);
        printf("av_frame_get_buffer failed:%sn", errbuf);
        av_frame_free(&pcm);
        return NULL;
    }
    return pcm;
}

void FreePcmFrame(AVFrame *frame)
{
    if(frame)
        av_frame_free(&frame);

最后

以上就是震动导师为你收集整理的使用C++ 封装一个FFmpeg通用性Muxer和Encoder组件-3音频重采样的全部内容,希望文章能够帮你解决使用C++ 封装一个FFmpeg通用性Muxer和Encoder组件-3音频重采样所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(32)

评论列表共有 0 条评论

立即
投稿
返回
顶部