# Mp3 von einem Server streamen



## Looky (1. März 2008)

Hallo Leute,

also, ich habe bisher den Weg, das ich einen Inputstream (per HttpConnection Object) auf das MP3 File legen, welches auf einem Server im Internet liege. Diese Datei kann ich dann abspielen.

Soweit so gut, ich würde allerdings gerne eine Art Buffer machen, indem der Stream reinschreibt und erst wenn der z.B. zu 10 % gefüllt ist fang ich an zu spielen. Das soll dazu führen, das auch auf langsamen servern keine nervigen "Hackler" zu hören sind.

Habt ihr eine Idee wie ich sowas bewerkstelligen kann bzw ein Stück code wo es sowas schon gibt?

Danke
Christian


----------



## zerix (1. März 2008)

Hallo,

hättest du vielleicht ein Stück Code an dem man sieht, wie du es bisher gelöst hast?
Vielleicht kann man ja auf deinen aufbauen.

MFG

Sascha


----------



## Looky (1. März 2008)

Moins, hier meine Klasse, die die MP3s abspielt.
Ach, vorher noch, wie ich die Methode play() aufrufe.


```
URL getMp3File= new URL(*Url zur Datei*);
		    			URLConnection conn = getMp3File.openConnection();
		    			
		    			BufferedInputStream in = new BufferedInputStream(conn.getInputStream());
		    			Utilities.mediaplayer.play(in, conn.getContentLength(),true);
```

und hier nun die eigentliche Klasse, die du/ihr seht lese ich drekt von dem Inputstream. Irgendeine art "helper stream oder so" wäre nicht schlecht... aber ich hab keine idee wie ich das machen soll.

```
package IO;


import java.io.InputStream;
import java.util.Map;

import javazoom.jlgui.basicplayer.BasicController;
import javazoom.jlgui.basicplayer.BasicPlayer;
import javazoom.jlgui.basicplayer.BasicPlayerEvent;
import javazoom.jlgui.basicplayer.BasicPlayerException;
import javazoom.jlgui.basicplayer.BasicPlayerListener;
import GUI.Submasks.ActualMusicList;
import GUI.Submasks.MusicPlayer;
import GUI.Submasks.MyPlayList;
import UTIL.Utilities;


public class MediaPlayer implements BasicPlayerListener{

	private InputStream inputstream = null;
	
	// Instantiate BasicPlayer.
	public static BasicPlayer player = new BasicPlayer();

	// BasicPlayer is a BasicController.
	BasicController control = (BasicController) player;

	
	public MediaPlayer(){
		player.addBasicPlayerListener(this);
	}
	
	private int filelength = 0;
	private InputStream in = null;
	
	//Currently playlist 1= ExtendedPlaylist, 2 = actualplaylist
	public static int currently_playlist = -1;
	
	//must be true if next song is choosen manually
	private static boolean manuelNextTrack = false;
	
	public void play(InputStream ins, int filelength, boolean manuelNextTrack)
	{
		MediaPlayer.manuelNextTrack = manuelNextTrack;
		MusicPlayer.musicFrames.removeAllElements();
		player.setLineBufferSize(409600);
		this.filelength = filelength;
		try
		{	
			in = ins;

			if(player.getStatus()==player.PLAYING)
				control.stop();

			control.open(ins);


			// Start playback in a thread.
			control.play();
			

			control.setGain(MusicPlayer.getGainValue());
			

			control.setPan(0.0);
			
		}
		catch (BasicPlayerException e)
		{
			e.printStackTrace();
		}
	}
		
	private boolean pauseWasPressed = false;
	public void pause(){
		try {
			if(pauseWasPressed){
				control.resume();
				pauseWasPressed = false;
			}
			else{
				control.pause();
				pauseWasPressed = true;
			}
		} catch (BasicPlayerException e) {
			e.printStackTrace();
		}
	}
	public void setGain(double val){
		try {
			control.setGain(val);
		} catch (BasicPlayerException e) {

			e.printStackTrace();
		}
	}
	
	public void stopWhileDownload(){
		try{
			if(player.getStatus()!=player.STOPPED || player.getStatus()!=player.PAUSED){
				if(player.getStatus()==player.PLAYING)
					player.pause();
				else
					player.resume();
			}
		}catch(Exception e){
			e.printStackTrace();
		}
	}
	
	public void seek(long seek){
		try {
			control.seek(seek);
		} catch (Exception e) {

			e.printStackTrace();
		}
	}
	public void stop(){
		try {
			Utilities.musicscroller.stopScrolling();
			control.stop();
		} catch (BasicPlayerException e) {
			e.printStackTrace();
		}
	}
	

	public void opened(Object stream, Map properties)
	{

		display("opened : "+properties.toString());		
	}
		
	

	long b = 0;
	public void progress(int bytesread, long microseconds, byte[] pcmdata, Map properties)
	{
		// Pay attention to properties. It depends on underlying JavaSound SPI
		// MP3SPI provides mp3.equalizer.
		//properties.get(key)
		//System.out.println(((Long.parseLong((String)properties.get("mp3.position.microseconds"))/1000)/1000));
			try{							   //mp3.position.microseconds
				b = ((Long)properties.get("mp3.position.byte")).longValue();
			//	System.out.println((filelength-(((Long)properties.get("mp3.frame")).longValue()*((Integer)properties.get("mp3.frame.size.bytes")).intValue()))/((Integer)properties.get("mp3.frame.size.bytes")).intValue());
				MusicPlayer.setSliderValue((int)((((float)b/(float)filelength)*100)),b);
			}catch(Exception e){
				e.printStackTrace();
			}
		//display("progress : "+properties.toString());
	}
	
	


	public void stateUpdated(BasicPlayerEvent event)
	{
		// Notification of BasicPlayer states (opened, playing, end of media, ...)
		display("stateUpdated : "+event.toString());
		if(event.getCode() == BasicPlayerEvent.STOPPED){
			System.out.println(manuelNextTrack);
			if(currently_playlist>0 && MusicPlayer.playlistmode.isSelected() && !manuelNextTrack){
				switch(currently_playlist){
					case 1: MyPlayList.playNextSong(); break;
					case 2: ActualMusicList.playNextSong(); break;
				}
			}
		}else if(event.getCode() == BasicPlayerEvent.PLAYING && manuelNextTrack!=false)
			manuelNextTrack = false;
	}

	
	public void setController(BasicController controller)
	{
		display("setController : "+controller);
	}
	
	public void display(String msg)
	{
		System.out.println(msg);
	//	if (out != null) out.println(msg);
	}
}
```


----------

