Java Audio Playback, поскольку он должен полагаться на местную среду, Java имеет мало преимуществ в обработке звука или, другими словами, она не учитывает факторы воспроизведения звука при разработке системы Java. Вы должны знать, что в самой ранней версии Java 1.1 не было более позднего пакета Javax.Sound, и звук может быть извлечен только через пакет апплета ...
К сожалению, в разработке графических программ нашим программам неизбежно необходимо использовать фоновую музыку, звуки эффектов и т. Д., Чтобы сотрудничать с операциями изображений. Увы, это действительно шутка, которую Мастер Солнце сыграл для нас. К счастью, Master Sun открыл глаза и предоставил упаковку Javax.Sound, чтобы спасти нас от Dire Plaits ~
Но последующая проблема заключается в том, что при использовании пакета Javax.Sound, как общая проблема в классе инструментов Java Multimedia, нет очень полного механизма выпуска. Если мы делаем разработку Windows, вызовы MediaPlayer снова и снова могут быть не очень большими, но в Java, если аудиопрограмма работает неоднократно, очень легко испытать совокупную потерю памяти, так что Java.lang.outofMemoryError брошен, а затем ... Программа висит, пользователь глуп, и мы сходим с ума ...
Это уже вопрос «терпимо»? Ввиду этого, в разработке моей разработки Framework -Framework я включил соответствующие методы под звуком, стремясь создать самый полный класс аудио управления с самым простым кодом. Теперь, когда Loonframework-игра еще не достигла большого успеха, я сначала извлечу некоторые методы, чтобы вы могли взглянуть на них!
Соответствующие сетевыми ресурсными вызовами, наш собственный класс URI установлен в LoonFramework. Основной контент заключается в следующем:
(Где StreamHelper является собственным классом потокового управления LoonFramework, пожалуйста, замените метод Gethttpstream самостоятельно.)
package org.loon.framework.game.net;import org.loon.framework.game.helper.StreamHelper;/** *//** * <p> * Title: LoonFramework * </p> * <p> * Description:Loonframework dedicated uri (unified resource identifier) * </p> * <p> * Copyright: Copyright (c) 2007 * </p> * <p> * Компания: loonframework * </p> * * @author chenpeng * @email: [email protected] * @version 0.1 */public class uri ... {// Тип транспортного протокола Public Static Final int _L_URI_UDP = 2; Приватная строка _uri; private int _type; /** * // ** * Destructor, используемый для ввода URI и типа * * @param uri * @param type */public uri (string uri, int type) ... {_uri = new String (uri); _type = type; }/** * // ** * Destructor, используемый для инъекции uri * * @param type uri */public uri (string uri) ... {_uri = new String (uri); _type = uri._l_uri_http; }/*** // *** Возвращает байт -массив ресурса, где находится URI. * * @return */ public byte [] getData () ... {if (_uri == null) ... {return null; } return remhelper.gethttpstream (_uri); } public String geturi () ... {return _uri; } public int getType () ... {return _type; }} В рамках LoonFramework базовый класс SoundData настроен для равномерного управления аудиодатными источниками данных. Пакет org.loon.framework.game.sound; import org.loon.framework.game.helper.streamhelper; import org.loon.framework.game.net.uri;/** * // ** * <P> * </p> * <p> * Copyright: Copyright (C) 2007 * </p> * <p> * Компания: LoonFramework * </p> * * @author Chenpeng * @email: [email protected] * @version 0.1 */public class sounddata ... {private byte [] _data; Private Boolean _loop; private int _type; Public Static Final int _l_soundType_midi = 1; Public Static Final int _l_soundtype_wav = 2; /** * // ** * Destructor, используемый для инъекции uri, type, loop * * @param uri * @param type * @param loop */public sounddata (uri uri, int type, boolean loop) ... {if (uri! = Null) ... {_data = uri.getData (); } _type = type; _loop = loop; }/** * // ** * Destructor, используемый для ввода данных, типа, цикл * * @param data * @param type * @param loop */public sounddata (byte [] data, int type, boolean loop) ... {if (data! // System System System.ArrayCopy (Data, 0, _Data, 0, _Data.Length); } _type = type; _loop = loop; }/** * // ** * Destructor, используемый для инъекции Resname, Type, Loop * @param resname * @param type * @param loop */public sounddata (String Resname, int type, boolean loop) ... {this (Streamhelper.getDataSource (Resname), тип, петля); } public byte [] getData () ... {return _data; } public boolean getLoop () ... {return _loop; } public void setloop (лоп -петли) ... {_loop = loop; } public int getType () ... {return _type; }}
LoonFramework инкапсулирует методы воспроизведения звука и звуковой игрок. Программисты могут игнорировать внутренние детали javax.sound и напрямую вызовать Soundplay для завершения соответствующих операций.
пакет org.loon.framework.game.sound; import java.io.bytearrayinputstream; import javax.sound.midi.metaeventlistener; import javax.sound.midi.metamessage; import javax.sound.midi.midisystem; import javax.sound.midi.sound.midi.midisystem; import javax.sound.mide.sound.midi.midisystem; import javax.sound.sounce.sound.midi.midisystem; javax.sound.midi.seclencer; import javax.sound.sampled.audiofileformat; импорт javax.sound.sampled.audiosystem; импорт javax.sound.sampled.clip; import javax.sound.sampled.dataline; import.frame.game.ne.ne. <p> * Название: loonframework * </p> * <p> * Описание: используется для выполнения операций звукового файла (только некоторые методы в Loonframework, см. См. @email: [email protected] * @version 0.1 */public class soundplay реализует MetaeventListener, runnable ... {private int _sleeptime; Приятный клип _Audio; Приватный секвенсор _midi; Private Boolean _loop; private int _soundtype; Частный логический _playing; Приватный поток _thread = null; Private Boolean _isrun = false; /** * // ** * Destructor, инициализируйте Soundplay * */public soundplay () ... {_loop = false; _SoundType = 0; _sleptime = 1000; _playing = false; } // Загрузите звуковой файл public boolean load (sounddata data) ... {reset (); if (data == null || data.getData () == null) ... {return false; } return init (data.getData (), data.getType (), data.getloop ()); }/** * // ** * Прямое воспроизведение файла URL * * @param uri * @param ftype * @param loop * @return */public boolean load (uri uri, int ftype, boolean -цикл) ... {// Обновление данных Reset (); if (uri == null) ... {вернуть false; } // Получить SoundData SoundData data = new SoundData (uri, ftype, loop); if (data == null || data.getData () == null) ... {return false; } return init (data.getData (), data.getType (), data.getloop ()); }/** * // ** * Инициализировать данные, связанные с звуком * * @param data * @param ftype * @param loop * @return */private boolean init (byte [] data, int ftype, boolean-цикл) ... {boolean result = false; BytearrayinputStream bis = null; попробуйте ... {bis = new BytearrayinputStream (data); } catch (Exception e) ... {bis = null; } if (bis == null) ... {return false; } // Судя по переключению типа (ftype) ... {// midi case sounddata._l_soundtype_midi: // Когда midi не существует, если (_midi == null) ... {try ... {// Получить последователь _midi = midysystem.getencer (); _midi.open (); } catch (Exception Ex) ... {_midi = null; } if (_midi! = null) ... {_midi.addmetaeventListener (this); }} // Когда MIDI до сих пор не получена, если (_midi! = Null) ... {// воссоздать последовательность последовательности sc = null; попробуйте ... {sc = midysystem.get sequence (bis); } catch (Exception e) ... {sc = null; } if (sc! = null) ... {try ... {_midi.setsequence (sc); // Получить, чтобы Loop_loop = loop; // Получить, загрузить ли результат = true; } catch (Exception ee) ... {} // Получить звук type_soundtype = sounddata._l_soundtype_midi; }} попробуйте ... {bis.close (); } catch (Exception ee) ... {} break; // wav case sounddata._l_soundtype_wav: audiofileformat type = null; // Получить Audio try ... {type = audiosystem.getaudiofileformat (bis); } catch (Exception e) ... {type = null; } // Close Stream Try ... {bis.close (); } catch (Exception ex) ... {} if (type == null) ... {return false; } // Создание информационного объекта строки данных на основе указанной информации dataline.info di = new Dataline.info (clip.class, type.getformat ()); // преобразовать в CLIP TRY ... {_Audio = (clip) audiosystem.getline (di); } catch (Exception e) ... {} // play file try ... {_audio.open (type.getformat (), data, 0, data.length); _loop = loop; result = true; } catch (Exception e) ... {} // Получить тип файла _soundtype = sounddata._l_soundtype_wav; перерыв; } return Result; } public boolean play (sounddata data) ... {if (! load (data)) ... {return false; } return play (); } public boolean play () ... {switch (_soundtype) ... {case sounddata._l_soundtype_midi: try ... {_midi.start (); _playing = true; _soundType = soundData._l_soundtype_midi; } catch (Exception ee) ... {} break; case sounddata._l_soundtype_wav: if (_audio! = null) ... {if (_loop) ... {// установить цикл _audio.setlooppoints (0, -1); _Audio.setFramePosition (0); _Audio.loop (clip.loop_continyoury); } else ... {// подготовить позицию воспроизведения до 0 _Audio.setFramePosition (0); _Audio.start (); } _playing = true; } перерыв; } return _playing; }/*** // *** Автоматическое воспроизведение, петля заканчивается после остановки. * * @param data * @return */ public boolean autoplay (sounddata data) ... {if (! load (data)) ... {return false; } return autoplay (); }/*** // *** Автоматическое воспроизведение, заканчивается после остановки цикла. * * @return */ public boolean autoplay () ... {_isrun = true; _thread = новый поток (это); _thread.start (); вернуть _playing; }/***// ***Остановить воспроизведение*/public void stop () ... {if (_Audio! = Null && _Audio.isactive ()) ... {try ... {_Audio.stop (); } catch (Exception e) ... {}} if (_midi! = null) ... {_midi.stop (); } _playing = false; _isrun = false; }/*** // *** Выпустить данные**/public void reset () ... {stop (); _loop = false; _SoundType = 0; if (_midi! = null) ... {_midi.close (); _midi = null; } if (_Audio! = null && _Audio.isopen ()) ... {_Audio.close (); _Audio = null; } _isrun = false; _thread = null; }/***// ***Установите MetAmessage*/public void meta (metamessage meta) ... {// определить, играет ли MIDI Loop if (_loop && _soundtype == sounddata._l_soundtype_midi && meta.gettype () = 47) ... {if (_midi && nuull! _midi.isopen ()) ... {_midi.setmicrosecondposition (0); _midi.start (); }}} public void run () ... {while (_isrun) ... {play (); // Поскольку тип воспроизведения уникален, будет возвращен только один _playing -результат, чтобы определить это. if (_midi! = null) ... {_playing = _midi.isrunning (); } if (_Audio! = null) ... {_Playing = _Audio.isrunning (); } // Когда воспроизведение останавливается if (! _Playing) ... {// release reset (); } попробуйте ... {thread.sleep (_sleeptime); } catch (прерванная экспрессия e) ... {e.printstacktrace (); }}} public int getSleepTime () ... {return _sleepTime; }/*** // *** Установите время цикла автопрои. * * @param time */ public void setsleeptime (int time) ... {_sleptime = time; }}
В настоящее время нам нужно столкнуться только с данными SoundData и операциями SoundPlay, инкапсулированными в качестве сущностей, без необходимости справляться со сложным Javax.Sound снова.
Метод вызова выглядит следующим образом:
пакет org.test; import org.loon.framework.game.helper.streamhelper; import org.loon.framework.game.net.uri; import org.loon.framework.game.sound.sounddata; import org.loon.framework.game.sound.soundplay;/****** <p> Описание: Тест воспроизведения Soundplay </p> * <p> Copyright: Copyright (c) 2007 </p> * <p> Компания: loonframework </p> * @author chenpeng * @email: [email protected] * @version 0.1 */public class soundplaytest ... {static void selectplay (int ftype) .. nullatat {ntlatat {int. Switch (ftype) .. {// воспроизводить музыку из сети через URI в разделе LoonFramework Case 0: data = new SoundData (new URI ("http://looframework.sourceforge.net/midi/who - большой герой. перерыв; // воспроизводить музыку через объект байта [] музыкального файла в соответствии с местным ресурсом. 1: byte [] bytes = Streamhelper.getResourcedata ("/midi/Кто является большим героем. Mid"); data = new SoundData (Bytes, SoundData._L_SoundType_midi, false); перерыв; // воспроизводить музыку через путь музыкального файла 2: data = new SoundData ("c:/Кто большой Hero.mid", SoundData._l_soundtype_midi, false); перерыв; } Soundplay play = new Soundplay (); // Разница между методами автопроизводства и воспроизведения заключается в том, что Autoplay автоматически останавливается и выпустит ресурсы после игры, а пьеса должна быть прервана вручную. //play.play(data); play.autoplay (данные); } public static void main (string [] args) .. {selectPlay (2); }}
Более подробный метод будет объяснен после того, как игра в сфере LoonFramework будет полностью объявлена.
Кроме того: поскольку StreamHelper связан с другими методами LoonFramework, он еще не будет предоставлен. Входной сериал в байт [] может быть написан следующим образом:
// - это полученный inputstream bytearrayoutputstream bytearrayoutputstream = new Bytearrayoutputstream (); // используется для проведения байта [] byte [] arraybyte = null; попробуйте ... {// размер каждой передачи составляет 4096 байт [] Bytes = новый байт [4096]; байты = новый байт [is.aviable ()]; int читать; while ((read = is.read (bytes))> = 0) ... {bytearrayoutputstream.write (bytes, 0, read); } arraybyte = bytearrayoutputstream.tobytearray (); } catch (ioException e) ... {return null; } наконец ... {попробуй ... {if (bytearrayoutputstream! = null) ... {bytearrayoutputstream.close (); BytearrayOutputStream = null; } if (is! = null) ... {is.close (); is = null; }} catch (ioException e) ... {}}