Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem 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.

Jsou zobrazeny jen nové odpovědi. Zobrazit všechny
Předmět Autor Datum
Co vim, tak pro javu jen jenom stará knihovna JMF. Do toho bych uz dneska nešel, pač jsem si s tím k…
MaSo 17.10.2016 12:12
MaSo
JavaFx jsem zkoušel, ale nepodařilo se mi to rozjet. Používám clip z knihovny javax.sound.sampled J…
MichalDM 17.10.2016 16:45
MichalDM
Použij třídu MediaPlayer. viz http://stackoverflow.com/questions/6045384/playing -mp3-and-wav-in-jav…
MaSo 18.10.2016 07:02
MaSo
JFileChooser fileChooser = new JFileChooser(); fileChooser.setFileFilter(new FileNameExtensionFilter…
MichalDM 18.10.2016 16:02
MichalDM
Přidej někam na zátek programu řádek: new JFXPanel(); ...je to takový hack, aby se JavaFX iniciali…
MaSo 18.10.2016 16:47
MaSo
Ještě se vyskytly dva problémy. 1. Když vyberu soubor, který má pár 10 MB, tak java ho nestihne nač…
MichalDM 19.10.2016 22:27
MichalDM
Tak ještě poslední problém. Chci, aby se po skončení skladby opakoval kód výše. Jenže nevím, jak má…
MichalDM 20.10.2016 23:42
MichalDM
Že by pomocí metody getStatus()? https://docs.oracle.com/javase/8/javafx/api/javafx /scene/media/Me…
MaSo 22.10.2016 16:42
MaSo
import java.io.File; import javafx.embed.swing.JFXPanel; import javafx.scene.media.Media; import jav… nový
MichalDM 20.01.2017 22:58
MichalDM
Už to funguje. import java.io.File; import javafx.embed.swing.JFXPanel; import javafx.scene.media.M… poslední
MichalDM 26.01.2017 18:47
MichalDM

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.

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)

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.

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();
}
}

Zpět do poradny Odpovědět na původní otázku Nahoru