
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.
Je pekné, že si chceš niečo naprogramovať sám, ale pokiaľ si nedokážeš nájsť potrebné info...budeš to mať veľmi ťažké!
naozaj si nič nenašiel?
github.com
fakt nie? potom sa venuj niečomu inému...
Tak sorry, že jsem tě zklamal. Problém je v tom, že já neumím hledat.
tak sa to mrte rychlo nauc. lebo nik nema cas za teba hladat veci.
inac robit zrovna mediaplayer v jave...by som povedal ze java je na toto nevhodna.
poznas nejaky mediaplayer v jave? v zivote som ziaden nevidel.
Ty z mediaplayeru poznáš, v jakém jazyce byl napsaný? Tak to jsi machr.
poznas to uz zo vzhladu programu. java sa vzdy lisi od klasickeho default windows vzhladu inych appiek pisanych v delphi ci c++
Blbost, dá se to napsat tak, že poznáš leda hovno. Vypadá to jak nativní appka...
da. ale kto to robi?
mozno tak 1% java programatorov. zvysku je vzhlad u prdele.
este aj tak rozsireny soft ako je jdownloader nepouziva normalny vzhlad.
a dalej, vacsinou java program prezradia este kadejake *.jar subory v jeho adresari
Takže program v Javě poznáš tak, že vypadá nenormálně a je v .jar. Pokud to tak není, tak to nepovažuješ za program napsaný v Javě. Takže se pak nedá divit, že máš dojem, že jo platí u většiny.
este aj samotny instalator javy vyzera nestandartne.
ano, tvari sa to ako nativ win appka, no ma nestandardnu farbu vnutra okna a progressbar je na niecom ako vysunuty bevel.
Ukaz mi nejaky rozsireny java soft, ktory vyzera ako nativ win appka.
nepisal som ze java program musi byt nutne v jar. bezne si skompilujes execko, ale v adresari programu isto takmer vzdy najdes aj jar subory.
Co jsem tak zbezne koukal, tak v tom JavaFX se to da psat docela pekne. A ve vysledku mas pak mulitplatformi media player. Takze bych se Javy vubec nebal...
https://blog.idrsolutions.com/2014/11/write-media- player-javafx-using-netbeans-ide/
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();
}
}