ιαδικτυακές Εφαρµογές Πραγµατικού Χρόνου µε Java Java Media Framework Ηβιβλιοθήκη JMF Εγκαθίσταται επιπρόσθετα στη Java Αναπαραγωγή πολυµέσων Αποστολή και λήψη πολυµέσων σε πραγµατικό χρόνο Γραφικά αντικείµενα διεπαφής χρήστη (user interface) για τον έλεγχο των πολυµέσων π.χ. Ράβδοι εξέλιξης κ.α. Επισκεφτείτε το δικτυακό τόπο της JMF για να εξερευνήσετε τις δυνατότητές της: http://java.sun.com/products/javamedia/jmf/2.1.1/samples/ 1
ιαδικτυακή αναπαραγωγή Η διαδικτυακή αναπαραγωγή / εγγραφή επιτυγχάνεται µέσω του πρωτοκόλλου RTP (Real Time Protocol). Κατασκευάζουµε προγραµµατιστικά έναν διακοµιστή (server) για να αποστέλλει δεδοµένα κι έναν πελάτη (client) για να δέχεται δεδοµένα. ιαδικτυακή αναπαραγωγή Ηεφαρµογή JMStudio έχει ήδη εφαρµοσµένες τις συναρτήσεις της JMF Είναι καλό παράδειγµα για να φτιάχνουµε τις δικές µας εφαρµογές! ιατίθεται µε την JMF Ο κώδικάς της είναι ελεύθερος! 2
ιαδικτυακή αναπαραγωγή Από την επιλογή File Open File Άνοιγµα αρχείου πολυµέσων π.χ. Bach.wav Open URL Άνοιγµα επικοινωνίας πολυµέσων προσδιορίζοντας το κατάλληλο URL, π.χ. rtp://mediastreams.ibm.com:491 50/audio/1 ιαδικτυακή αναπαραγωγή Από την επιλογή File Open RTP Session Εκκίνηση επικοινωνίας µε RTP (αναµονή για λήψη) Προσδιορίζοντας τη διεύθυνση (address), τη θύρα (port) και το TTL (Time To Live) 3
ιαδικτυακή αναπαραγωγή Από την επιλογή File Transmit Μετάδοση µε RTP αποθηκευµένου αρχείου (file) πολυµέσων ή σύλληψη (capture) του αρχείου πολυµέσων από κάποια συσκευή (π.χ. κάµερα). ιαδικτυακή αναπαραγωγή 4
ιαδικτυακή αναπαραγωγή ιαδικτυακή αναπαραγωγή 5
ιαδικτυακή αναπαραγωγή Μεθοδολογία Θέτουµε έναν υπολογιστή Α να αναµένει δεδοµένα π.χ. βίντεο µε Open RTP Session από έναν υπολογιστή Β. Στον υπολογιστή Β του δικτύου δροµολογούµε την αποστολή του αρχείου βίντεο προς τον υπολογιστή Α µε Transmit. Αναπαραγωγή Ήχου Κατασκευή εφαρµογής που δέχεται ως όρισµα στη γραµµή εντολών το όνοµα ενός αρχείου ήχου π.χ. WAV και το αναπαραγάγει Εκτέλεση: java SimpleAudioPlayer bach.wav Προσοχή! Ο τύπος του αρχείου πρέπει να υποστηρίζεται από την JMF 6
Αναπαραγωγή Ήχου 1. Εισαγωγή πακέτου για δειγµ/νο ήχο import javax.sound.sampled.*; 2. Ανάγνωση του αρχείου ήχου AudioInputStream audioinputstream = AudioSystem.getAudioInputStream(soundFile) 3. Ανάγνωση της µορφής (format) του αρχείου π.χ. δειγµ/ψία (Hz) AudioFormat audioformat = audioinputstream.getformat(); 4. έσµευση γραµµής δεδοµένων α. SourceDataLine (αναπαραγωγή) β. Clip (επαναλαµβανόµενη αναπαραγωγή) γ. TargetDataLine (εγγραφή) SourceDataLine line = null; DataLine.Info info = new DataLine.Info(SourceDataLine.class, audioformat); line = (SourceDataLine) AudioSystem.getLine(info); Αναπαραγωγή Ήχου 5. Άνοιγµα γραµµής line.open(audioformat); 6. Πέρασµα γραµµής από την κάρτα ήχου line.start(); 7. Ανάγνωση δεδοµένων από το AudioInputStream σε buffer και στη συνέχεια εγγραφή του buffer στη γραµµή int nbytesread = 0; byte[] abdata = new byte[external_buffer_size]; while (nbytesread!= -1) nbytesread = audioinputstream.read(abdata, 0, abdata.length); if (nbytesread >= 0) int nbyteswritten = line.write(abdata, 0, nbytesread); 8. Άδειασµα και κλείσιµο της γραµµής line.drain(); Line.close(); 7
Αναπαραγωγή Ήχου import java.io.*; import javax.sound.sampled.*; public class SimpleAudioPlayer private static final int EXTERNAL_BUFFER_SIZE = 128000; public static void main(string[] args) if (args.length!= 1) out("simpleaudioplayer: usage:"); out("\tjava SimpleAudioPlayer <soundfile>"); System.exit(1); String File strfilename = args[0]; soundfile = new File(strFilename); Αναπαραγωγή Ήχου /* We have to read in the sound file. */ AudioInputStream audioinputstream = null; try audioinputstream = AudioSystem.getAudioInputStream(soundFile); catch (Exception e) /* In case of an exception, we dump the exception including the stack trace to the console output. Then, we exit the program. */ e. printstacktrace(); System.exit(1); 8
Αναπαραγωγή Ήχου AudioFormat audioformat = audioinputstream.getformat(); SourceDataLine line = null; DataLine.Info info = new DataLine.Info(SourceDataLine.class, audioformat); try line = (SourceDataLine) AudioSystem.getLine(info); line.open(audioformat); catch (LineUnavailableException e) e.printstacktrace(); System.exit(1); catch (Exception e) e.printstacktrace(); System.exit(1); Αναπαραγωγή Ήχου line.start(); int nbytesread = 0; byte[] abdata = new byte[external_buffer_size]; while (nbytesread!= -1) try nbytesread = audioinputstream.read(abdata, 0, abdata.length); catch (IOException e) e.printstacktrace(); if (nbytesread >= 0) int nbyteswritten = line.write(abdata, 0, nbytesread); 9
Αναπαραγωγή Ήχου line.drain(); line.close(); /* There is a bug in the jdk1.3/1.4. It prevents correct termination of the VM. So we have to exit ourselves. */ System.exit(0); private static void out(string strmessage) System.out.println(strMessage); 10