Я пытаюсь написать видеоплеер 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, скорость не меняется. В чем причина этого?