2015-06-03 2 views
2

Есть ли случай случайного доступа к AudioInputStream? что-то вроде любого обычного аудиоплеера - когда вы берете панель, где хотите, и она играет где угодно, как я могу получить доступ к байтам в аудиопотоке таким образом?Случайный доступ к AudioInputStream java

что-то просто так: read(byte[] buffer, long startingFrom) где startingFrom может быть там, где я хочу в звуковом потоке

+0

Кажется маловероятным; вся идея потоков состоит в том, что вы можете читать (или писать) их только от начала до конца. Похоже, что лучшее, что вы можете сделать с Java Sound API, - это прочитать весь файл в памяти (например, массив байтов), а затем воспроизвести его из памяти. – immibis

ответ

1

Использование (? Имитирующий) произвольного доступа в качестве AudioInputStream такой же, как в обычном InputStream. Вы можете создать mark() в начале файла, поэтому перед любыми вызовами read(). Затем, когда вы хотите сделать произвольный доступ, вы прекратите чтение из потока, перейдите в позицию маркера, позвонив reset(), а затем используйте skip(), чтобы перейти в нужное место.

Обратите внимание, что начальная «отметка» по умолчанию равна 0 для AudioInputStream, поэтому первоначальный вызов не требуется. Однако это поведение не указано, поэтому оно может измениться в будущем.

Реализация AudioInputStream (Oracle Java 8) поддерживает этот механизм, если базовый поток (например, InputStream, который вы передаете конструктору) поддерживает его. Вы можете узнать, поддерживает ли он AudioInputStream, вызывая markSupported().

К сожалению, при использовании служебных функций от AudioSystem для создания AudioInputStream вы не можете повлиять на базовый поток. Он может даже отличаться на платформу. Если ваш поток не поддерживает его (или вы хотите быть абсолютно уверенным, что он его поддерживает), вы можете создать новый AudioInputStream, обернув его в BufferedInputStream. Например, как это:

AudioInputStream normalStream = AudioSystem.getAudioInputStream(...); 
AudioInputStream bufferedStream = new AudioInputStream(new BufferedInputStream(normalStream), 
            normalStream.getFormat(), AudioSystem.NOT_SPECIFIED); 

Отказ от ответственности: я бы квалифицировать это имеет «хак» для создания произвольного доступа. К моему удивлению, я мог немного узнать о моделировании произвольного доступа с использованием механизма отметки/сброса в InputStream. Возможно, это связано с тем, что есть предостережение. Редактировать: John Skeet соглашается со мной по этому подходу.

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