Воспроизведение звука из видео с использованием FFmpeg и SDL_QueueAudio приводит к высокому звуку - PullRequest
0 голосов
/ 31 марта 2019

Я пытаюсь воспроизвести аудио из файла mp4, используя SDL2 и FFmpeg, и использование SDL_QueueAudio кажется намного проще, чем настройка обратного вызова.

Все решения, которые я нашел, здесь или в учебники по дранжеру устарели или используют обратные вызовы.Я попытался просмотреть все вопросы с тегами ffmpeg и sdl (их не так много), но безрезультатно.Я попытался преобразовать учебник дранжера, чтобы использовать не осуждаемые вызовы, но столкнулся с той же проблемой.Я использую 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], у которого также есть данные, но это не решило проблему.Правильно ли я и если да, то как мне играть на обоих каналах?

...