I need to write function in C that changes sample rate of one audio channel (float linear array).
I have this now:
<code>int resample_audio(float *audio_input, int input_sample_rate, int output_sample_rate, int input_num_of_samples, float *audio_output, int *result_num_of_samples) {
SwrContext* swr_ctx = swr_alloc();
if (!swr_ctx) {
fprintf(stderr, "Could not allocate SwrContextn");
return -1;
}
av_opt_set_int(swr_ctx, "in_channel_layout", AV_CH_LAYOUT_MONO, 0);
av_opt_set_int(swr_ctx, "out_channel_layout", AV_CH_LAYOUT_MONO, 0);
av_opt_set_int(swr_ctx, "in_sample_rate", input_sample_rate, 0);
av_opt_set_int(swr_ctx, "out_sample_rate", output_sample_rate, 0);
av_opt_set_sample_fmt(swr_ctx, "in_sample_fmt", AV_SAMPLE_FMT_FLT, 0);
av_opt_set_sample_fmt(swr_ctx, "out_sample_fmt", AV_SAMPLE_FMT_FLT, 0);
if (swr_init(swr_ctx) < 0) {
fprintf(stderr, "Failed to initialize the resampling context: %sn", av_err2str(swr_init(swr_ctx)));
swr_free(&swr_ctx);
return -1;
}
uint8_t **resampled_data = NULL;
int output_samples_count = av_rescale_rnd(swr_get_delay(swr_ctx, input_sample_rate) + input_num_of_samples, output_sample_rate, input_sample_rate, AV_ROUND_UP);
if (av_samples_alloc_array_and_samples(&resampled_data, NULL, 1, output_samples_count, AV_SAMPLE_FMT_FLT, 0) < 0) {
fprintf(stderr, "Could not allocate samplesn");
swr_free(&swr_ctx);
return -1;
}
const uint8_t *in_samples[1] = {(const uint8_t *)audio_input};
int frame_count = swr_convert(swr_ctx, resampled_data, output_samples_count, in_samples, input_num_of_samples);
if (frame_count < 0) {
fprintf(stderr, "Error while resamplingn");
av_freep(&resampled_data[0]);
free(resampled_data);
swr_free(&swr_ctx);
return -1;
}
audio_output = (float *) malloc(sizeof(float) * frame_count);
*result_num_of_samples = frame_count;
// exception
memcpy(audio_output, resampled_data[0], frame_count * sizeof(float));
av_freep(&resampled_data[0]);
free(resampled_data);
swr_free(&swr_ctx);
return SUCCESS;
}
</code>
<code>int resample_audio(float *audio_input, int input_sample_rate, int output_sample_rate, int input_num_of_samples, float *audio_output, int *result_num_of_samples) {
SwrContext* swr_ctx = swr_alloc();
if (!swr_ctx) {
fprintf(stderr, "Could not allocate SwrContextn");
return -1;
}
av_opt_set_int(swr_ctx, "in_channel_layout", AV_CH_LAYOUT_MONO, 0);
av_opt_set_int(swr_ctx, "out_channel_layout", AV_CH_LAYOUT_MONO, 0);
av_opt_set_int(swr_ctx, "in_sample_rate", input_sample_rate, 0);
av_opt_set_int(swr_ctx, "out_sample_rate", output_sample_rate, 0);
av_opt_set_sample_fmt(swr_ctx, "in_sample_fmt", AV_SAMPLE_FMT_FLT, 0);
av_opt_set_sample_fmt(swr_ctx, "out_sample_fmt", AV_SAMPLE_FMT_FLT, 0);
if (swr_init(swr_ctx) < 0) {
fprintf(stderr, "Failed to initialize the resampling context: %sn", av_err2str(swr_init(swr_ctx)));
swr_free(&swr_ctx);
return -1;
}
uint8_t **resampled_data = NULL;
int output_samples_count = av_rescale_rnd(swr_get_delay(swr_ctx, input_sample_rate) + input_num_of_samples, output_sample_rate, input_sample_rate, AV_ROUND_UP);
if (av_samples_alloc_array_and_samples(&resampled_data, NULL, 1, output_samples_count, AV_SAMPLE_FMT_FLT, 0) < 0) {
fprintf(stderr, "Could not allocate samplesn");
swr_free(&swr_ctx);
return -1;
}
const uint8_t *in_samples[1] = {(const uint8_t *)audio_input};
int frame_count = swr_convert(swr_ctx, resampled_data, output_samples_count, in_samples, input_num_of_samples);
if (frame_count < 0) {
fprintf(stderr, "Error while resamplingn");
av_freep(&resampled_data[0]);
free(resampled_data);
swr_free(&swr_ctx);
return -1;
}
audio_output = (float *) malloc(sizeof(float) * frame_count);
*result_num_of_samples = frame_count;
// exception
memcpy(audio_output, resampled_data[0], frame_count * sizeof(float));
av_freep(&resampled_data[0]);
free(resampled_data);
swr_free(&swr_ctx);
return SUCCESS;
}
</code>
int resample_audio(float *audio_input, int input_sample_rate, int output_sample_rate, int input_num_of_samples, float *audio_output, int *result_num_of_samples) {
SwrContext* swr_ctx = swr_alloc();
if (!swr_ctx) {
fprintf(stderr, "Could not allocate SwrContextn");
return -1;
}
av_opt_set_int(swr_ctx, "in_channel_layout", AV_CH_LAYOUT_MONO, 0);
av_opt_set_int(swr_ctx, "out_channel_layout", AV_CH_LAYOUT_MONO, 0);
av_opt_set_int(swr_ctx, "in_sample_rate", input_sample_rate, 0);
av_opt_set_int(swr_ctx, "out_sample_rate", output_sample_rate, 0);
av_opt_set_sample_fmt(swr_ctx, "in_sample_fmt", AV_SAMPLE_FMT_FLT, 0);
av_opt_set_sample_fmt(swr_ctx, "out_sample_fmt", AV_SAMPLE_FMT_FLT, 0);
if (swr_init(swr_ctx) < 0) {
fprintf(stderr, "Failed to initialize the resampling context: %sn", av_err2str(swr_init(swr_ctx)));
swr_free(&swr_ctx);
return -1;
}
uint8_t **resampled_data = NULL;
int output_samples_count = av_rescale_rnd(swr_get_delay(swr_ctx, input_sample_rate) + input_num_of_samples, output_sample_rate, input_sample_rate, AV_ROUND_UP);
if (av_samples_alloc_array_and_samples(&resampled_data, NULL, 1, output_samples_count, AV_SAMPLE_FMT_FLT, 0) < 0) {
fprintf(stderr, "Could not allocate samplesn");
swr_free(&swr_ctx);
return -1;
}
const uint8_t *in_samples[1] = {(const uint8_t *)audio_input};
int frame_count = swr_convert(swr_ctx, resampled_data, output_samples_count, in_samples, input_num_of_samples);
if (frame_count < 0) {
fprintf(stderr, "Error while resamplingn");
av_freep(&resampled_data[0]);
free(resampled_data);
swr_free(&swr_ctx);
return -1;
}
audio_output = (float *) malloc(sizeof(float) * frame_count);
*result_num_of_samples = frame_count;
// exception
memcpy(audio_output, resampled_data[0], frame_count * sizeof(float));
av_freep(&resampled_data[0]);
free(resampled_data);
swr_free(&swr_ctx);
return SUCCESS;
}
Every audio that I try to re-sample gives error : Invalid argument
in line with initializing SWR context (swr_init(swr_ctx) < 0
). Please , help me fix that …
New contributor
kitty uwu is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.