2016-09-28 2 views
0

В настоящее время я нахожусь в реализации кодека для Java Sound SPI. Я достиг стадии, когда мне придется изменить поведение AudioInputStream (таким образом, чтобы переопределить его). Однако формулировка «рамки выборки» для меня не имеет никакого смысла. Количество сэмплов и количество кадров в кодеке - очень разные цифры и значения. Итак, в контексте этого класса, в чем его смысл?«Образец кадра» в контексте AudioInputStream

Например, frameLength документируется как «Длина этого потока в кадрах выборки». Длина потока не равна количеству кадров в потоке.

framePos задокументирован как «Текущее положение в этом потоке, в кадрах выборки (с нулевой основанием)». Означает ли это, что он содержит кадр, в котором находится текущий поток или какой образец потока включен?

т.д.

ответ

0

От AudioFormat docs:

Для кодирования, как PCM, кадр состоит из множества выборок для всех каналов в данный момент времени, и поэтому размер кадра (в байтах) всегда равный размеру выборки (в байтах), умноженной на количество каналов. Однако с некоторыми другими типами кодировок кадр может содержать набор сжатых данных для целой серии выборок, а также дополнительные данные без выборки. Для таких кодировок частота дискретизации и размер выборки относятся к данным после их декодирования в PCM, и поэтому они полностью отличаются от частоты кадров и размера кадра.

Так что если ваш кодек сжимает аудио, например, mp3, фрейм больше похож на сжатый кусок данных, и его размер относительно мало зависит от размеров выборки, с которыми вы столкнулись при несжатом кодировании PCM (больше о mp3-кадрах можно найти here).

Так frameLength в AudioInputStream документы на самом деле просто означает общее количество кадров в этом потоке.

Или, чтобы быть более понятным в контексте сжатого аудио: количество сжатых кусков.

При чтении сжатых аудиофайлов, используя stream = AudioSystem.getAudioInputStream(file), поток сжатого возвращается вместе с надлежащей AudioFormat инстанции. Затем пользователь должен распаковать поток, используя что-то вроде decompressedStream = AudioSystem.getAudioInputStream(PCM_SIGNED, stream).

К сожалению, это часто неправильно понимают.

1

«образец кадр» означает кадр, содержащий одну выборку по всем каналам. Таким образом, для 8-битного моно это 1 байт, для 16-битного стерео - 4 байта (2 канала, 2 байта на выборку). AudioInputStream получает этот размер от AudioFormat, переданного конструктору.

frameLength и framePos тогда всегда в единицах этого размера.

AudioInputStream всегда пытается прочитать полное количество выборочных кадров, чтобы код приложения не имел дело с получением части кадра.

Смежные вопросы