JMF Unable to handle format

0

Witam.

Piszę grę strategiczną w Javie używając Eclipse'a. Aktualnie mam problem z wyświetlaniem intra gry (jako pliku mpg lub w innym formacie). Ściągnąłem JMFa i zainstalowałem. Dodałem do projektu odpowiednie pliki .jar, umieściłem je w tym samym folderze co projekt.
JMF sam w sobie działa, projekt się kompiluje i nawet nie ma problemu z odtworzeniem pliku .wav . Niestety przy próbie wyświetlenia .avi, .mpg czy jakiegokolwiek innego formatu są już problemy - czasem jest muzyka, a nie ma obrazu, czasem nie ma nic (zależnie od formatu czy też samego pliku).
Googlowałem na ten temat sporo jednak na nic się to nie zdało.

Po pierwsze: oto interesujący nas kod:

package GUI;



import java.awt.BorderLayout;

import javax.media.Manager;
import javax.media.MediaLocator;
import javax.media.Player;
import javax.swing.JFrame;

public class GuiMenu
{
	private JFrame okno;
	MediaLocator ml;
	Player player;
	
	public GuiMenu(String nazwaOkna)
	{
		okno = new JFrame(nazwaOkna);
		okno.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		okno.setVisible(true);
		okno.setSize(500, 500);
		try
		{
			wyswietlIntro();
		} catch (Exception e)
		{
			System.out.println(e.getMessage());
		}
		okno.pack();
	}
    public void wyswietlIntro() throws Exception
    {	
    	//ml= new MediaLocator("file:///D:/ProgramyUczelnia/Eclipse/WorkSpace/Smieci/Wege Tycoon 0/bin/southparkintro.mpg");
    	ml= new MediaLocator("file:///C:/Filmy/droga_po_puchar.mpg");
    	player = Manager.createRealizedPlayer(ml);  
        okno.add(player.getVisualComponent(), BorderLayout.CENTER);
        player.start();
    }
}

Mniej istotna część, główna klasa:

 package GUI;

public class Glowna {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		new GuiMenu("Menu");
	
	}
}

Projekt jak pisałem się kompiluje i wyrzuca w zależności od ładowanego pliku .mpg (nie ma muzyki nie ma obrazu):

Failed to configure: com.sun.media.PlaybackEngine@4e1f0b6e
Bad header in the media: Bad data

Error: Unable to realize com.sun.media.PlaybackEngine@4e1f0b6e
null
Exception in thread "main" java.lang.NullPointerException
at GUI.GuiMenu.<init>(GuiMenu.java:42)
at GUI.Glowna.main(Glowna.java:9)

lub (jest muzyka nie ma obrazu)

Unable to handle format: MPEG, 352x288, FrameRate=25.0, Length=152064
null

Co już próbowałem:
a) na nowo instalować JMFa 2.1.1e
b) wyświetlać film razem z paskiem przewijania na dole (a nie tak jak teraz wyświetlany jedynie jest sam obraz bez GUI)
c) próbować tego samego kodu w nowym czystym projekcie
d) restartować kompa
e) wyświetlać te same filmy które ładuje do mojego programu w jmstudio.exe - działają dobrze

Co budzi moje wątpliwości:
a) czytałem, że JMF jest mocno przestarzałe i trzeba dodawać zewnętrzne kodeki do projektu. Ściągnąłem więc paczkę kodeków jffmpeg-1.1.0.jar i dodałem do projektu. Nadal 0 efektu, jednak być może w jakiś inny sposób trzeba zainstalować te kodeki? Jak?
b) 64 bitowy windows na którym pracuję (wiem, że pewnie głupota ale winxp64 często przeszkadza w wielu rzeczach :) )

Z góry dziękuję za pomoc.

edit:
Ściągnąłem kod źródłowy jmstudio.exe . Otworzyłem Eclipsem, skompilowałem i okazuje się, że działa tak samo jak mój program (te same błędy wyrzuca i nie odtwarza filmów). Jednakże, jeśli uruchomię jmstudio.exe, które domyślnie się instaluje razem z biblioteką JMF to ono działa perfekcyjnie. (???)

0

Witam

Też był czas, że bawiłem się JMF. Faktycznie jest on nie rozwijany, ale to do czego był stworzony wypełnia całkowicie. Z plikami avi to wiesz...to tylko kontener a w środku może być cokolwiek. JMF sam z siebie radzi sobie z nieskompresowanymi sekwencjami lub sekwencjami skompresowanymi kodekami działajacymi w ten sposób, że obrabiają każdą klatkę z osobna, a nie tak jak np. mpeg4 czy xvid - wprowadzającymi tzw. wirtualne obiekty (w skrócie: wydzielony obszar "podróżuje" między klatkami). W praktyce zastosowanie JMF sprowadza się do nieskompresowanych sekwencji lub takie z mpeg1 albo RLE (stare i niemodne ale działają).

Po pierwsze upewnij się, ze Twoja sekwencja faktycznie nie jest jakaś bardziej finezyjna niż mpeg1/2. Po drugie - spróbuj z nieskompresowaną sekwencją - "czyste" klatki.

jffmpeg - też mi raz działał raz nie. Chyba też już nie jest rozwijany. Instalacja jest bardziej finezyjna niż dodanie jarów do projektu - poczytaj dokładnie - z tego co pamiętam zmienia się plik properities w katalogu JMF a tą dużą dllke i jeszcze coś walisz do system32.

Znalazłem klaskę co mi służyła do czytania klatek:

import javax.media.*;
import javax.media.control.*;
import javax.media.util.*;
import javax.media.format.*;

import java.io.*;
import java.awt.*;

import java.awt.image.BufferedImage;


public class VideoHandling {
    
    
    public int totalFrames;
 
    public Player p = null;
    public FramePositioningControl positioner = null;
    public FrameGrabbingControl grabber = null;
    
    public VideoFormat vFormat;
    public Buffer buffer;
    public BufferToImage bToImage;
    public BufferedImage buffImg;
     
    public Image captured;
    
    public int szerokosc,wysokosc;   
    
    public VideoHandling(MediaLocator plikvideo) {
        
         try {            
            Manager.setHint(Manager.LIGHTWEIGHT_RENDERER, true);
            Manager.setHint(Manager.PLUGIN_PLAYER, new Boolean(true));        
            p = Manager.createRealizedPlayer(plikvideo);            
            System.out.println("p----------> " + p);
            positioner = (FramePositioningControl) p.getControl("javax.media.control.FramePositioningControl");            
            System.out.println("positioner---------->" + positioner);
            grabber = (FrameGrabbingControl) p.getControl("javax.media.control.FrameGrabbingControl");
            System.out.println("grabber----------> " + grabber);            

        } catch (IOException ioe) {
         //   raport.append("Błąd przy próbie otwarcia pliku Video: prawdopodobnie zły rodzaj pliku" + "\n");
        } catch (NoPlayerException nple) {
         //   raport.append("Błąd przy próbie inicjalizacji playera" + "\n");
        } catch (CannotRealizeException cre) {
         //   raport.append("Błąd przy próbie postawienia playera w stan 'Realize' " + "\n");
        }         

        Time duration = p.getDuration();
        totalFrames = FramePositioningControl.FRAME_UNKNOWN;
        totalFrames = positioner.mapTimeToFrame(duration);         
    }
    
    public void wczytajklatke(int numerklatki){
        
        positioner.seek(numerklatki);
        buffer = grabber.grabFrame();
        
        vFormat = (VideoFormat) buffer.getFormat();
        bToImage = new BufferToImage(vFormat);
        captured = bToImage.createImage(buffer);
        buffImg = new BufferedImage(captured.getWidth(null), 		       captured.getHeight(null), BufferedImage.TYPE_INT_RGB);
        wysokosc = buffImg.getHeight() - 1;
        szerokosc = buffImg.getWidth() - 1;
    }

    public BufferToImage getbToImage() {
        return bToImage;
    }

    public BufferedImage getBuffImg() {
        return buffImg;
    }

    public Buffer getBuffer() {
        return buffer;
    }

    public Image getCaptured() {
        return captured;
    }

    public FrameGrabbingControl getGrabber() {
        return grabber;
    }

    public Player getP() {
        return p;
    }

    public FramePositioningControl getPositioner() {
        return positioner;
    }

    public int getSzerokosc() {
        return szerokosc;
    }

    public int getTotalFrames() {
        return totalFrames;
    }

    public VideoFormat getvFormat() {
        return vFormat;
    }

    public int getWysokosc() {
        return wysokosc;
    }    
}

Może Ci się przyda - a jak nie to wystaw gdzieś tą Twoją sekwencję to zobaczę w moim programie, który zachowałem sobie - program do segmentacji ale plik video otwierać umie.

Finalnie możesz spróbować FMJ - takie późniejsze społecznosćiowe JMF.

Powodzenia

0

Dzięki za odpowiedź. Zaraz spróbuję twoich podpowiedzi, w szczególności skorzystam z FMJ.

W międzyczasie skorzystałem z FOBSa i tutorialu na youtube do instalacji JMF+FOBS. Okazało się, że po części miałem rację i 64bity znowu są przeszkodą. Po skompilowaniu teraz projektu z JMF+FOBS wyrzuca:

java.lang.UnsatisfiedLinkError: D:\WINDOWS\system32\fobs4jmf.dll: Can't load IA 32-bit .dll on a AMD 64-bit platform

edit:
znalezione w sieci:

JMF will never work on a 64bit

Muszę przeinstalować JDK na 32 bity.

0

Jeszcze wpiszę się dla potomnych.

Dzisiaj jest niedzielny poranek. Od piątkowego popołudnia zmarnowałem kilkanaście godzin podczas których nie napisałem ani jednej linijki kodu - próbowałem zainstalować JMF, by poprawnie móc wyświetlać różne multimedia w moim projekcie. Przekopywałem internet - google, fora, dokumentację; reinstalowałem IDE, jave, jmfa; resetowałem komputer; oglądałem tutki na youtube - próbowałem chyba wszystkiego. Bez skutku, nadal .mpg, .avi czy cokolwiek innego się nie wyświetlało.

Przyczyną był Windows XP 64 bit. Koniec końców zainstalowałem 32bitowe JDK i JRE, zainstalowałem Eclipse 32bit i wszystko działa dodając jedynie pliki .jar JMFa do projektu. Żadnych kombinacji z PATH czy wklejaniem odpowiednich .jarów czy .ini w odpowiednie miejsca na komputerze.

1 użytkowników online, w tym zalogowanych: 0, gości: 1