(Во-первых, я могу пожалеть о своем плохом английском, потому что это не мой родной язык.)
Я использую FFmpeg для декодирования некоторого аудиофайла и воспроизведения его с помощью OpenAL «потоком» (то есть функцией «очередь» и «исключение из очереди» OpenAL).
Когда я использую свою программу для воспроизведения файла .ogg, я обнаруживаю, что в нем есть переменная nb_samples. (Из-за того, что ogg имеет переменную скорость передачи ??). Имеется 128, 512 и 1024 байта nb_samples. В результате я должен вызвать alDeleteBuffers и alGenBuffers, прежде чем использовать alBufferSamplesSOFT (аналогично alBufferData), потому что он не смог бы вызвать alBufferSamplesSOFT без воссоздания буфера. Примечания: alBufferSamplesSOFT предоставляется OpenAL Soft. Вы можете просто увидеть это как alBufferData.
Тем не менее, я считаю, что это будет глупо и неэффективно. Есть какой-нибудь умный метод? Я вставляю часть кода:
while (av_read_frame(...) == 0){
avcodec_decode_audio4(...);
swr_convert(...); // to convert PCM format from FLTP to FLT
alDeleteBuffers(1, theBuffers[?]);
alGenBuffers(1, theBuffers[?]);
alBufferSamplesSOFT(...); // put those data into OpenAL buffer
}
если я этого не сделаю, он не сможет обновить буфер OpenAL. Есть ли способ создать буфер переменного размера или буфер большого размера? Или есть способ изменить размер буфера?
Спасибо за вас, ребята.