Почему изменение частоты не влияет на скорость воспроизведения звука SDL (emscripten)? - PullRequest
0 голосов
/ 03 апреля 2020

Я пытаюсь написать видеоплеер SDL2, используя ffmpeg-sdl2 и emscripten. У меня есть функция, которая декодирует пакет и добавляет буфер в SDL_QueuAudio. Я называю это queueAudioFrame() в js следующим образом:

setInterval(function () {
        this._queueAudioFrame();
    }, 1);

Это сторона реализации C:

int DecodeAudioPacket(AVPacket packet, AVCodecContext* ctx, uint8_t* audioBuf, int bufSize)
{
  AVFrame* frame = NULL;
  uint8_t converted_data[(192000 * 3) / 2];
  uint8_t* converted;

  int len1, len2, dataSize = 0;

  if (!frame)
  {
    frame = av_frame_alloc();
    converted = &converted_data[0];
  }

  int gotFrame = 0;
  len1 = avcodec_decode_audio4(ctx, frame, &gotFrame, &packet);

  if (len1 < 0)
  {
    return 0;
  }
  if (gotFrame)
  {

    dataSize = av_samples_get_buffer_size(NULL, ctx->channels, frame->nb_samples, ctx->sample_fmt, 1);
    int outSize = av_samples_get_buffer_size(NULL, ctx->channels, frame->nb_samples, AV_SAMPLE_FMT_FLT, 1);
    len2 = swr_convert(swrCtx, &converted, frame->nb_samples, (const uint8_t**)&frame->data[0], frame->nb_samples);
    memcpy(audioBuf, converted_data, outSize);
    dataSize = outSize;
  }

  if (packet.data)
  {
    av_free_packet(&packet);
  }

  if (dataSize <= 0) {
    /* No data yet, get more frames */
    return 0;
  }

  /* We have data, return it and come back for more later */
  return dataSize;
}

void EMSCRIPTEN_KEEPALIVE queueAudioFrame()
{
  if (av_read_frame(audiopFormatCtx, &audiopacket) >= 0) 
  {
    if (audiopacket.stream_index != videoStream)
    {
        uint8_t audioBuf[(192000 * 3) / 2];

        int decodeSize = DecodeAudioPacket(audiopacket, audioCtx, audioBuf, sizeof(audioBuf));
        queued = SDL_GetQueuedAudioSize(1);
        printf("Decoded bytes from frame: %d & Device has %u bytes queued. \n", decodeSize, queued);
        SDL_QueueAudio(1, audioBuf, decodeSize);
    }
  }
}

Я получаю частоту дискретизации из кодекса и wantedSpec.freq = audioCtx->sample_rate;. Проблема заключается в том, что звук воспроизводится слишком быстро, и какое бы значение я ни установил как wantedSpe c .freq или wantedSpe c .samples, скорость не меняется. В чем причина этого?

...