Произвольный доступ к AudioInputStream java

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

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


person Ofek Ron    schedule 03.06.2015    source источник
comment
Кажется маловероятным; вся идея потоков заключается в том, что вы можете только читать (или писать) их от начала до конца. Похоже, лучшее, что вы можете сделать с Java Sound API, это прочитать весь файл в память (например, массив байтов), а затем воспроизвести его из памяти.   -  person user253751    schedule 04.06.2015


Ответы (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 согласен со мной в этом подходе.

person Thirler    schedule 04.06.2015