У меня есть проект кросс-платформы в C++, где я смешиваю аудио в режиме реального времени. У меня есть несколько независимых треков в качестве входных данных, которые я читаю из отдельных файлов на диске. Затем я смешиваю их, применяю некоторую обработку и выплюгиваю буфер с результирующим звуком. Проблема, которую я испытываю, - это скорость дискового ввода-вывода. Для текущего теста, который я выполняю, у меня около 10 треков, которые читаются одновременно с диска. Каждый трек находится в raw PCM, 48000 HZ 16 бит стерео. Это означает, что существует значительный объем данных, которые необходимо прочитать как можно быстрее. Я пробовал как простые переадресации, так и файлы с памятью через Boost, но проблема такая же. Когда файл сначала открывается, он обычно приводит к разрыву звука (предположительно, когда файл считывается в кеш операционной системой). После этого все работает без проблем. В настоящее время я использую один поток для каждого файла в общем случае, иногда два файла на поток. Обычно, когда у меня есть два файла на поток, происходит срыв/распад потока. Обратите внимание, что я заранее не знаю, какие файлы ввода необходимо воспроизводить, так как это контролируется пользователем. Таким образом, моя проблема заключается в том, как читать эти начальные блоки таким образом, чтобы я не останавливался и не разбивался. Кроме того, при загрузке нового файла не обязательно начинать чтение.Чтение многих файлов параллельно
У меня есть несколько мыслей:
Можно ли упреждающих файлы в кэш, прочитав их все сразу при запуске, но не обращая внимания на данные? Я не могу хранить все это в памяти. Но, похоже, плохо полагаться на внутреннее поведение прочитанного кода ОС, тем более, что это кросс-платформа.
Можно ли использовать формат Ogg Vorbis для сжатия, полностью загрузить сжатые данные в память и затем декодировать на лету? Я думаю, что декодирование 10 или более потоков Vorbis может быть слишком интенсивным, но у меня пока нет тестов. По крайней мере, таким образом мы превращаем его из задачи привязки ввода-вывода в связанный с CPU.
Можем ли мы сделать любой другой способ разумного буферизации, чтобы сделать его таким, чтобы большие чтения были более равномерно распределены? Я очень мало знаю о том, как это сделать.
Я застрял в этой точке и буду благодарен за любые предложения, которые могут улучшить пропускную способность.
О какой ОС и процессоре мы говорим? 10 x 48K x 16 x 2 = 15 Мбит/с или 2 МБ/с, что меньше, чем может достичь моя Linux-машина (около 50-60 МБ/с). –
Я тестирую на компьютере с Windows XP SP3 с 4 ГБ оперативной памяти и 2,83 ГГц четырехъядерный процессор. Но мои требования в том, что это кросс-платформа. Задержка, которая возникает, составляет всего несколько миллисекунд, и только при загрузке нового файла. В остальное время он работает безупречно. –
Итак, в основном, это время, которое требуется, чтобы открыть файл и прочитать первые несколько байтов. В этом случае «предварительная загрузка» первых нескольких килобайт файла перед началом обработки данных будет подходящим решением. Я думаю, что любой из других вариантов - это просто больше работы, с небольшой или никакой выгодой. –