
Java - podpora audio/video souborů
Dobrý den,
Moc rád bych chtěl v javě pouštět hudbu, popřípadě videa. Jenže Java má jen omezené množství podpory audio/video formátů včetně jejich kódování. Proto se chci zeptat, jestli existují nějaké soubory, které můžete importovat do Javy, stejně jako codec do přehrávače. Nebo existuje i jiný způsob?
Mockrát děkuji za radu.
Co vim, tak pro javu jen jenom stará knihovna JMF. Do toho bych uz dneska nešel, pač jsem si s tím kdysi užil svoje, když jsem programoval SIP klienta (a míchání RTP streamů).
Nemá něco na video/hudbu JavaFx?
JavaFx jsem zkoušel, ale nepodařilo se mi to rozjet. Používám clip z knihovny javax.sound.sampled
JFileChooser fileChooser = new JFileChooser();
fileChooser.setFileFilter(new FileNameExtensionFilter("Cat", "wav"));
fileChooser.showOpenDialog(null);
File musicFile = fileChooser.getSelectedFile();
AudioInputStream audioIn = AudioSystem.getAudioInputStream(musicFile);
Clip clip = AudioSystem.getClip();
clip.open(audioIn);
clip.start();
Vše funguje v pořádku, ale audio soubor funguje pouze wav.
Použij třídu MediaPlayer. viz http://stackoverflow.com/questions/6045384/playing -mp3-and-wav-in-java
JFileChooser fileChooser = new JFileChooser();
fileChooser.setFileFilter(new FileNameExtensionFilter("Cat", "mp3"));
fileChooser.showOpenDialog(null);
String musicFile = fileChooser.getSelectedFile().getName();
Media hit = new Media(new File(musicFile).toURI().toString());
MediaPlayer mediaPlayer = new MediaPlayer(hit);
mediaPlayer.play();
Přesně takhle jsem to předtím napsal, jenže se vyskytly 2 chyby. Jednak jsem musel soubor nelogicky přesunout/zkopírovat do stejné složky, jako je jframe, jinak jej nechtěl zaregistrovat (v příkladu s clip s tím nebyl problém) a v předposledním řádku to hlásí.
Exception in thread "Thread-3" java.lang.IllegalStateException: Toolkit not initialized
at com.sun.javafx.application.PlatformImpl.runLater(P latformImpl.java:273)
at com.sun.javafx.application.PlatformImpl.runLater(P latformImpl.java:268)
at javafx.application.Platform.runLater(Platform.java :83)
at javafx.scene.media.Media$_MetadataListener.onMetad ata(Media.java:543)
at com.sun.media.jfxmediaimpl.MetadataParserImpl.done (MetadataParserImpl.java:120)
at com.sun.media.jfxmediaimpl.platform.java.ID3Metada taParser.parse(ID3MetadataParser.java:237)
at com.sun.media.jfxmediaimpl.MetadataParserImpl.run( MetadataParserImpl.java:103)
Přidej někam na zátek programu řádek:
...je to takový hack, aby se JavaFX inicializovalo.
Ještě se vyskytly dva problémy.
1. Když vyberu soubor, který má pár 10 MB, tak java ho nestihne načíst či co a hudba se někdy přehraje, někdy ne. To jsem však obešel tím, že jsem na konec připsal.
Thread.sleep(2000);
Sice je tam 2 sekundová pauza, ale soubor se vždy přehraje.
2. Nepřehraje flac. Chtěl jsem to obejít nějakou knihovnou, ale jedinou rozumnou jsem našel jflac. Jenže jsem k ní nenašel žádný tutorial nebo aspoň příklad.
Tak ještě poslední problém.
Chci, aby se po skončení skladby opakoval kód výše. Jenže nevím, jak mám zaznamenat, že skončila skladba.
Že by pomocí metody getStatus()?
https://docs.oracle.com/javase/8/javafx/api/javafx /scene/media/MediaPlayer.Status.html
import java.io.File;
import javafx.embed.swing.JFXPanel;
import javafx.scene.media.Media;
import javafx.scene.media.MediaPlayer;
import javafx.scene.media.MediaPlayer.Status;
import javax.swing.JFileChooser;
import javax.swing.filechooser.FileNameExtensionFilter;
public class Player {
static MyThread thread = new MyThread();
public static void main(String[] args) {
thread.start();
}
public static class MyThread extends Thread {
static MediaPlayer mediaPlayer;
@Override
public void run() {
play();
for (;;) {
if (!MyThread.mediaPlayer.getStatus().equals(Status.P LAYING))
System.out.println(MyThread.mediaPlayer.getStatus( ));
play();
}
}
public void play() {
new JFXPanel();
JFileChooser fileChooser = new JFileChooser();
fileChooser.setFileFilter(new FileNameExtensionFilter("Cat", "mp3", "wav"));
fileChooser.showOpenDialog(null);
String musicFile = fileChooser.getSelectedFile().getAbsolutePath();
Media hit = new Media(new File(musicFile).toURI().toString());
MyThread.mediaPlayer = new MediaPlayer(hit);
MyThread.mediaPlayer.play();
}
}
}
Nevím proč to nefunguje. Při každém průchodu je podmínka vždy splněna. A navíc to vyhazuje chybu.
Exception in thread "Thread-0" java.lang.NullPointerException
at archivator.Player$MyThread.play(Player.java:38) - String musicFile = fileChooser.getSelectedFile().getAbsolutePath();
at archivator.Player$MyThread.run(Player.java:29) - play(); v podmínce
Ve vláknech se moc nevyznám, takže prosím o radu.
Děkuji.
PS. A Thread už neobsahuje metodu sleep. Nevím, jak ji nahradit.
Už to funguje.
import java.io.File;
import javafx.embed.swing.JFXPanel;
import javafx.scene.media.Media;
import javafx.scene.media.MediaPlayer;
import javax.swing.JFileChooser;
import javax.swing.filechooser.FileNameExtensionFilter;
public class Player {
public static void main(String[] args) {
play();
}
private static void play() {
new JFXPanel();
JFileChooser fileChooser = new JFileChooser();
fileChooser.setFileFilter(new FileNameExtensionFilter("Cat", "mp3", "wav"));
fileChooser.setControlButtonsAreShown(false);
fileChooser.showOpenDialog(null);
String musicFile = fileChooser.getSelectedFile().getAbsolutePath();
Media hit = new Media(new File(musicFile).toURI().toString());
MediaPlayer mediaPlayer = new MediaPlayer(hit);
mediaPlayer.setOnEndOfMedia(() -> play());
mediaPlayer.play();
}
}