ПрограммированиеФорумЗвук

Проигрывание большого файла

#0
10:25, 2 июня 2017

Подскажите — как работать с большим звуковым файлом на десятки часов звучания (wma, mp3), если мне нужно эпизодически проигрывать отдельные его фрагменты? Не хотелось бы постоянно держать его в памяти, отъедая гигабайт места.
Использую XAudio2.

#1
10:48, 2 июня 2017

DIMOSUS.X
> Не хотелось бы постоянно держать его в памяти
Попробуй memory mapping.

#2
10:59, 2 июня 2017

Огромное спасибо, как-то даже не знал про такую вещь (пишу на C#, а там это появилось не так давно).
Есть ли какие-либо подводные камни с проигрывание файла с произвольной точки? Надеюсь для этого не нужно читать файл с самого начала? Или это еще от формата кодирования зависит?

#3
14:15, 2 июня 2017

DIMOSUS.X
> Или это еще от формата кодирования зависит?
Constant bitrate не зависит (почти), Variable bitrate - скорее всего нужно будет читать с начала (может получиться сделать какую-то карту файла заранее для оптимизации процесса).
DIMOSUS.X
> эпизодически проигрывать отдельные его фрагменты?
Не лучше ли разбить файл на несколько мелких?

#4
14:25, 2 июня 2017

DIMOSUS.X
> Надеюсь для этого не нужно читать файл с самого начала? Или это еще от формата
> кодирования зависит?
Зависит от формата, но обычно вставляют опорные точки, чтобы можно было читать с условно
произвольного момента.

#5
14:28, 2 июня 2017

eugeneloza
> Не лучше ли разбить файл на несколько мелких?
>
Конечно лучше, но пытаюсь использовать готовый файл озвучки от одной игры. Там цельный WMA файл на десятки часов — очень хочется узнать, как они это реализовали.

#6
16:43, 2 июня 2017

Никто же заставляет загружать весь файл в память целиком. Просто делаешь fread (или какая там у тебя стандартная функция чтения файла на том, что ты пишешь) порциями по мере проигрывания, декодируешь, и складируешь в буфера, которые устройство воспроизведения по очереди кушает.

#7
13:58, 6 июня 2017

Про шарп ничего не скажу, а в си делают так:

#include <sys/mman.h>
void* mmap(void *addr, size_t len, int prot, int flags, int fd, off_t offset);
ПрограммированиеФорумЗвук

Тема в архиве.