# VLC + Lied über Java starten



## schwummelwummel (15. Sep 2012)

Hallo, 
ich versuche gerade den VLC-Player + Lied nach Drücken eines Buttons zu starten.

An sich funktioniert das auch, nur wird das Lied nicht abgespielt.

Das heißt VLC öffnet sich, nach Drücken des Buttons, nur abgespielt wird nichts.


Hier mal der Code:

```
import java.awt.Desktop;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;

public class SimpleVLCPlayerExample{
	private Process vlcprocess;
	public String path = "C:/Program Files (x86)/VideoLAN/VLC/vlc.exe";
	public String file = "C:/Users/Pa/workspace/FilmDatenbank/src/KPF.mp3";
	public SimpleVLCPlayerExample(){
		JFrame frame = new JFrame();
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		JButton button = new JButton("start");
		button.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				stream(file);
			}
		});
		frame.add(button);		
		frame.pack();
		frame.setSize(500, 300);
		frame.setVisible(true);
	}
	
	public static void main(String[] argv){
		SwingUtilities.invokeLater(new Runnable(){
			public void run(){
				new SimpleVLCPlayerExample();
			}
		});		
	}
	
	public void stream(String channel){
		String cmd = path+" "+channel ;
		System.out.println("starte vlc mit: "+cmd);
		try {
			Runtime.getRuntime().exec(path);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}
```

Ich hoffe ihr könnt mir helfen .


----------



## Bernd Hohmann (15. Sep 2012)

Du hättest "cmd" statt "path" an .exec(..) übergeben sollen

Bernd

[edit: der rest war käse, bezieht sich nur auf ProcessBuilder]


----------



## schwummelwummel (15. Sep 2012)

Hallo, erst mal danke für die Antwort.

Ja so hatte ich es gestern auch, hatte nur vergessen das wieder zurück zu ändern.

Leider behebt das das Problem nicht. Es passiert genau das gleiche.

Der VLC-Player startet, aber das Lied wird nicht abgespielt.

Es ist praktisch so, als würde das Lied gar nicht mit übergeben werden, denn wenn ich im VLC-Player auf play klicke, erscheint das "Medium öffnen" Fenster.


----------



## Bernd Hohmann (15. Sep 2012)

Versuch Dein Glück mal mit dem ProcessBuilder

new ProcessBuilder(new String[]{path,channel}).start();

Bernd


----------



## schwummelwummel (15. Sep 2012)

Leider exakt das gleiche


----------



## Ark (15. Sep 2012)

Das Problem dürften die Leerzeichen in path sein: Java versucht deshalb immer, das Programm "C:/Program" auszuführen.

Probier mal so was wie

```
Runtime.getRuntime().exec(new String[]{path, channel});
```
und ersetze die / in deinen Pfadangaben durch \ (im String-Literal wie "\\"), denn die Argumente werden wörtlich an den neuen Prozess übergeben. Unter Windows könnte das mit den / sonst möglicherweise falsch verstanden werden.

Ark


----------



## schwummelwummel (15. Sep 2012)

Klappt leider auch nicht.

An den Leerzeichen kann es ja eigentlich nicht liegen, da der VLC-Player ja ohne Probleme aufgerufen wird und in dem Pfad von dem Lied sind keine Leerzeichen enthalten.


----------



## Ark (15. Sep 2012)

schwummelwummel hat gesagt.:


> An den Leerzeichen kann es ja eigentlich nicht liegen, da der VLC-Player ja ohne Probleme aufgerufen wird und in dem Pfad von dem Lied sind keine Leerzeichen enthalten.


Hm, da ist was dran. ^^

Kopier doch mal die Datei in das Arbeitsverzeichnis, in dem du dein Java-Programm ausführst, und setze [c]file = "KPF.mp3"[/c]. Was passiert dann? Starte VLC außerdem mal mehr verbose (mit "-vvv" oder so), vielleicht sagt er ja, wo das Problem ist.

Ark


----------



## schwummelwummel (15. Sep 2012)

Das mit dem Arbeitsverzeichnis hatte ich auch versucht, nutzt nichts .

Die Sache mit dem -vvv.. meinst du das als Startparameter im VLC selber, oder ihinten an den String anhängen, d.h."C:\\Program Files (x86)\\VideoLAN\\VLC\\vlc.exe-vvv".

Zweiteres funktioniert nicht, ersteres bekomm ich nicht hin, da ich bei Win7 nicht weiß wie man Startparameter setzt. .

Mich würde mal interessieren, ob es denn bei anderen funktioniert, denn dann wird es ja offensichtlich nicht am Code sondern an meinen privaten Einstellungen liegen.


E: Ok ich habe nun mal im VLC "Ziel"-Pfad per Rechtsklick "C:\Program Files (x86)\VideoLAN\VLC\vlc.exe" "-vvv" eingefügt. Ändert leider auch nichts


----------



## Ark (15. Sep 2012)

Also, unter Linux würde ich _wahrscheinlich_ (da ich vlc nicht installiert habe ^^) einfach mal eine Shell (für Windoof-Nutzer: Eingabeaufforderung oder so ^^) starten und dort

```
vlc -vvv KPF.mp3
```
eingeben und hoffen, dass alles funktioniert. Wenn nein, würde ich erst einmal dort so lange am Befehl rumschrauben, bis es geht.

Anschließend würde ich genau dieselbe Zeile (unter Berücksichtigung von Escape-Sequenzen etc.) bei [c]exec()[/c] eingeben und gucken/hoffen, dass es da dann auch funktioniert.

Da ich diesen Spielekonsolen-Verschnitt aka Windows nicht habe, kann ich das da leider nicht so nachstellen.

Ark


----------



## diggaa1984 (15. Sep 2012)

ich hab hier mal was

```
import java.awt.Desktop;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
 
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
 
public class SimpleVLCPlayerExample{
    private Process vlcprocess;
    public String path = "\"D:\\VLC_2_0_1\\vlc.exe\" --started-from-file \"";
    public String file = "C:\\Users\\diggaa\\Desktop\\Foo mit Leerzeichen.mp3";
    public SimpleVLCPlayerExample(){
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JButton button = new JButton("start");
        button.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                stream(file);
            }
        });
        frame.add(button);      
        frame.pack();
        frame.setSize(500, 300);
        frame.setVisible(true);
    }
    
    public static void main(String[] argv){
        SwingUtilities.invokeLater(new Runnable(){
            public void run(){
                new SimpleVLCPlayerExample();
            }
        });     
    }
    
    public void stream(String channel){
        String cmd = path.concat(channel) + "\"";
        System.out.println("starte vlc mit: "+cmd);
        try {
            Runtime.getRuntime().exec(cmd); //hier hattest du path drin!
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
```

in der registry fand ich folgendes:

Add to playlist - *"D:\VLC_2_0_1\vlc.exe" --started-from-file --playlist-enqueue "%1"* 
Open - *"D:\VLC_2_0_1\vlc.exe" --started-from-file "%1"*
Play with VLC - *"D:\VLC_2_0_1\vlc.exe" --started-from-file --no-playlist-enqueue "%1"*

habe mich erstmal an Open orientert .. 
[EDIT]ok so gehts nun .. du hattest "path" statt "cmd" an exec übergeben![/EDIT]


----------



## schwummelwummel (15. Sep 2012)

Juhu es klappt .

Vielen Dank euch allen für eure Mühe.


----------



## Bernd Hohmann (15. Sep 2012)

schwummelwummel hat gesagt.:


> Juhu es klappt .
> 
> Vielen Dank euch allen für eure Mühe.



Und was hast Du jetzt geändert damit es geht?

Bernd


----------



## schwummelwummel (15. Sep 2012)

Ich habe letztendlich den Code von diggaaa1984 kopiert und durch meine Pfade ersetzt.

Scheint also wirklich an der path/cmd Verwechslung und an der Pfadangabe gelegen zu haben.


----------



## diggaa1984 (15. Sep 2012)

Bernd Hohmann hat gesagt.:


> Und was hast Du jetzt geändert damit es geht?
> 
> Bernd



ja also wesentlicher Fehler war wirklich die Verwechslung der Parameter für exec .. selbst mit korrekten Pfaden hatte VLC einen kompletten Ordner abgespielt, eben den durch path angegebenen .. was nicht schön war ^^

Pfade korrigiert (Aufruf mit parameter wie in Registry) und Änderung des Parameters an exec und es lief. Der Code an sich war soweit ja in Ordnung.


----------



## schwummelwummel (15. Sep 2012)

Ich hätte noch eine kleine Frage und zwar:

Kann man irgendwie das Problem lösen, dass Lieder/Filme etc. nicht gelesen werden können, die ein Leerzeichen im Namen enthalten?

Ich weiß, Dateinamen sollten generell keine Leerzeichen enthalten  allerdings wäre es enorm viel Arbeit das zu ändern. Also gäbe es da eine Möglichkeit?


----------



## diggaa1984 (15. Sep 2012)

spielt er bei mir ohne problem :bahnhof:


----------



## schwummelwummel (15. Sep 2012)

Ja stimmt.. der Fehler lag woanders


----------

