fi bug of FfmpegLoad

This commit is contained in:
雾聪 2023-12-15 10:27:59 +08:00
parent 51f7b76660
commit 3313eb681e
2 changed files with 18 additions and 22 deletions

View File

@ -61,10 +61,10 @@ class Audio {
void Disp(); void Disp();
void WavResample(int32_t sampling_rate, const float *waveform, int32_t n); void WavResample(int32_t sampling_rate, const float *waveform, int32_t n);
bool LoadWav(const char* buf, int n_len, int32_t* sampling_rate); bool LoadWav(const char* buf, int n_len, int32_t* sampling_rate);
bool LoadWav(const char* filename, int32_t* sampling_rate); bool LoadWav(const char* filename, int32_t* sampling_rate, bool resample=true);
bool LoadWav2Char(const char* filename, int32_t* sampling_rate); bool LoadWav2Char(const char* filename, int32_t* sampling_rate);
bool LoadPcmwav(const char* buf, int n_file_len, int32_t* sampling_rate); bool LoadPcmwav(const char* buf, int n_file_len, int32_t* sampling_rate);
bool LoadPcmwav(const char* filename, int32_t* sampling_rate); bool LoadPcmwav(const char* filename, int32_t* sampling_rate, bool resample=true);
bool LoadPcmwav2Char(const char* filename, int32_t* sampling_rate); bool LoadPcmwav2Char(const char* filename, int32_t* sampling_rate);
bool LoadOthers2Char(const char* filename); bool LoadOthers2Char(const char* filename);
bool FfmpegLoad(const char *filename, bool copy2char=false); bool FfmpegLoad(const char *filename, bool copy2char=false);

View File

@ -354,9 +354,7 @@ bool Audio::FfmpegLoad(const char *filename, bool copy2char){
while (avcodec_receive_frame(codecContext, frame) >= 0) { while (avcodec_receive_frame(codecContext, frame) >= 0) {
// Resample audio if necessary // Resample audio if necessary
std::vector<uint8_t> resampled_buffer; std::vector<uint8_t> resampled_buffer;
int in_samples = frame->nb_samples; int out_samples = av_rescale_rnd(swr_get_delay(swr_ctx, codecContext->sample_rate) + frame->nb_samples,
uint8_t **in_data = frame->extended_data;
int out_samples = av_rescale_rnd(in_samples,
dest_sample_rate, dest_sample_rate,
codecContext->sample_rate, codecContext->sample_rate,
AV_ROUND_DOWN); AV_ROUND_DOWN);
@ -364,20 +362,20 @@ bool Audio::FfmpegLoad(const char *filename, bool copy2char){
int resampled_size = out_samples * av_get_bytes_per_sample(AV_SAMPLE_FMT_S16); int resampled_size = out_samples * av_get_bytes_per_sample(AV_SAMPLE_FMT_S16);
if (resampled_buffer.size() < resampled_size) { if (resampled_buffer.size() < resampled_size) {
resampled_buffer.resize(resampled_size); resampled_buffer.resize(resampled_size);
} }
uint8_t *resampled_data = resampled_buffer.data(); uint8_t *resampled_data = resampled_buffer.data();
int ret = swr_convert( int ret = swr_convert(
swr_ctx, swr_ctx,
&resampled_data, // output buffer &resampled_data, // output buffer
resampled_size, // output buffer size out_samples, // output buffer size
(const uint8_t **)(frame->data), //(const uint8_t **)(frame->extended_data) (const uint8_t **)(frame->data), // choose channel
in_samples // input buffer size frame->nb_samples // input buffer size
); );
if (ret < 0) { if (ret < 0) {
LOG(ERROR) << "Error resampling audio"; LOG(ERROR) << "Error resampling audio";
break; break;
} }
std::copy(resampled_buffer.begin(), resampled_buffer.end(), std::back_inserter(resampled_buffers)); resampled_buffers.insert(resampled_buffers.end(), resampled_buffer.begin(), resampled_buffer.begin() + resampled_size);
} }
} }
} }
@ -539,9 +537,7 @@ bool Audio::FfmpegLoad(const char* buf, int n_file_len){
while (avcodec_receive_frame(codecContext, frame) >= 0) { while (avcodec_receive_frame(codecContext, frame) >= 0) {
// Resample audio if necessary // Resample audio if necessary
std::vector<uint8_t> resampled_buffer; std::vector<uint8_t> resampled_buffer;
int in_samples = frame->nb_samples; int out_samples = av_rescale_rnd(swr_get_delay(swr_ctx, codecContext->sample_rate) + frame->nb_samples,
uint8_t **in_data = frame->extended_data;
int out_samples = av_rescale_rnd(in_samples,
dest_sample_rate, dest_sample_rate,
codecContext->sample_rate, codecContext->sample_rate,
AV_ROUND_DOWN); AV_ROUND_DOWN);
@ -549,20 +545,20 @@ bool Audio::FfmpegLoad(const char* buf, int n_file_len){
int resampled_size = out_samples * av_get_bytes_per_sample(AV_SAMPLE_FMT_S16); int resampled_size = out_samples * av_get_bytes_per_sample(AV_SAMPLE_FMT_S16);
if (resampled_buffer.size() < resampled_size) { if (resampled_buffer.size() < resampled_size) {
resampled_buffer.resize(resampled_size); resampled_buffer.resize(resampled_size);
} }
uint8_t *resampled_data = resampled_buffer.data(); uint8_t *resampled_data = resampled_buffer.data();
int ret = swr_convert( int ret = swr_convert(
swr_ctx, swr_ctx,
&resampled_data, // output buffer &resampled_data, // output buffer
resampled_size, // output buffer size out_samples, // output buffer size
(const uint8_t **)(frame->data), //(const uint8_t **)(frame->extended_data) (const uint8_t **)(frame->data), // choose channel: channel_data
in_samples // input buffer size frame->nb_samples // input buffer size
); );
if (ret < 0) { if (ret < 0) {
LOG(ERROR) << "Error resampling audio"; LOG(ERROR) << "Error resampling audio";
break; break;
} }
std::copy(resampled_buffer.begin(), resampled_buffer.end(), std::back_inserter(resampled_buffers)); resampled_buffers.insert(resampled_buffers.end(), resampled_buffer.begin(), resampled_buffer.begin() + resampled_size);
} }
} }
} }
@ -614,7 +610,7 @@ bool Audio::FfmpegLoad(const char* buf, int n_file_len){
} }
bool Audio::LoadWav(const char *filename, int32_t* sampling_rate) bool Audio::LoadWav(const char *filename, int32_t* sampling_rate, bool resample)
{ {
WaveHeader header; WaveHeader header;
if (speech_data != NULL) { if (speech_data != NULL) {
@ -676,7 +672,7 @@ bool Audio::LoadWav(const char *filename, int32_t* sampling_rate)
} }
//resample //resample
if(*sampling_rate != dest_sample_rate){ if(resample && *sampling_rate != dest_sample_rate){
WavResample(*sampling_rate, speech_data, speech_len); WavResample(*sampling_rate, speech_data, speech_len);
} }
@ -867,7 +863,7 @@ bool Audio::LoadPcmwavOnline(const char* buf, int n_buf_len, int32_t* sampling_r
return false; return false;
} }
bool Audio::LoadPcmwav(const char* filename, int32_t* sampling_rate) bool Audio::LoadPcmwav(const char* filename, int32_t* sampling_rate, bool resample)
{ {
if (speech_data != NULL) { if (speech_data != NULL) {
free(speech_data); free(speech_data);
@ -908,7 +904,7 @@ bool Audio::LoadPcmwav(const char* filename, int32_t* sampling_rate)
} }
//resample //resample
if(*sampling_rate != dest_sample_rate){ if(resample && *sampling_rate != dest_sample_rate){
WavResample(*sampling_rate, speech_data, speech_len); WavResample(*sampling_rate, speech_data, speech_len);
} }