StringBuffer als JMF DataSource?

Status
Nicht offen für weitere Antworten.

irml

Neues Mitglied
Hi Leute,

mir stehen einzelne IP-Packete die ich aus einem Streammitschnitt extrahiere in einem StringBuffer nach und nach zur Verfügung. In den IP-Packet Daten ist ein MPEG 2 TS enthalten, welchen ich über das JMF mit RTP übertragen bzw. anzeigen möchte. Hier ist das Problem das ich 1. den StringBuffer nicht als DataSource deklarieren kann bzw. darf und 2. JMF mit MPEG 2 TS (MP2T) nix anfangen kann (Payload Type 33 nicht supported). :?

Ich hab mir auch schon einen Multicast Socket erstellt um die einzelnen IP-Packete eventuell an den VLC zu senden nur da weiß ich nicht ob der die IP-Packete schluckt? Hab Ihr dazu irgend welche Infos?

irml
 

Marco13

Top Contributor
Zu 1.: Du kannst dir eine eigene DataSource implementieren, z.B. indem du von PullBufferDataSource erbst, und bei "getStreams" Objekte einer Klasse zurückgibt, die PullBufferStream implementiert. Letztere würde sich in der "read"-Methode dann die Daten aus deinem StringBuffer holen.

Ab einfachsten wird es sein, sich dabei am Beispielcode von
http://java.sun.com/products/java-media/jmf/2.1.1/solutions/JpegImagesToMovie.html
zu orientieren.

Zu Formatkonvertierungen kann ich aber leider auch nichts sagen - am Versuch, etwas anderes zu Lesen/Schreiben als das, was "Standardmäßig" gelesen/geschrieben wird, bin ich damals auch gescheitert :( JMF ist zwar sehr abstrakt und mächtig, aber das macht den Einstieg nicht unbedingt leichter.
 
G

Gast

Gast
Lies dich mal ein bisschen in den TrackControl. Mit dem solte Formatkonvertierung kein problem sein. Ein kleiner beispielcode dazu:

Processor p = null;

try{
p = Manager.createProcessor(new MediaLocator(<Datenstrom>));
p.addControllerListener(this);
p.configure();
}
catch(Exception e){}

public synchronized void controllerUpdate(ControllerEvent event){
if(event instanceof ConfigureCompleteEvent){
TrackControl[] tracks = p.getTrackControls();
for(int i = 0; i < tracks.length; i++){
Format trackFormat = tracks.getFormat();

if(trackFormat instanceof AudioFormat){
try{
Codec[] audioConversion = new codecs[]{
new com.sun.media.codec.audio.mpa.NativeEncoder()
};
tracks.setCodecChain(audioConversion);
tracks.setFormat(new AudioFormat(AudioFormat.MPEG))
}
catch (Exception e){}
}
else{
tracks.setEnabled(false);
}
}
p.setContentDescriptor(new ContentDescriptor("audio.mpeg"));
p.realize();
}
}

Sollte mit Videos auch funktionieren.
 
G

Gast

Gast
Lies dich mal ein bisschen in den TrackControl. Mit dem solte Formatkonvertierung kein problem sein. Ein kleiner beispielcode dazu:

Processor p = null;

try{
p = Manager.createProcessor(new MediaLocator(<Datenstrom>));
p.addControllerListener(this);
p.configure();
}
catch(Exception e){}

public synchronized void controllerUpdate(ControllerEvent event){
if(event instanceof ConfigureCompleteEvent){
TrackControl[] tracks = p.getTrackControls();
for(int i = 0; i < tracks.length; i++){
Format trackFormat = tracks.getFormat();

if(trackFormat instanceof AudioFormat){
try{
Codec[] audioConversion = new codecs[]{
new com.sun.media.codec.audio.mpa.NativeEncoder()
};
tracks.setCodecChain(audioConversion);
tracks.setFormat(new AudioFormat(AudioFormat.MPEG))
}
catch (Exception e){}
}
else{
tracks.setEnabled(false);
}
}
p.setContentDescriptor(new ContentDescriptor("audio.mpeg"));
p.realize();
}
}

Sollte mit Videos auch funktionieren.
 
I

irml1

Gast
hi...



das eigentliche Problem an der Sache ist, dass mir als <Datenstrom> nur eine StringBuffer zur Verfügung steht(kein Video oder AudioStream!) und ich den nicht als DataSource am MediaLocator anmelden kann, darf oder wie auch immer.

siehe...
Code:
p = Manager.createProcessor(new MediaLocator(<Datenstrom>));
".

Der Link von Marco13 kann da glaube ich eher mein Problem lösen.
http://java.sun.com/products/java-media/jmf/2.1.1/solutions/JpegImagesToMovie.html
(Muss aber ehrlich gestehen das ich daran nicht weiter gearbeitet habe.)

Danke Euch trotzdem. Es kommt auch wieder mehr Zeit. :toll:
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Oben