sdl 保存pcm,实现倍速播放声音。

本文介绍了音频处理中的技术细节,包括使用SwrContext进行音频格式转换,以及如何通过改变SDL_AudioSpec的频率实现倍速播放。

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

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值