Java Audio -Wiedergabe, da es sich auf die lokale Umgebung verlassen muss, hat Java nur wenig Vorteil bei der Audioverarbeitung oder mit anderen Worten, es wird die Audio -Wiedergabefaktoren bei der Entwicklung des Java -Systems nicht berücksichtigt. Sie sollten wissen, dass es in der frühesten Java 1.1 -Version kein später Javax.Sound -Paket gab und das Audio nur über das Applet -Paket abgerufen werden kann ...
Leider müssen unsere Programme bei der Entwicklung von Grafikprogrammen zwangsläufig Hintergrundmusik, Effekt -Sounds usw. verwenden, um mit Bildoperationen zusammenzuarbeiten. Leider ist das wirklich ein Witz, den Meister Sun uns gespielt hat. Glücklicherweise öffnete Master Sun die Augen und stellte das Javax.Sound -Paket zur Verfügung, um uns vor der Dire Straits ~ zu retten ~
Das nachfolgende Problem ist jedoch, dass es bei der Verwendung des Javax.Sound -Pakets, wie ein gemeinsames Problem in der Java Multimedia -Toolklasse, keinen sehr vollständigen Freisetzungsmechanismus gibt. Wenn wir Windows -Entwicklung durchführen, ist es möglicherweise keine große Sache, MediaPlayer anzurufen, aber in Java ist es sehr einfach, den kumulativen Verlust des Kumulativen zu erleben, so dass ein Java.lang.outofMemoryError geworfen wird, und dann ... das Programm hängt, der Benutzer ist dumm und wir werden verrückt ...
Dies ist bereits eine Frage von "Ist es erträglich"? In Anbetracht meiner Entwicklung in meiner Loonframework -Framework -Entwicklung habe ich die relevanten Methoden unter Sound sekundär integriert und bemüht, die vollständigste Audio -Kontrollklasse mit dem einfachsten Code zu erstellen. Jetzt, da das Loonframework-Spiel noch keinen großen Erfolg erzielt hat, werden wir zunächst einige der Methoden für alle ausziehen, um sie sich anzusehen!
In Bezug auf Netzwerkressourcenaufrufe wird unsere eigene URI -Klasse in Loonframework festgelegt. Der grundlegende Inhalt ist wie folgt:
(Wenn StreamHelper die eigene Streaming -Kontrollklasse von Loonframework ist, ersetzen Sie bitte die GethttpStream -Methode selbst.)
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> * Firma: Loonframework * </p> * * @Author Chenpeng * @email: [email protected] * @version 0.1 */public class Uri ... {// Transportprotokolltyp public static endgültig int _l_uri_http = 1; public static final int _l_uri_udp = 2; private Zeichenfolge _uri; private int _type; /** * // ** * Destruktor, verwendet, um URI und Typ zu injizieren * _type = Typ; }/** * // ** * destructor, verwendet, um URI * * @param Typ URI */public Uri (String uri) zu injizieren ... {_uri = new String (URI); _type = uri._l_uri_http; }/*** // *** Gibt das Byte -Array der Ressource zurück, in dem sich der URI befindet. * * @return */ public byte [] getData () ... {if (_uri == null) ... {return null; } return streamHelper.gethttpstream (_uri); } public String geturi () ... {return _uri; } public int gettType () ... {return _type; }} Im Loonframework -Framework wird eine grundlegende SoundData -Klasse so angepasst, dass Audio -Datenquellen einheitlich verwaltet werden. package org.loon.framework.game.sound;import org.loon.framework.game.helper.StreamHelper;import org.loon.framework.game.net.URI;/** *//** * <p> * Title: LoonFramework * </p> * <p> * Description: Used to obtain and cache sound file data (for further information, see the Loonframework-game framework) * </p> * <p> * Copyright: Copyright (c) 2007 * </p> * <p> * Firma: LoonFramework * </p> * * @author chenpeng * @email: [email protected] * @Version 0.1 */public class SoundData ... {privat von te [] _data; private boolean _loop; private int _type; public static final int _l_soundType_midi = 1; public static final int _l_soundtype_wav = 2; /** * // ** * Destruktor, verwendet, um URI, Typ, Schleife zu injizieren * * @param uri * @param type * @param Loop */public SoundData (uri uri, int type, boolean Loop) ... {if (uri! = Null) ... {_data = uri.getData (); } _type = type; _loop = Loop; }/** * // ** * Destruktor, verwendet, um Daten, Typ, Loop * * @param Data * @param Typ * @param Loop */public SoundData (Byte [] Daten, int type, boolean Loop) ... {if (Data! // Byte -Array -System direkt kopieren. } _type = type; _loop = Loop; }/** * // ** * destructor, verwendet, um Resname, Typ, Loop * @param Resname zu injizieren * @param type * @param Loop */public SoundData (String Resname, int type, boolean Loop) ... {this (streamHelper.getDataSource (Resname), Typ, Schleife); } public byte [] getData () ... {return _data; } public boolean getLoop () ... {return _loop; } public void setloop (boolean Loop) ... {_loop = Loop; } public int gettType () ... {return _type; }}
Loonframework verkauft Audio -Wiedergabemethoden und Soundplay. Programmierer können die internen Details von Javax.Sound ignorieren und direkt Soundplay für die vollständigen Operationen rufen.
Paket org.loon.framework.game.Sound; Import Java.io.BytearrayInputStream; Import Javax.Sound.Midi.MetaEventListener; Import Javax.Sound.midi.Metamessage; Import Javax.Sound.midi.Midisystem; Javax.Sound.midi.Sound. javax.sound.midi.sequencer; import javax.sound.sampled.audioFileFormat; import Javax.Sound.Samped.audiosystem; <p> * Title: LoonFramework * </p> * <p> * Description: Used to perform sound file operations (only some methods in Loonframework, see the Loonframework-game framework for more details) * </p> * <p> * Copyright: Copyright (c) 2007 * </p> * <p> * Company: LoonFramework * </p> * * @author chenpeng * @Email: [email protected] * @version 0.1 */public class Soundplay implementiert MetaEventListener, Runnable ... {private int _sleeptime; privater Clip _audio; privater Sequenzer _midi; private boolean _loop; private int _soundType; privat boolean _playing; privater Thread _Thread = null; private boolean _isrun = false; /** * // ** * destructor, initialisieren Sie SoundPlay * */public SoundPlay () ... {_loop = false; _SoundType = 0; _sleeptime = 1000; _playing = false; } // Laden Sie die Sounddatei public boolean Load (SoundData -Daten) ... {Reset (); if (data == null || data.getData () == null) ... {return false; } return init (data.getData (), data.gettype (), data.getloop ()); }/** * // ** * Direkte Wiedergabe der URL -Datei * * @param uri * @param ftype * @param Loop * @return */public boolean last (uri uri, int ftype, boolean Loop) ... {// Daten reset (); if (uri == null) ... {return 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 ()); }/** * // ** * initialisieren Sie die datenbezogenen Schalldaten * * @param data * @param ftype * @param Loop * @return */private boolean init (byte [] data, int ftype, boolean Loop) ... {boolean result = false; BytearrayInputStream Bis = NULL; try ... {Bis = new bytearrayInputStream (Daten); } catch (Ausnahme e) ... {Bis = null; } if (Bis == null) ... {return false; } // Beurteilungstyp Switch (FTYPE) ... {// MIDI CASE SOUNDDATA._L_SOUNDTYPE_MIDI: // Wenn MIDI nicht existiert, wenn (_midi == null) ... {try ... {// Sequencer _midi = midisystem.getEquencer () erhalten; _midi.open (); } catch (Ausnahme ex) ... {_midi = null; } if (_midi! = null) ... {_midi.addmetaEventListener (this); }} // Wenn MIDI noch nicht erhalten wird, wenn (_midi! try ... {sc = midisystem.getSequence (Bis); } catch (Ausnahme E) ... {sc = null; } if (sc! = null) ... {try ... {_midi.setSequence (sc); // Holen Sie sich, ob Sie loop_loop = Loop; // Erhalten Sie, ob Ergebnis = true; } catch (Ausnahme ee) ... {} // Sound type_soundType = SoundData._l_soundtype_midi; }} try ... {Bis.close (); } catch (Ausnahme ee) ... {} break; // Wav Case SoundData._L_Soundtype_wav: audioFileFormat type = null; // Audio -Try ... {type = audiosystem.getaufileFormat (Bis); } catch (Ausnahme e) ... {type = null; } // Stream -Versuche schließen ... {Bis.close (); } catch (Ausnahme ex) ... {} if (type == null) ... {return false; } // Konstruktieren Sie das Informationsobjekt der Datenzeile basierend auf der angegebenen Information dataline.info di = new Dataline.info (clip.class, type.getFormat ()); // um den Clip -Versuch konvertieren. } catch (Ausnahme e) ... {} // Datei versuchen ... {_audio.open (type.getFormat (), Data, 0, Data.Length); _loop = Loop; Ergebnis = wahr; } catch (Ausnahme e) ... {} // Dateityp _soundType = SoundData._l_soundtype_wav; brechen; } Rückgabeergebnis; } public boolean Play (SoundData -Daten) ... {if (! Load (Daten)) ... {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 (Ausnahme ee) ... {} break; case SoundData._l_soundtype_wav: if (_audio! = null) ... {if (_loop) ... {// setze die Loop _audio.setlooppoints (0, -1); _audio.setframePosition (0); _audio.loop (clip.loop_continuous); } else ... {// die Wiedergabeposition auf 0 _audio.setframePosition (0) erzwingen; _audio.start (); } _playing = true; } brechen; } return _playing; }/*** // *** Automatische Wiedergabe endet die Schleife nach dem Stopp. * * @param data * @return */ public boolean autoplay (SoundData -Daten) ... {if (! load (data)) ... {return false; } return autoplay (); }/*** // *** Automatische Wiedergabe endet die Schleife nach dem Stopp. * * @return */ public boolean autoplay () ... {_isrun = true; _Thread = neuer Thread (this); _Thread.Start (); return _playing; }/***// ***Hör auf zu spielen*/public void stop () ... {if (_audio! } catch (Ausnahme e) ... {}} if (_midi! = null) ... {_midi.stop (); } _playing = false; _isrun = false; }/*** // *** Daten freigeben**/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) ... {// Bestimmen Sie, ob Sie MIDI -Schleife spielen möchten, wenn (_loop && _soundType == SoundData._L_Soundtype_Midi && meta.getType () == 47). _midi.isopen ()) ... {_midi.setmicrosecondposition (0); _midi.start (); }}} public void run () ... {while (_isrun) ... {Play (); // Da der Wiedergabetyp eindeutig ist, wird nur ein _playing -Ergebnis zurückgegeben, um dies zu bestimmen. if (_midi! = null) ... {_playing = _midi.isrunning (); } if (_audio! = null) ... {_playing = _audio.isrunning (); } // Wenn die Wiedergabe aufhört, wenn (! _Playing) ... {// reset () veröffentlichen; } try ... {thread.sleep (_sleeptime); } catch (interruptedException e) ... {e.printstacktrace (); }}} public int getleeptime () ... {return _sleeptime; }/*** // *** Setzen Sie die Autoplay -Thread -Schleifenzeit. * * @param time */ public void setSleeptime (int time) ... {_sleeptime = time; }}
Zu diesem Zeitpunkt müssen wir nur mit Sounddata -Daten und Soundplay -Operationen, die als Entitäten eingefasst sind, ohne mit dem komplizierten Javax.Sound zu tun haben.
Die Anrufmethode lautet wie folgt:
Paket org.test; import org.loon.framework.game.helper.streamHelper; import org.loon.framework.game.net.uri; <P> Beschreibung: Soundplay -Wiedergabetest </p> * <P> Copyright: Copyright (C) 2007 </p> * <p> Firma: LoonFramework </p> * @author chenpeng * @email: [email protected] * @Version 0.1 */public klassiger Soundlayte. Switch (ftype) .. {// Musik im Netzwerk über die URI unter Loonframework -Fall 0: data = new SoundData (new Uri ("http://looframework.sourceForge.net/midi/Who is the Big Hero.Mid"), SoundData._L_Soundtype_Midi, Falsch), spielen; brechen; // Musik über das Byte [] Objekt der Musikdatei unter dem lokalen Ressourcenfall 1: byte [] bytes = streamHelper.getResourcedata ("/Midi/wer ist der große Heldin") abspielen; Data = new SoundData (Bytes, SoundData._L_soundType_Midi, False); brechen; // Musik über den Musikdatei -Pfad Fall 2: data = new SoundData ("C:/wer ist der große Held.mid", SoundData._L_SoundType_Midi, false); brechen; } SoundPlay Play = new SoundPlay (); // Der Unterschied zwischen Autoplay- und Spielmethoden besteht darin, dass Autoplay nach dem Spielen automatisch die Ressourcen stoppt und freigibt, und das Spiel muss manuell abgebrochen werden. //play.play(data); Play.autoplay (Daten); } public static void main (String [] args) .. {selectPlay (2); }}
Eine detailliertere Methode wird erläutert, nachdem das Loonframework-Spiel vollständig bekannt gegeben wurde.
Zusätzlich: Da StreamHelper mit anderen Loonframework -Methoden verbunden ist, wird dies noch nicht gegeben. Der InputStream to Byte [] kann wie folgt geschrieben werden:
// ist der erhaltene InputStream -BytearrayoutputStream -BytearrayoutputStream = new bytearrayoutputStream (); // wird zur Durchführung von Byte [] byte [] arrayByte = null verwendet; Versuchen Sie ... {// Die Größe jeder Übertragung beträgt 4096 Byte [] bytes = neues Byte [4096]; bytes = new byte [is.Available ()]; int lesen; while ((read = ist } arrayByte = bytearrayoutputStream.tobytearray (); } catch (ioException e) ... {return null; } endlich ... {try ... {if (bytearrayoutputStream! = null) ... {bytearrayoutputStream.CLOSE (); bytearrayoutputStream = null; } if (ist! = null) ... {is.close (); ist = null; }} catch (ioException e) ... {}}