# JMF



## Bluevelvet64 (14. Jun 2007)

Hallo Leute

habe ein merkwürdiges Problem mit JMF

Auf einem Rechner mit java 1.4 und XP läuft unter JMF Sound und Video ohne Probleme.
Bei jedem anderen Recher und den gleichen Sourcen ( und auch die gleichen Binarys ) läuft nur der Sound. Ich habe einen Recher mit XP und Java 1.4  zwei Rechner mit XP und Java 1.5 und einen Rechner mit Linux und Java 1.5.

Auf allen kommt beim starten des Videos die Melduung 

Unable to handle format ...

Ich habe auch eine gepackte lauffähige Jar Version des Programms. Auch hier das gleiche Ergebnis. Auf dem einen Rechner geht es ( XP und Java 1.4 ) auf allen anderen läuft kein Video.

Es sind aber definitiv die gleichen Sourcen und das gleiche JMF ( bzw bei Linux das JMF für Linux) Ich verwender nicht das crossplattform JMF. 

Habt Ihr eine Idee was das Problem sein könnte.

Danke im Voraus


----------



## The_S (14. Jun 2007)

Fehlende Codecs!?


----------



## Bluevelvet64 (14. Jun 2007)

Da das Video im Projekt ja auf einem anderen Rechner läuft und ich das gesamte Projekt auf einen anderen kopiere, kann eine fehlender Codec nicht das problem sein. Ausserdem habe ich nur das reine JMF im projekt ohne zusätzlichen Cocec. Und so läuft es auf dem einen Rechner. Also Codec fällt flach

Danke


----------



## The_S (14. Jun 2007)

Warum? Wenn ein Codec im Betriebssystem nicht registriert ist, dann geht da auch nix. Bestes Beispiel ist die Crossplattform mp3-Unterstützung von JMF. Wenn im Betriebssystem der entsrpechende Codec installiert ist, kannste mp3 mit der Crossplattform Version abspielen, ansonsten net.


----------



## Bluevelvet64 (15. Jun 2007)

Dann sollte doch aus dem gleichen Grund kein MP3 laufen.

Aber MP3 läuft ohne registrierung. Nur Video eben nicht.

Könnt ihr mir bitte mal eine relativ einfache aber funktionierende Anleitung gebenwas zu machen ist um mpg und mp3 mit jmf zum laufen zum bringen.

Ich habe bisher immer das jmf.jar in einen lib ordner im Projektordner ( nicht in das lib Verzeichnis von java ) gelegt. Dann habe ich das jar in den buildpath hinzugefügt.  Und dann ging Video und mp3 auf dem einen Rechner mit java1.4. Aber auf allen anderen geht video nicht. Auf meinem Linuxrechner geht der Sound mal und mal nicht. Und bei einem Freund für den das Programm gedacht ist läuft in der gleichen Umgebung weder Sound noch Video.

Wichtig ist, das das Jar nicht in das lib verzeichnis von Java sondern im lib-Verzeichnis des Programm stehen muss.

Was geschieht eigentlich wenn ich das jmfinit von jmf aufrufe. Und was machen die anderen tools.

Zum beipsiel jmfregistry.

Habt Ihr da mal eine Anleistung.

Danke im Voraus


----------



## The_S (15. Jun 2007)

Also doch Crossplattform. Für bestimmte Codecs (wie mpeg) muss das JMF auf dem Zielrechner INSTALLIERT sein, es reicht nicht das package einfach mitzugeben!


----------



## Bluevelvet64 (15. Jun 2007)

Ich verwende keine crossplattform für JMF

Auf jedem rechner liegt eine eigene Form von JMF. Also auf dem Linuxrechner das JMF für Linux und auf den XP Kisten das JMF für Windows. Bedeutet ich habe zwei verschiedene lib- Ordner die die jeweils benötigten jars der Plattform beinhalten.  Ich übergebe also nur die sourcen an Eclipse des jeweiligen Rechners, kompiliere und was auf dem einen geht geht auf dem anderen nicht. heist, auf dem einen Rechner geht Sound und Video auf den anderen nur sound. 

Eine andere Form : Ich packe die ganzen Binarys in ein jar ( ohne die in dem lib ordner ) Im manifestfile steht der classpath zu den externen jars.

Dann übergebe ich das jar an den zielrechner ( der das performance-pack für das system beinhaltet ) und starte dann das Programm
Auch in diesem Fall geht video und sound auf dem einen Rechner und auf den anderen nur sound.

Unter XP habe ich jweils das performancepack installiert. Sollte also auch registriert sein.

Noch eine Idee ???


----------



## The_S (16. Jun 2007)

Du übergibst die sourcen an Eclipse? Was willst du eigentlich machen? Dein Programm auf mehreren Rechnern entwickeln oder dein Programm deploeyen?


----------



## Guest (16. Jun 2007)

Hallo

ich habe nun JMF auf XP und 2000 so weit das Video und Sound geht. ( MPEG und MP3 ) Allerdings bei gleicher Vorgehensweise 

1. Installation JMF aif Rechner
2. Starten des Projektes unter Eclipise bzw. direkt aus dem jar läuft auf einem Rechner nur Video.

Beim starten kommt die Meldung

unable to realize com.sun.media.amovie

Diese Meldung kommt auch aus dem JMFStudio. 

Hast Du eine Idee woran das liegen könnte.


Zu deiner Frage. ich übergebe die Sourcen an den Auftraggeber, der zur kontrolle die Sourcen unter Eclipse startet. Und bei dem läuft eben kein Sound.

Danke für Deine Antwort


----------



## The_S (16. Jun 2007)

Sorry, dazu habe ich überhaupt keine Idee, die Fehlermeldung ist mir vollkommen unbekannt, auch merkwürdig, dass diese Fehlermeldung beim Start des JMFStudios geschieht. Evtl. mal Google befragen ...


----------



## Bluevelvet64 (18. Jun 2007)

Hallo

gogglen bringt nichts. Die Meldung besagt das der Player nicht erstellt werden kann und kommt eigentlich wenn es Probleme mit den Codecs gibt.

Da aber das verwendete Programm-JAR mit dem JMF.jar zusammen auf einem Stick sind und die gleiche Vorgehensweise bei allen Rechnern die gleiche ist, ist es eben merkwürdig, das bei einem Rechner nur Video aber kein Sound geht aber bei allen anderen ( und manchmal !!! auch bei Linux ).

Ich habe noch eine Frage.

Laut SUN muss für MP3-Support das MP3 Plugin ( zumindest bei Linux ) installiert werden. Jedoch habe ich das MP3 Plugin bisher nicht verwendet ( ginge auch gar nicht, aber dazu gleich mehr ). Denoch geht der MP3 Support mit dem jmf.jar aus dem performance pack ohne Probleme bei allen rechnern mit XP ( bis auf einen ). Meistens auch unter Linux.


Wenn ich nun aber nach der Anleitung das mp3-plugin installieren will schlägt das fehl weil die Java Klasse JavaDecoder die sich unter

com.sun.media.codec.audio.mp3 befinden soll  nicht im jmf Jar vorhanden ist.

Anleitung von SUN

For the plugin to work within a JMF application, you need to :

- ensure that jmf.jar is also in the /lib/ext directory
- run the following command:

java com.sun.media.codec.audio.mp3.JavaDecoder


Wenn ich das ausführe bekomme ich sofort eine fehlermeldung die mir sagt das die Klasse JavaDecoder nicht vorhanden ist. Was auch stimmt. Den Ordner mp3  gibt es nicht. Allerdings gibt es einen JavaDecoder in einem anderen Ordner im Package. Die kann man allerdings nicht ausführen weil diese keine main-methode besitzt.

Wie werden denn nun plugins installiert.

Ich benötige vor allem mp4 Support.

Hast Du eine Anleistung die Du schon mal verwendet hast und die funktioniert.

Gruss und Danke 

Heiko


----------



## The_S (18. Jun 2007)

> Hast Du eine Anleistung die Du schon mal verwendet hast und die funktioniert.



Also bei mir funktionierte bis jetzt immer:

- JMF für die jeweilige Plattform auf dem jeweiligen Zielsystem runterladen
- Installieren
- Java-Programm dort ohne zusätzliche Packages ausführen


----------



## Bluevelvet64 (18. Jun 2007)

Aber ich habe eben auf einem Rechner mit XP das Problem das der Sound nicht geht.

Unter Linux ist es ganz katastrophal.

Das extreme war:

Ich hatte keinen Sound mit der meldung : unable to handle format mpeg...

Danach startete ich nochmal und der Sound ging. Am kommenden morgen ging der Sound nicht, aber nach einem neustart ging er wieder. und das ohne Änderung an den Sourcen.

Merkwürdig oder.

Falls ich das Problem nicht ganz in den Griff bekomme, werde ich wohl wieder den JLayer verwenden müssen. Kennst Du den. Den habe ich vor dem JMF verwendet. Aber dort geht kein Video und ich konnte auch keine Lautstärke regeln. Daher wechselte ich zu JMF. Jetzt habe ich habe dort doch eine Möglichkeit gesehen wie man die Lautstärke regulieren kann.  Allerdings ist merkwürdige das beide Deviceklasse, die man für den Player benötigt,  abstrakt sind. 

Es gibt eine Deviceklasse und eine DeviceBasisKlasse. Die DeviceBasisKlasse ist abgeleitet von der DeviceKlasse.

Ein Device bilden kann man aber nur von der DeviceKlasse über eine getPropertyMethode. Nicht von der DiviceBasisKlasse. Allerdings hat nur diese Basisklasse die Fähigkeit einen Controller auf zu nehmen und damit den Klang zu regeln. 

Kennst Du JLayer und weist Du wie man diese so benutzt das man den Controller und den Equalizer nutzen kann.

JLayer benötigt nämlich keine Systemabhängigen Komponenten für den Sound. Ich würde dann JMF für Video und JLayer für Sound nutzen. Das hatte ich schon alles im Programm drin und lief unter Windows und XP ganz ohne Probleme. Eben nur ohne Video und ohne Klangregelung. 

Googlen bring hier überhaupt nichts.

Danke für Deine Mühe


----------



## The_S (19. Jun 2007)

Joa, das JMF ist halt total verbuggt ... Bevor du dir den JLayer antust, schau dir lieber mal den BasicPlayer - ebenfalls von www.javazoom.net - an.


----------



## Bluevelvet64 (21. Jun 2007)

Danke für Deine Antwort.

Aber leider finde ich den nicht.

Bevor ich mir den ansehe folgende Fragen.

Läuft der plattform unabhängig wie JLayer oder benötige ich hier auch wie bei JMF unterschiedliche Versionen für Linux und Windows.

Kann dieses Package Video und Sound.

Gibt es dort eine Laustärkeregelung bei der ich bei gleichzeitigen Video und Sound die Laustärke gezielt tegeln kann.

Der Grund JMF zu nutzen war eben die Möglichkeit Videos zu nutzen ( läuft auch ganz prima auf beiden Plattformen ) und zum anderen eben die Lautstärkeregelung.

ich lasse ständig eine Hintergrundmelodie laufen und starte dazwichen Videos. Dann muss die Lautstärke runtergeregelt werden so lange das Video läuft.

Das habe ich auch schon alles. 

Allerding bekomme ich keine  MP3 Support unter Linux hin ( hast Du da eine Idee ) und zum anderen hat zumindst ein rechner mit XP bisher das gleiche Problem. Auch hier läuft kein MP3. WAV läuft ohne Probleme auf allen Systemen. Wenn dieses MP3 Problem nicht wäre, würde ich JMF behalten.

Danke für eine Lösung oder einen Hinweis wo ich BasicPlayer bekomme


----------



## The_S (21. Jun 2007)

Den BasicPlayer findest du hier

http://www.javazoom.net/jlgui/api.html

mp3 kannst du damit ohne Probleme abspielen, Videos imho nicht. Er ist vollkommen Plattformunabhängig und die Lautstärke kannst du natürlich auch verändern. Wenn du mit dem JMF keine Probleme mit Videos hast, sondern nur mit mp3, dann verwende doch BasicPlayer und JMF!


----------



## Bluevelvet64 (21. Jun 2007)

Hallo 

habe den Player getestet. Leider auch hier kein MP3. Auf dem Rechner bei dem ich mit dem JMF MP3 abspielen kann kommt beim BasicPlayer folgende Meldung


21.06.2007 15:20:33 javazoom.jlgui.basicplayer.BasicPlayer open
INFO: open(file:musik/marsch.mp3)
ThreadSound Play : Interrupted javazoom.jlgui.basicplayer.BasicPlayerException: javax.sound.sampled.UnsupportedAudioFileException: could not get audio input stream from input URL

Wenn ich eine wav Datei angebe, geht es ohne Probleme. Wie gesagt der Player aus JMF funktioniert auf dem gleichen Recher mit MP3 ???

Alles merkwürdig

MfG


----------



## The_S (21. Jun 2007)

In der Tat, du hast auch alle Libs des BasicPlayers mit eingebunden?


----------



## byte (21. Jun 2007)

Vielleicht wäre noch QuickTime for Java eine Alternative:

http://developer.apple.com/quicktime/qtjava/


----------



## Bluevelvet64 (21. Jun 2007)

Danke für den Tip.

Das jar für den BasicPlayer ligt in der root des entpackten ZIP. alle anderen liegen unter lib daher habe ich diese gar nicht beachtet.

Jetzt scheint es zu gehen.

Habe dummerweise hier keine Boxen. Aber es kommt keine fehlermeldung mehr und die Ausgaben von j4log zeigen das er das File wohl abspielt.

Danke noch mal


----------



## Bluevelvet64 (22. Jun 2007)

Hallo

weis jemand ob das CrossPlatform Package von JMF unterstützung für MPEG hat.

Hintergrund. Da ich nun JMF nur für Video verwende würde ich a: nur ein Jar für Windows und Linux benötigen und b: könnte mir die Installation auf dem Zielsystem sparen.

Ich finde bei Sun nicht mehr diese Tabelle mit den Möglichkeiten die verschienden JMF Versionen bieten.

Danke

MfG

Heiko


----------



## The_S (22. Jun 2007)

Google? formate + jmf, gleich der 2. bzw. je nach sichtweiße 1. link!

http://java.sun.com/products/java-media/jmf/2.1.1/formats.html


----------



## Bluevelvet64 (13. Jul 2007)

Hallo

wenn ich im JMF neue Codecs anmelden möchte, muss ich laut SUN nachdem ich die beiden Jars  JMF.jar und das Jar mmit dem Plugin im Classpath aufgenommen habe die Klasse JDecoder.class aus dem Package com.sun.media.decoder. ... aufrufen. Aber die geforderte Klasse gibt es nicht.

Hat jemand eine funktionierende Anleitung wie ich mp4 oder mmv in JMF einbinde.

Danke für euer Hilfe


----------



## Bluevelvet64 (23. Jul 2007)

Hallo

ich habe ein neues Problem, mit dem Basic Player das aber nur unter Windows auftritt.

ich habe eine Soundklasse entwickelt die als Thread löuft und bei bedarf einen Klang parallel zum programmablauf spielt. Diese Klasse wird einmal durch eine Useraktion , ( öffnen einer Maske ) oder durch das Programm selbst über einen anderen Thread der die ganze Zeit das programm und seine Status überwacht.

Wenn ich nun einen Klang als User starte, z.B öffnen einer Maske, läuft der Klang vollkommen fehlerfrei.

Startet aber der Thread den Sound, stottert der Klang nur so vor sich hin und der Prozessor ist vollkommen ausgelastet.

Dies tritt nur unter Windoes aber nicht unter Linux auf.

Hat jemand eine Idee

MfG


----------



## The_S (23. Jul 2007)

Hm, ich wüsste jetzt nicht woran das liegen könnte. Hast du zufällig n bisschen Code?


----------



## Bluevelvet64 (23. Jul 2007)

hier ist der Code der den SoundThread aufruft: Dieser ist selbst ein Thread und läuft ständig um Programmparameter zu überwachen und bei bestimmten Parameterrn eben den Sound zu spielen und ein Fenster zu öffnen.


```
public void run()
{ // Beginn run
       
   while (t != null)
  { // Beginn while 
			
     try
    { // Beginn  try

       Hier kommen noch einige Prüfungen
        ....
				
										ThreadSound snd = new ThreadSound();
                snd.start ("sounddatei");
	
       ....
 
       Hier wird noch ein fenster geöffnet				

   } // Ende try
   catch(InterruptedException e) {System.err.println("Thread interrupted!");	break;}
				
   
} // Ende run
```



Hier nun der SoundThread


```
public class ThreadSound  implements Runnable
{ // Beginn der Klasse	
		
	FM fm;
	Thread t = null;
	String fileST ="";
	
	public ThreadSound(){}

	public synchronized void start(String fileST)
	{if (t == null){this.fileST=fileST; t = new Thread(this);t.start();}}
	
	public void run()
	{ play(fileST);}
	
	public void play(String title)
	{ // Beginn Methode play
		
		try
		{ // Beginn try

			ThreadMusik.player.setGain(0.1);

			BasicPlayer player = new BasicPlayer(); 
			player.open(new File("musik" + FM.TRENNER + title));
			player.play();

			while(player.getStatus()==BasicPlayer.PLAYING)
			   Thread.sleep(100);
		   
			player.stop();
			ThreadMusik.player.setGain(0.9);
			stop();
			
		}// Ende try
	    catch(BasicPlayerException ie){System.out.println("ThreadSound Play : Interrupted " + ie);}
	    catch (InterruptedException e){System.out.println("MusikThread : IO " + e);}
	    
	} // Ende Methode play

	public synchronized void stop()
	{if (t != null)t.suspend();}
  
  	public synchronized void interrupt()
	{if (t != null)t.interrupt();}     
  	
} // Ende der Klasse
```



Wenn ich den gleichen Thread ( SoundThread ) aus dem Programm über eine Maske starte, funktioniert es. Nur bei Aufruf über den thread geht es nicht. Und bei Linux geht es immer.

Danke für Deine Antwort.

MfG

Heiko


----------



## The_S (24. Jul 2007)

Du lässt den aufrufenden Thread aber schon immer ein bisschen schlafen oder!?


----------



## Bluevelvet64 (24. Jul 2007)

Wenn der aufrufende Thread eine Aktion aufruft, hält er solange an, wie die Aktion dauert. Dann macht er weiter.

Meinst Du das damit.

MfG


----------



## The_S (24. Jul 2007)

Nein, ich wollte wissen ob du eine Endlos-Schleife erzeugt hast, die nicht wenigstens kurz für ein paar Millisekunden unterbrochen wird.


----------



## Bluevelvet64 (24. Jul 2007)

Hallo

der aufrufende Thread läuft die ganze zeit, da er ständig die Datenbank auf Datum und Uhrzeit gegen die Daten des Programm abgleichen muss. Wenn Datum und Zeit gleich sind löst er ein Ereignis aus. Dann hält der Thread an, nach dem Ereignis, das der User bestätigen muss,  macht er weiter.

Ich könnte auch den Thread bei errreichen eine Ereignisses stoppen und nach dem Ereignis das der User ja bestätigen muss, neu starten. Meinst Du es liegt daran des der Thread in der Schleife läuft. ABer in dem anderen Fall das der Soundthread über eine andere Aktion aufgerufen wird läuft der erste Thread ja auch noch, und ist auch aktiv. Dennoch geht der Sound. Und unter Linux gibt es das Problem nicht.

MfG


----------



## The_S (24. Jul 2007)

Wärst du so lieb und würdest endlich mal meine Frage beantworten, und zwar ohne dass du die ganze Zeit außenrum redest? Ein einfaches "Ja" oder "Nein" reicht völlig :roll:


----------



## Bluevelvet64 (25. Jul 2007)

Ich dachte die hätte ich benatwortet ???

Also der Thread lief bisher in einer Endlosschleife, wurde nur bei Ereignissen auf Pause gesetzt.

Ich habe das Problem gelöst.

Alle Threads ( es gab noch andere für termine usw. ) rausgeworfen. Es gibt jetzt nur noch einen Thread der läuft zwar auch in einer Schleife, aber wenn er zu dem Ergebniss kommt, das etwas passieren muss, ( termin, Ereigniss ) dann ruft er eine externe Methode auf und beendet sich selbst. Die methode erledigt ihre Aufgabe und startet den Thread neu.

Jetzt hat auch MS keine Probleme mehr.

MfG

Heiko


----------



## The_S (25. Jul 2007)

Meine Frage ist zwar immer noch nicht beantwortet aber k, jetzt läufts ja :roll:


----------



## Bluevelvet64 (25. Jul 2007)

Du wolltest doch wissen ob der Thread in einer Endlosschleife lief. 

Ja, hab eich doch schon geschrieben.  Und scheinbar kam MS damit nicht zurecht. 

Merkwürdigerweise liefen 5 Threads parallel, immer in einer Schleife. Alle pausierten wenn es ein Ereignis gab. Aber das Programm hatte nie ein Problem. Nur wenn der Soundthread vom Ereignisthread gestartet wurde trat das Problem auf.


----------



## The_S (25. Jul 2007)

Bluevelvet64 hat gesagt.:
			
		

> Du wolltest doch wissen ob der Thread in einer Endlosschleife lief.



Nein! Das er in einer Endlosschleife läuft seh ich ja selber.

"Du lässt den aufrufenden Thread aber schon immer ein bisschen schlafen oder!?"

"Nein, ich wollte wissen ob du eine Endlos-Schleife erzeugt hast, die nicht wenigstens kurz für ein paar Millisekunden unterbrochen wird."

Du hattest Sachen in deinem Code, den du gepostet hast, weggekürzt. Ich wollte wissen, ob du den Thread schlafen legst, sprich irgendwo in deiner Endlosschleife ein Thread.sleep aufgerufen wird.


----------



## Bluevelvet64 (25. Jul 2007)

Jetzt verstehe ich was Du meinst Sorry,

nee sleep  ging nicht. Die methode erwartet eine zeit. Da der BasicPlayer aber keine methode kennt die als Rückgabewert die Länge des Stückes liefert, brachte das nichts. Auch weiss man voher nicht wie lange ein User auf ein Ereignis reagiert. Daher brachte eine feste zeiteingabe nichts. Und Thread.wait wurde nicht akzeptiert. Brachte immer ein IllegalStateMonitorException???

Ich hatte daher eine boolsche Variable die innerhalb des Threads abgefragt wurde. Wenn diese auf true stand, lief zwar der Thread noch, aber die Prüfroutinen haben nicht gearbeitet. Wenn die Ereignisse vom User abgearbeitet waren, oder der Sound zu ende ist wurde die Variable wieder auf false gesetzt und das prüfen ging weiter.

Aber jetzt geht es ja mit dem einen Thread.

Trotzdem danke für Deine Mühe


----------



## The_S (25. Jul 2007)

Ich glaube du hast immernoch nicht ganz begriffen was ich wollte (oder aber extrem schlampig programmiert  ). Aber lassen wir es gut sein, es geht ja jetzt  .


----------

