Подскажите — как работать с большим звуковым файлом на десятки часов звучания (wma, mp3), если мне нужно эпизодически проигрывать отдельные его фрагменты? Не хотелось бы постоянно держать его в памяти, отъедая гигабайт места.
Использую XAudio2.
DIMOSUS.X
> Не хотелось бы постоянно держать его в памяти
Попробуй memory mapping.
Огромное спасибо, как-то даже не знал про такую вещь (пишу на C#, а там это появилось не так давно).
Есть ли какие-либо подводные камни с проигрывание файла с произвольной точки? Надеюсь для этого не нужно читать файл с самого начала? Или это еще от формата кодирования зависит?
DIMOSUS.X
> Или это еще от формата кодирования зависит?
Constant bitrate не зависит (почти), Variable bitrate - скорее всего нужно будет читать с начала (может получиться сделать какую-то карту файла заранее для оптимизации процесса).
DIMOSUS.X
> эпизодически проигрывать отдельные его фрагменты?
Не лучше ли разбить файл на несколько мелких?
DIMOSUS.X
> Надеюсь для этого не нужно читать файл с самого начала? Или это еще от формата
> кодирования зависит?
Зависит от формата, но обычно вставляют опорные точки, чтобы можно было читать с условно
произвольного момента.
eugeneloza
> Не лучше ли разбить файл на несколько мелких?
>
Конечно лучше, но пытаюсь использовать готовый файл озвучки от одной игры. Там цельный WMA файл на десятки часов — очень хочется узнать, как они это реализовали.
Никто же заставляет загружать весь файл в память целиком. Просто делаешь fread (или какая там у тебя стандартная функция чтения файла на том, что ты пишешь) порциями по мере проигрывания, декодируешь, и складируешь в буфера, которые устройство воспроизведения по очереди кушает.
Про шарп ничего не скажу, а в си делают так:
#include <sys/mman.h> void* mmap(void *addr, size_t len, int prot, int flags, int fd, off_t offset);
Тема в архиве.