.h文件
#pragma once
#include <mutex>
#include <iostream>
extern "C"
{
#include "libavcodec/avcodec.h"
#include "libavutil/avutil.h"
#include "libswresample/swresample.h"
}
#pragma comment(lib,"avutil.lib")
#pragma comment(lib,"avcodec.lib")
#pragma comment(lib,"swresample.lib")
class XResample
{
public:
XResample();
virtual ~XResample();
virtual bool Open(AVCodecParameters* param, bool isNeedClearParam = true);
virtual void Close();
virtual int Resample(AVFrame* indata, unsigned char* data);
int outFormat = 1;
protected:
std::mutex mux;
SwrContext* actx = NULL;
};
.cpp文件
#include "XResample.h"
XResample::XResample()
{
}
XResample::~XResample()
{
this->Close();
}
bool XResample::Open(AVCodecParameters* param, bool isNeedClearParam)
{
if (param == NULL)
return false;
this->Close();
mux.lock();
actx = swr_alloc_set_opts(actx,
av_get_default_channel_layout(param->channels),
(AVSampleFormat)outFormat,
param->sample_rate,
av_get_default_channel_layout(param->channels),
(AVSampleFormat)param->format,
param->sample_rate,
0,
0);
if (isNeedClearParam)
{
avcodec_parameters_free(¶m);
}
int re = swr_init(actx);
mux.unlock();
if (re != 0)
{
char buf[1024] = { 0 };
av_strerror(re, buf, sizeof(buf) - 1);
std::cout << " avcodec_send_packet--" << "--failed! : " << buf << std::endl;
getchar();
return -1;
}
return true;
}
void XResample::Close()
{
mux.lock();
if (actx)
swr_free(&actx);
mux.unlock();
}
int XResample::Resample(AVFrame* indata, unsigned char* outdata)
{
if (!indata )
return 0;
if (!outdata)
{
av_frame_free(&indata);
return 0;
}
uint8_t* data[2] = { 0 };
data[0] = outdata;
int re = swr_convert(actx,
data,
indata->nb_samples,
(const uint8_t**)indata->data,
indata->nb_samples
);
if (re <= 0)
{
av_frame_free(&indata);
return re;
}
int outSize = re * indata->channels * av_get_bytes_per_sample((AVSampleFormat)outFormat);
av_frame_free(&indata);
return outSize;
}