使用FFmpeg和SDL_QueueAudio播放视频中的声音会产生高音调音频

问题描述 投票:0回答:1

我正在尝试使用SDL2和FFmpeg播放mp4文件中的音频,并且使用SDL_QueueAudio似乎比设置回调要容易得多。

我在此处或dranger tutorials中找到的所有解决方案均已弃用或使用了回调。我试着用ffmpeg和sdl标记(没有很多)浏览所有问题,但无济于事。我尝试将Dranger教程转换为使用不建议使用的调用,但是遇到了同样的问题。我正在使用C,FFmpeg 4.1和SDL 2.0.9。

这是AVCodecContext和AVCodec的设置:

    int audioStream = -1;
    for (i = 0; i < formatContext->nb_streams; i++) {
        if (audioStream < 0 && formatContext->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) {
            audioStream = i;
        }
    }

    AVCodecParameters *audioParams = formatContext->streams[audioStream]->codecpar;

    AVCodec *audioCodec = avcodec_find_decoder(audioParams->codec_id);

    AVCodecContext *audioCodecCtx = avcodec_alloc_context3(NULL);
    avcodec_open2(audioCodecCtx, audioCodec, NULL);

    SDL_Init(SDL_INIT_AUDIO)

    SDL_AudioSpec desired, obtained;
    SDL_zero(desired);
    SDL_zero(obtained);
    desired.freq = audioCodecCtx->sample_rate;
    desired.format = AUDIO_F32SYS;
    desired.channels = audioCodecCtx->channels;
    desired.silence = 0;
    desired.samples = AUDIO_BUFFER_SIZE;

    SDL_AudioDeviceID audioDevice = SDL_OpenAudioDevice(NULL, 0, &desired, &obtained, SDL_AUDIO_ALLOW_ANY_CHANGE);

这是主要的数据包解码循环:

    while (av_read_frame(formatContext, &packet) >= 0) {
        if (packet.stream_index == audioStream) {
            if (!avcodec_send_packet(audioCodecCtx, &packet)) {
                avcodec_receive_frame(audioCodecCtx, audioFrame);
                SDL_QueueAudio(audioDevice, audioFrame->data[0], audioFrame->linesize[0]);
            }
        }
    }

音频以正确的速度播放,但音调远高于实际水平。我希望它听起来与任何媒体播放器一样。编辑:我刚刚意识到测试视频具有立体声音频,但是我只是排队audioFrame.data[0],我认为这意味着我只播放一个频道。我尝试对也有数据的audioFrame.data[1]进行排队,但无法解决问题。我正确吗?如果正确,如何播放两个频道?

ffmpeg sdl sdl-2
1个回答
0
投票

对我有用的是调整频率。尝试将频率更改为audioCodecCtx->sample_rate * 0.5

© www.soinside.com 2019 - 2024. All rights reserved.