1.解码后 需要进行转换
SwrContext *swrContext = swr_alloc();
AVSampleFormat dst_format = AV_SAMPLE_FMT_S16;//av_get_packed_sample_fmt((AVSampleFormat)frame->format);
Uint64 dst_layout = av_get_default_channel_layout(frame->channels);
// 设置解码参数
swrContext = swr_alloc_set_opts(nullptr, dst_layout, dst_format, frame->sample_rate,
frame->channel_layout, (AVSampleFormat)frame->format, frame->sample_rate, 0, nullptr);
if (!swrContext || swr_init(swrContext) < 0)
return -1;
uint8_t *outBuffer;
av_samples_alloc(&outBuffer, NULL, 2, frame->nb_samples, AV_SAMPLE_FMT_S16, 0);
int nbSamples = swr_convert(swrContext, &outBuffer, frame->nb_samples, (const uint8_t **)frame->data, frame->nb_samples);
// 写入PCM数据到文件
fwrite(outBuffer, 1, nbSamples * 2 * 2, audio_dst_file3); // 2 channels * 2 bytes per sample
av_freep(&outBuffer);
2.倍速播放,需要将参数的频率改变。
SDL_AudioSpec desired;
desired.freq = audio_ctx->sample_rate*1.5; //想实现倍速播放,直接修改频率
desired.channels = audio_ctx->channels;
desired.format = AUDIO_S16SYS;
desired.samples = 1024;
desired.silence = 0;
desired.userdata = this;
desired.callback = audio_callback;
if (SDL_OpenAudio(&desired, nullptr) < 0)
{
return false;
}
SDL_PauseAudio(0); // playing