2015-03-09 4 views
1

У меня есть объект AudioFormat (возвращается из audioInputStream.getFormat()). У меня есть метка времени (в миллисекундах), которую я хочу начать читать из соответствующего wav-файла. Как определить, сколько байтов следует читать/пропускать из AudioInputStream, чтобы добраться до соответствующего момента времени?Java - Определить количество байтов для чтения из файла волны, чтобы получить отметку времени

Я запутался с частотой кадров (и как он относится или не относится к частоте дискретизации).

Это то, что у меня есть до сих пор ... startPos - это метка времени в миллисекундах.

float skipTotalFrames = audioInputStream.getFormat().getFrameRate() * (startPos/1000); 
long byteStartPos = (long) (audioInputStream.getFormat().getFrameSize() * skipTotalFrames); 

Где я?

Редактировать: Мой код действительно работал, у меня были другие ошибки.

ответ

1

Формат WAV обычно начинается с 44-байтового заголовка, за которым следуют звуковые отсчеты, отснятые 44,100 раз в секунду (частота дискретизации), где каждый образец имеет 16-разрядную подпись, целую маленькую конечную (битовая глубина) ... скорость передачи битов рассчитывается путем умножения этих два фундаментальных фактора: (частота дискретизации) * (битовая глубина) ... это монофонический, если стерео эти образцы чередуются

Посмотрите на API, с которым вы ссылаетесь, первое свойство зонда: vbr (переменная скорость передачи) Если его истина расчет, который вы хотите, будет недостижим. Для WAV он всегда должен иметь постоянную скорость передачи (IE. False). Затем получить свойство: битрейта

битрейт = (sample_rate) * (bit_depth) * (number_of_channels) === бит в секунду

For argument sake lets say your ... 

sample_rate = 44100; // 44.1 kHz which is typical 
bit_depth = 16;  // also typical 
number_of_channels = 2; // mono --> 1 stereo --> 2 

look_ahead_milli_sec = 1500; // you are given this in milliseconds 

bit_rate = sample_rate * bit_depth * number_of_channels; 
bit_rate = 44100 * 16 * 2; 
bitrate = 1411200; // based on above calculation 

bytes_per_second = bitrate/8; // bits to bytes per sec 
bytes_per_second = 1411200/8; // bits to bytes per sec 
bytes_per_second = 176400; // bytes per sec 

look_ahead_in_bytes = (bytes_per_second/1000) * look_ahead_milli_sec; 

look_ahead_in_bytes = (176400/1000) * 1500;  
look_ahead_in_bytes = 264600; 
+0

Частота кадров эквивалентно частоты дискретизации от того, что я понимаю. Размер рамки может быть больше размера выборки, хотя из-за того, что он учитывает несколько каналов. Кажется, это правильно? – CamHart

+0

Имеет смысл ... легко подтверждается экспериментальной проверкой ... запустите это через несколько начальных позиций в ходе вторых испытаний Милли ... Расскажите нам свои результаты –