1. Prinsip Implementasi Pemutar Musik
Fungsi multimedia Javase sangat lemah, jadi ada plug-in yang berspesialisasi dalam multimedia yang disebut JMF. Model yang disediakan oleh JMF dapat dibagi secara kasar menjadi tujuh kategori.
* Sumber data
* Perangkat Tangkap (termasuk Video dan Audio Interceptor)
* Pemain
* Prosesor
* DataSink
* Format data (format)
* Manajer
Pemutar musik MyMusicPlayer (ini adalah nama kelas yang saya buat) saya membuat panggilan ke kelas pemain di JMF untuk mengimplementasikan berbagai fungsi seperti pemutarannya.
Hal pertama yang harus kami lakukan adalah menginstal JMF. Saya percaya bahwa pemasangan JMF sangat merepotkan bagi banyak pemula. JMF hanya mendukung versi JDK 32-bit, tetapi lingkungan IDE seperti Eclipse harus sesuai dengan JDK, yaitu lingkungan IDE harus mendukung versi JDK 32-bit. Setelah menginstal JMF, terkadang pemutaran MP3 tidak berhasil, dan Anda juga perlu menginstal MP3Plugin JMF.
2. Diagram efek antarmuka
3. Diagram Struktur Fungsional
4. Berbagai kode untuk menerapkan fungsi
Kelas Publik MyMusicPlayer mengimplementasikan ActionListener, ControllerListener, Runnable {jFrame j = new jframe ("player musik"); Jlabel TablePlaer = JLabel baru ("playlist"); Jbutton badd = jbutton baru ("tambahkan lagu"); Jbutton bdelect = jbutton baru ("delete song"); Jbutton bdelecttable = jbutton baru ("daftar bening"); Jbutton bmovenext = jbutton baru ("lagu berikutnya"); Jbutton bmoveprevious = jbutton baru ("lagu sebelumnya"); Jbutton bplayer = jbutton baru ("jeda"); Jbutton bstop = jbutton baru ("stop"); Jbutton bset = jbutton baru ("lirik show"); Jbutton bend = jbutton baru ("stop"); String [] s = {"Play Sequential", "Loop Single", "Shutter Play"}; // LOT DOWN LIST OPSI ARRAY JCOMBOBOX SELECT = new jcombox (s); // Buat opsi drop-down jpanel p1 = jpanel baru (); // Area Playlist JPanel P = JPanel baru (); Jpanel p2 = jpanel baru (); // area tombol jpanel p3 = jpanel baru (); Jlabel l = jlabel baru (); Jpanel p5 = jpanel baru (); // Tempatkan daftar putar jpanel p6 = jpanel baru (); // Tempatkan nama lagu bermain statis jpanel pp = new jpanel (); Static Jlabel LB; public static JTextArea jt = new jTextAreA (); indeks int statis; // Subskrip dari Playlist Int Count; bendera int; // adalah penanda daftar putar yang diputar secara acak atau secara berurutan bermain int countesecond; // Dapatkan nilai total waktu dari musik statis int newtime = 0; int ischanging = 0; // Ketika mouse mengklik kursor, nilai kemajuan juga akan berubah int ispressing = 0; // pertahankan apakah mouse mengklik pada file kursor musicName = null; statis java.util.list <pangkangkuan> musiknames = null; // Gunakan generik untuk membuat file file file arus surrentDirectory = null; Daftar Daftar; // Daftar File FileDialog terbuka; // Tentukan objek dialog file acak rand = new random (); Nama file string; // progress bar jbutton timeInformation = new jbutton (); Jslider timeslider = jslider baru (swingconstants.horizontal, 0, 100, 0); //(Swingconstants.horizontal) digunakan untuk mengarahkan himpunan konstanta dengan bilah kemajuan sebagai arah horizontal // (0, 100, 0) Buat slider horizontal dengan nilai minimum, maksimum, dan awal yang ditentukan. // mainkan pemain pemain = null; MusicFileChooser FileChooser = MusicFileChooser baru (); static JTextPane tp = new jTextPane (); // tunjukkan area lirik statis jTextArea adalah = jTextArea baru (); // Tampilkan area gambar myMusicplayer publik () {j.setsize (1200, 700); J.SetLayout (null); J.GetContentPane (). Setbackground (Color.Black); J.SetDefaultCloseOperation (jframe.exit_on_close); p.setbounds (2, 563, 1180, 95); p.setLayout (borderlayout baru ()); p1.setbounds (2, 3, 298, 30); p1.setBackground (warna baru (255, 255, 255)); p2.setLayout (GridLayout baru (2, 3, 20, 20)); p2.setBackground (color.light_gray); p3.setLayout (GridLayout baru (2,0.200,10)); p3.setBackground (warna baru (255.255.255)); p5.setbounds (2, 35, 298, 526); p5.setLayout (null); p5.setBackground (warna baru (255.255.255)); p6.setbounds (301, 3.880, 30); p6.setLayout (null); p6.setBackground (warna baru (255.255.255)); l.setbounds (250, 4, 600, 30); // atur lagu yang ditampilkan dan diputar p6.add (l); /*Menerapkan penyisipan gambar**/ImageIcon ic = ImageIcon baru ("Image // 2.3.jpg"); ic = ImageIcon baru (ic.getImage (). GetScaledInstance (880, 477, 2)); // Dapatkan gambar dan atur ukuran gambar lb = Jlabel baru (IC); lb.setopaque (false); pp.setopaque (false); // diatur ke pp.setBound transparan (241, 80.990, 500); Are.setbounds (241, 56.990, 520); was.setopaque (false); tp.setBackground (warna baru (255.255.255)); tp.setbounds (301, 35.880, 49); pp.add (Are); pp.add (lb); // Daftar File = Daftar Baru (10); List.setbounds (100, 55, 187, 495); // daftar area daftar.addactionListener (ini); J.Add (Daftar); J.Add (JT); J.Add (TP); Badd.setbounds (5,20, 90,30); Badd.setBackground (warna baru (255.255.255)); Bdelect.setbounds (5, 80, 90, 30); Bdelect.setBackground (warna baru (255.255.255)); Bdelect.setbounds (5, 140, 90, 30); Bdelect.setBackground (warna baru (255.255.255)); TablePlaer.setbounds (30, 100, 200, 50); TABLEPLAER.SETFONT (font baru ("安安", 1, 20)); p1.add (TablePlaer); Bmoveprevious.setBackground (warna baru (255.255.255)); Bplayer.setBackground (warna baru (255.255.255)); BMovenext.setBackground (warna baru (255.255.255)); Bstop.setBackground (warna baru (255.255.255)); SELECT.SetBackground (warna baru (255.255.255)); Bset.setBackground (warna baru (255.255.255)); p2.add (bmoveprevious); p2.add (bplayer); P2.Add (BMovenext); P2.Add (BSTOP); p2.add (pilih); p2.add (bset); p2.setBackground (warna baru (255.255.255)); P.Add (P2, BorderLayout.west); P.Add (P3, BorderLayout.Center); p5.add (p); P5.Add (BADD); P5.Add (bdelect); p5.add (bdelecttable); Badd.addactionListener (ini); Bdelect.addactionlistener (ini); Bdelecttable.addactionListener (ini); BMovenext.addactionListener (ini); Bplayer.addactionListener (ini); Bmoveprevious.addactionListener (ini); Bstop.addactionListener (ini); pilih.addactionListener (ini); Bset.addactionListener (ini); TimeInformation.setenabled (false); / * * Bilah Kemajuan Implementasi * */Timeslider.SetMajortickspacing (1); // Panggil metode ini untuk mengatur interval tanda skala utama. Angka yang masuk mewakili jarak yang diukur dengan nilai antara setiap penanda skala utama. Timeslider.setPaintTicks (true); // Untuk menggambar skala utama, SetPaintTicks harus diatur ke True Timeslider.AddChangeListener (new changeListener () {// Buat ChangeListener baru dan tambahkan ke slider. Public void statechanged (ChangeEvent arg0) {if (player! = Null && isPressing == 1) {TimTIMET =: (int) (jslider) arg0.getSource ()). getValue (); timeSlider.addMouseListener(new MouseAdapter(){ public void mousePressed(MouseEvent arg0) { ispressing = 1; //When the mouse clicks the cursor} public void mouseReleased(MouseEvent arg0) { ispressing = 0; //When the mouse does not click the cursor} }); TimeInformation.setText ("Waktu Saat Ini: 00:00 || Total Waktu: 00:00"); TimeInformation.setBackground (warna baru (255.255.255)); P3.Add (TimeInformation, BorderLayout.North); P3.Add (Timeslider, Borderlayout.South); J.Add (pp); J.Add (P5); J.Add (P); J.Add (P1); J.Add (P6); j.setVisible (true); // j.setresible (false); } / * * Fungsi utama * * /public static void main (string [] args) melempar ioException, interruptedException {// interruptedException: Ketika utas dalam keadaan menunggu, tidur atau sibuk sebelum atau selama aktivitas dan utas terganggu, pengecualian dilemparkan. MyMusicplayer play = myMusicplayer baru (); Thread timerun = utas baru (mainkan); timerun.start (); } @Override public void actionPerformed (actionEvent e) {string cmd = e.getactionCommand (); // menilai apakah akan bermain atau berhenti dengan mendapatkan string, string box = (string) select.getSelectedItem (); // menilai urutan pemutaran if (e.getSource () == badd) {if (player == null) {if (filechooser.showopendialog (j) == musicfileChooser.approve_option) {this.musicname = filechooser.getSelectectedFile (); File cd = filechooser.getCurrentDirectory (); // Dapatkan jalur saat ini jika (cd! = This.currentDirectory || this.currentDirectory == null) {filefilter [] filefilters = filechooser.getChoosableFileFilters (); // FileFilter adalah kelas abstrak, yang digunakan JFilechooser untuk memfilter set file yang ditampilkan ke file file pengguna [] = cd.listFiles (); //cd.listFiles () berarti mengembalikan array pathnames abstrak, yang mewakili file dalam direktori yang diwakili oleh pathname abstrak ini. this.musicNames = new ArrayList <FILE> (); untuk (file file: file) {// Setiap kali objek file dalam array ditetapkan ke variabel file, dan kemudian variabel ini dioperasikan dalam badan loop, seperti: // untuk (int i = 0; i <file // Dapatkan semua nama musik untuk (FileFilter Filter: FileFilters) {if (! File.isDirectory () && filter.accept (file)) {this.musicnames.add (file); list.add (nama file); fileName = e.getactionCommand (); }}}}} index = MusicNames.indexof (MusicName); // Tentukan subskrip dari lagu count = musicNames.size (); Playfile (); }} else {player.start (); }} if (cmd.equals ("jeda")) {bplayer.setText ("play"); player.stop (); } if (cmd.equals ("play")) {bplayer.setText ("jeda"); player.start (); } if (e.getSource () == bstop) {// hentikan if (player! = null) {player.stop (); TimeInformation.setText ("Waktu Saat Ini: 00: 00 || Total Waktu: 00: 00"); Timeslider.setValue (0); player.setMediatime (waktu baru (0)); // Tetapkan waktu ke nol}} if (e.getSource () == bMovenext) {// lagu berikutnya if (player! = Null) {if ("quest playback" .equals (box)) {nextMusic (); } if ("shutter playback" .equals (box)) {int index = (int) rand.nextInt (this.musicnames.size ())+1; if (this.musicNames! = null &&! this.musicnames.isempty ()) {if (++ index == this.musicNames.size ()) {index = (int) rand.nextInt (this.musicnames.size ())+1; } player.stop (); // Jika Anda mengklik lagu sebelumnya, lagu saat ini akan dihentikan dan lagu sebelumnya akan diputar coba {player = manager.createrealizationPlayer (MusicNames.get (index) .touri (). Tourl ()); player.prefetch (); player.setMediatime (waktu baru (0.0)); // mainkan player.addControllerListener (ini); l.setText ("Playing:"+this.musicNames.get (index) .toString ()); List.Select (index); player.start (); Bendera = 1; } catch (noplayerException | canTeRealizeException | ioException e1) {e1.printstacktrace (); }}}}}} if (e.getSource () == bmoveprevious) {// lagu sebelumnya if (player! = null) {if ("quent play" .equals (box)) {sebelumnyaMusic (); } if ("shutter play" .equals (box)) {int index = (int) rand.nextInt (this.musicNames.size ())+1; if (this.musicNames! = null &&! this.musicnames.isempty ()) {if (index-== (int) rand.nextInt (this.musicnames.size ())+1) {index = this.musicnames.size ()-1; } player.stop (); // Jika Anda mengklik lagu sebelumnya, lagu saat ini akan dihentikan dan lagu sebelumnya akan diputar coba {player = manager.createrealizationPlayer (MusicNames.get (index) .touri (). Tourl ()); player.prefetch (); player.setMediatime (waktu baru (0.0)); // Mulai bermain player.addControllerListener (ini); l.setText ("Playing:"+this.musicNames.get (index) .toString ()); List.Select (index); player.start (); Bendera = 1; } catch (noplayerException | canTeRealizeException | ioException e1) {e1.printstacktrace (); }}}}}}} if (e.getSource () == bdelect) {// hapus indeks lagu = list.getSelectedIndex (); list.remove (indeks); MusicNames.Remove (this.index); } if (e.getSource () == bdelecttable) {// hapus daftar daftar.removeAll (); MusicNames.Removeall (MusicNames); player.stop (); pemain = null; } // Klik dua kali daftar yang akan diputar Daftar.AddMouseListener (mouseadapter baru () {public void mouseClicked (mouseEvent e) {// Klik dua kali if (e.getClickCount () == 2) {if (player! = Null) {player.stop ();}} {if (player = null) {player. }});} // Karena antarmuka "ControllerListener" diimplementasikan, metode ini digunakan untuk menangani peristiwa yang ditransmisikan dari pemutar media; public void controllerUpdate (controllerEvent e) {string box = (string) select.getSelectedItem (); // menilai urutan pemutaran jika (e instance dari endofmediaEvent) {player.setMediatime (waktu baru (0)); if ("single loop" .Equals (box)) {player.start (); } if ("Sequential Play" .Equals (box)) {nextMusic (); } if ("shutter play" .equals (box)) {if (this.musicnames! = null &&! this.musicnames.isempty ()) {int index = (int) rand.nextInt (this.musicnames.size ())+1; coba {player = manager.createrealizedPlayer (MusicNames.get (index) .touri (). Tourl ()); player.prefetch (); player.setMediatime (waktu baru (0.0)); // mainkan player.addControllerListener (ini); l.setText ("Playing:"+this.musicNames.get (index) .toString ()); List.Select (index); player.start (); Bendera = 1; } catch (noplayerException | canTeRealizeException | ioException e1) {e1.printstacktrace (); }}}}}}} / *** Dapatkan nama lagu mp3** @mp3 path file* @song nama* / public string getMusicName (string str) {int i; untuk (i = str.length ()-1; i> 0; i--) {if (str.charat (i) == '//') break; } str = str.substring (i + 1, str.length () - 4); mengembalikan str; } / *** Fungsi Implementasi Berikutnya* / public void nextMusic () {} / *** Fungsi implementasi sebelumnya* / public void sebelumnyaMusic () {} / *** Mainkan MP3 File Main Function* / public void playfile () {try {player = manager.createreLizizedererer (musicNames.get (index) .touri {player = tour.). player.prefetch (); player.setMediatime (waktu baru (0.0)); // mainkan player.addControllerListener (ini); l.setfont (font baru ("宋体", 0,20)); l.setText ("Playing:"+this.musicNames.get (index) .toString ()); // tunjukkan lagu yang sedang diputar daftar.Select (index); player.start (); MyThread11 tt = mythread11 baru (); tt.start (); } catch (Exception e1) {// Ketika sebuah musik tidak dapat diputar, menanganinya dealError (); kembali; } this.setFrame (); } public void setframe () {countsecond = (int) player.getDuration (). getseconds (); Timeslider.SetMaximum (CountSecond); Timeslider.setValue (0); newtime = 0; } private void dealError () {// TODO Metode yang dihasilkan otomatis Stub MusicNames.Remove (index); if (--count == index) index = 0; if (count == 0) player = null; lain playfile (); }/*** File mp3 Menyaring kelas internal*/kelas MusicFileChooser memperluas jfilechooser {}/*** File mp3 memfilter kelas internal tambahan**/kelas myfileFilter memperluas file filter {// filefilter adalah kelas abstrak, yang digunakan oleh jfilechooser untuk memfilter file {// filefilter adalah a sufek. Deskripsi string; myfilefilter publik () {super (); } public myfileFilter (string [] suffarr, deskripsi string) {super (); this.suffarr = suffarr; this.descript = description; } public boolean accept (file f) {for (string s: suffarr) {if (f.getName (). ToUpperCase (). endswith (s)) {return true; }} return f.isDirectory (); } public String getDescription () {return this.dection; }}/*** Baca bilah kemajuan waktu tampilan*/public void run () {while (true) {sleep (); if (player! = null) {if (isPressing == 0) {if (isChanging == 1) {newTime = timeslider.getValue (); player.setMediatime (waktu baru (((panjang) baru)*1000000000)); ischanging = 0; } else {newtime = (int) player.getMediatime (). getseconds (); timeslider.setValue (newtime); TimeInformation.setText ("Waktu Saat Ini:"+NewTime/60+":"+NewTime%60+"||"+"Total waktu:"+CountSecond/60+":"+CountSecond%60); }}}}}}}}} // Thread yang mengimplementasikan lirik myThread11 memperluas utas {public void run () {// TODO Metode yang dihasilkan otomatis Stub try {lrc lrc = readlrc.readlrc ("traveling light.lrc"); Lirik ls = parselrc.parselrc (lrc); playtest (ls); } catch (Exception e) {}}} static void playtest (lirik ls) melempar interruptedException {tp.setFont (font baru ("宋体", 1,20)); tp.setForeground (color.blue); StyledDocument doc = tp.getstyledDocument (); SimpleAttributeset center = new SimpleAttributeset (); Styleconstants.setAlignment (tengah, styleconstants.align_center); // tunjukkan doc.setParagraphattributes (0, doc.getLength (), center, false); tp.setText ("artis:" + ls.getar ()); tp.setText ("album:" + ls.getal ()); tp.setText ("lagu:" + ls.getti ()); tp.setText ("Produksi lirik:" + ls.getby ()); untuk (lyric l: ls.getlyrics ()) {tp.settext (l.gettxt ()); Thread.sleep (l.getTimize ()); }}}V. Hasil tes secara keseluruhan
sebagai berikut
Untuk informasi lebih lanjut tentang pemain, silakan klik "Fungsi Java Player" untuk dipelajari.
Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.