Ten temat umieściłem już w dziale Java, ale nie mam odpowiedzi. Może tu coś się uda...
W książce Java Receptury (wyd. Helion 2003) w rozdziale 12 jest podany przykład aplikacji do odtwarzania różnych plików o nazwie JMFPLayer. Otóż ta aplikacja nie chce odtwarzać plików MIDI, chociaż poprawnie odtwarza inne typy audio a nawet video (AVI). MIDI nie chce zresztą odtwarzać żadna aplikacja używająca klas z JMF i zawsze zgłaszany jest podobny typ błędu. Używam Windows XP Professional, JDK 1.5.0 i JMF 2.3
Program, skopiowany od Heliona i lekko przeze mnie zmodyfikowany wygląda tak:
// 19.01.2005
//
// Teraz niepotrzebne import com.darwinsys.util.WindowCloser;
//
import java.applet.;
import java.awt.;
import javax.swing.;
import java.net.;
import java.io.;
import java.util.;
import javax.media.*;
/**
-
Program przedstawia prosty kod umożliwiający odtwarzania
-
klipów wideo przy wykorzystaniu Java Media Framework.
-
@Author Ian F. Darwin, ian@darwinsys.com
-
@version $Id: JMFPlayer.java,v 1.7 2001/03/29 20:05:06 ian Exp $
*/
public class JMFPlayer extends JPanel implements ControllerListener {/** Obiekt odtwarzacza /
Player thePlayer = null;
/* Nadrzędna ramka w której działa program. /
JFrame parentFrame = null;
/* Panel zawartości /
Container cp;
/* Komponent wizualny (jeśli jakiś jest) /
Component visualComponent = null;
/* Domyślny komponent kontrolny (jeśli jest) /
Component controlComponent = null;
/* Nazwa używanego pliku multimedialnego. /
String mediaName;
/* Adres URL używanego pliku dźwiękowego. */
URL theURL;/** Tworzymy obiekt odtwarzacza oraz graficzny interfejs użytkownika. */
public JMFPlayer(JFrame pf, String media) {
parentFrame = pf;
mediaName = media;
// cp = getContentPane();
cp = this;
cp.setLayout(new BorderLayout());
try {
theURL = new URL(getClass().getResource("."), mediaName);
thePlayer = Manager.createPlayer(theURL);
thePlayer.addControllerListener(this);
} catch (MalformedURLException e) {
System.err.println("JMF - błąd tworzenia adresu URL: " + e);
} catch (Exception e) {
System.err.println("Błąd tworzenia odtwarzacza JMF : " + e);
return;
}
System.out.println("URL pliku = " + theURL);// Uruchamiamy odtwarzacz: spowoduje to przekazanie informacji // do naszego obiektu ControllerListener. thePlayer.start(); // rozpoczynamy odtwarzanie
}
/** Metoda wywoływana w celu zatrzymania odtwarzania, na przykład
- w wyniku kliknięcia przycisku Stop lub wybrania odpowiedniej
- opcji z menu programu
*/
public void stop() {
if (thePlayer == null)
return;
thePlayer.stop(); // zatrzymujemy odtwarzanie!
thePlayer.deallocate(); // zwalniamy zasoby systemowe
}
/** Metoda wywoływana gdy chcemy zamknąć program (na przykład
- po kliknięciu przycisku Wyjście
*/
public void destroy() {
if (thePlayer == null)
return;
thePlayer.close();
}
/** Metoda wywoływana przez JMF gdy odtwarzacz chce nas o czymś
- poinformować
*/
public synchronized void controllerUpdate(ControllerEvent event) {
System.out.println("controllerUpdate Event:\n"
+ event.toString() + "\n");
if(event instanceof ControllerErrorEvent) {
System.exit(1);
}
if(event instanceof RealizeCompleteEvent) {
if ((visualComponent = thePlayer.getVisualComponent()) != null)
cp.add(BorderLayout.CENTER, visualComponent);
if ((controlComponent =
thePlayer.getControlPanelComponent()) != null)
cp.add(BorderLayout.SOUTH, controlComponent);
// zmieniamy wielkość głównego okna aplikacji
if (parentFrame != null) {
parentFrame.pack();
parentFrame.setTitle(mediaName);
}
}
}
public static void main(String[] argv) {
JFrame f = new JFrame("Odtwarzacz JMF - demonstracja");
Container frameCP = f.getContentPane();
JMFPlayer p = new JMFPlayer(f, argv.length == 0 ?
"file:///C:/music/midi/beet5th.mid" : argv[0]);
frameCP.add(BorderLayout.CENTER, p);
f.setSize(200, 200);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // DODANE
f.setVisible(true);
}
}
A takie były "wyniki" przekierowane do pliku
URL pliku = file://C:/prolog/java2recept/r12/test.wav
controllerUpdate Event:
javax.media.TransitionEvent[
source=com.sun.media.content.unknown.Handler@15ff48b,
previous=Unrealized,current=Realizing,target=Started]
controllerUpdate Event:
javax.media.DurationUpdateEvent[
source=com.sun.media.content.unknown.Handler@15ff48b,
duration=javax.media.Time@14b7453
controllerUpdate Event:
javax.media.RealizeCompleteEvent[
source=com.sun.media.content.unknown.Handler@15ff48b,
previous=Realizing,current=Realized,target=Started]
controllerUpdate Event:
javax.media.TransitionEvent[
source=com.sun.media.content.unknown.Handler@15ff48b,
previous=Realized,current=Prefetching,target=Started]
controllerUpdate Event:
javax.media.PrefetchCompleteEvent[
source=com.sun.media.content.unknown.Handler@15ff48b,
previous=Prefetching,current=Prefetched,target=Started]
controllerUpdate Event:
javax.media.StartEvent[
source=com.sun.media.content.unknown.Handler@15ff48b,
previous=Prefetched,current=Started,target=Started,
mediaTime=javax.media.Time@19616c7,
timeBaseTime=javax.media.Time@b166b5]
controllerUpdate Event:
javax.media.EndOfMediaEvent[
source=com.sun.media.content.unknown.Handler@15ff48b,
previous=Started,current=Prefetched,target=Prefetched,
mediaTime=javax.media.Time@133796]
URL pliku = file://C:/prolog/java2recept/r12/doszopy.mid
controllerUpdate Event:
javax.media.TransitionEvent[
source=com.sun.media.content.audio.midi.Handler@eee36c,
previous=Unrealized,current=Realizing,target=Started]
controllerUpdate Event:
javax.media.RealizeCompleteEvent[
source=com.sun.media.content.audio.midi.Handler@eee36c,
previous=Realizing,current=Realized,target=Started]
controllerUpdate Event:
javax.media.TransitionEvent[
source=com.sun.media.content.audio.midi.Handler@eee36c,
previous=Realized,current=Prefetching,target=Started]
controllerUpdate Event:
javax.media.ResourceUnavailableEvent[
source=com.sun.media.content.audio.midi.Handler@eee36c,
message=Failed to prefetch]