Captura datelor în Java Media Framework
Începând cu versiunea 2.0, JMF ofera programatorilor posibilitatea de a achizitiona date de la un dispozitiv de captura, cum ar fi un microfon sau o camera video. Aceasta operatie poarta numele de capturare. Datele capturate pot fi capturate si afisate sau pot fi stocate pentru o utilizare ulterioara.
Pentru a captura date trebuie:
525j94f ; 525j94f ; localizat dispozitivul de captura prin interogarea CaptureDeviceManager;
525j94f ; 525j94f ; creat un obiect CaptureDeviceInfo pentru acel dispozitiv
525j94f ; 525j94f ; creat un MediaLocator pentru obiectul CaptureDeviceInfo si folosit la crearea unei DataSource;
525j94f ; 525j94f ; creat un Player sau Processor folosind acest DataSource;
525j94f ; 525j94f ; pornit Player-ul sau Processor-ul pentru a începe procesul de captura
Când se foloseste o DataSource cu un Player, datele capturate pot fi doar afisate. Pentru a procesa si stoca datele trebuie folosita o DataSource în combinatie cu un Processor
8.6.1. Accesarea dispozitivelor de captura
Dispozitivele de captura sunt accesibile prin intermediul CaptureDeviceManager. Acesta este registrul central pentru toate dispozitivele de captura disponibile în JMF. Pentru a obtine o lista cu dispozitivele de captura disponibile trebuie apelata metoda CaptureDeviceManager.getDeviceList.
Fiecare dispozitiv de captura este reprezentat ca un obiect CaptureDeviceInfo. Pentru a obtine acest obiect pentru un anumit dispozitiv trebuie apelata metoda CaptureDeviceManager.getDevice astfel:
Exemplul 8.9. Obtinerea informatiei despre dispozitivul de captura |
CaptureDeviceInfo deviceInfo = CaptureDeviceManager.getDevice("devName"); |
8.6.2. Captura efectiva a datelor
Pentru a captura date de la un anumit dispozitiv de captura, trebuie obtinut MediaLocator din obiectul CaptureDeviceInfo al acelui dispozitiv. Exista posibilitatea de a folosi acest MediaLocator pentru a construi un Player sau Processor direct sau de a-l folosi pentru a construi o DataSource care sa fie folosita ca intrare într-un Player sau Processor. Pentru a initia procesul de captura trebuie pornit Player-ul sau Processor-ul.
8.6.3. Controlul utilizatorului asupra procesului de captura
În general un dispozitiv de captura are implementat un set de atribute specifice care pot fi folosite pentru a controla acel dispozitiv. Pentru a permite controlul utilizatorului asupra acestor setari, în JMF se folosesc doua tipuri de control: PortControl si MonitorControl. Accesarea acestor controale se realizeaza prin apelarea metodei getControl asupra DataSource-ului având ca parametru atributul care dorim sa îl modificam.
Un PortControl ofera posibilitatea selectarii portului de unde datele vor fi capturate.
Un MonitorControl ofera posibilitatea monitorizarii procesului de captura
Ca si alte obiecte de tip Control, daca exita o componenta vizuala care corespunde lui PortControl sau MonitorControl, aceasta poate fi obtinuta prin apelarea getControlComponent. Adaugarea acestei componente ferestrei applet-ului sau ferestrei aplicatiei ofera utilizatorului posibilitatea controlului capturii.
Este posibila afisarea panoului standard de control si a componentelor vizuale asociate cu un Player sau cu un Processor. Exemplul 8.10 ilustreaza cum se realizeaza afisarea componentelor GUI (Graphic User Interface) pentru un Processor.
Exemplul 8.10. Afisarea componentelor GUI pentru un Processor |
Component controlPanel, visualComponent; if ((controlPanel = p.getControlPanelComponent()) != null) add(controlPanel); if ((visualComponent=p.getVisualComponent())!=null) add(visualComponent); |
8.6.4. Stocarea datelor capturate
Pentru a salva datele capturate într-un fisier trebuie folosit un Processor în locul unui Player. Se foloseste un DataSink pentru citirea datelor la iesirea din Processor si pentru a le salva într-un fisier. Pasii ce trebuie urmati sunt:
525j94f ; 525j94f ; se citesc datele de la iesirea Processor-ului prin apelarea getDataOutput;
525j94f ; 525j94f ; se construieste un DataSink pentru scrierea în fisier prin apelarea Manager.createDataSink. Parametrii sunt DataSource-ul de iesire si un MediaLocator care specifica locatia fisierului în care se doreste salvarea;
525j94f ; 525j94f ; se apeleaza metoda open asupra DataSink-ului pentru a deschide fisierul;
525j94f ; 525j94f ; se apeleaza metoda start asupra DataSink-ului;
525j94f ; 525j94f ; se apeleaza metoda start asupra Processor-ului pentru a începe captura datelor;
525j94f ; 525j94f ; se asteapta pentru un eveniment EndOfMediaEvent, un anumit timp sau interventia utilizatorului;
525j94f ; 525j94f ; se apeleaza metoda stop asupra Processor-ului pentru a termina captura datelor;
525j94f ; 525j94f ; se apeleaza metoda close asupra Processor-ului;
525j94f ; 525j94f ; când Processor-ul este oprit si DataSink-ul posteaza un eveniment EndOfStreamEvent trebuie apelata metoda close asupra DataSink-ului.
Exemplul 8.11 arata cum se realizeaza toate aceste operatii necesare pentru salvarea datelor capturate într-un fisier
Exemplul 8.11. Salvarea datelor capturate într-un fisier |
DataSink sink; MediaLocator dest = new MediaLocator("file://exemplul10.avi"); try catch (Exception) |
8.6.5. Exemplu de captura si salvare a datelor audio si video
În cele ce urmeaza voi prezenta un exemplu în care un ProcessorModel pentru a crea un Processor pentru a captura date audio si video, pentru a coda datele IMA4 (pentru audio) si Cinepak (pentru video), pentru a intercala pistele si pentru a salva pista rezultata în urma intercalarii într-un fisier QuickTime.
Când se construieste un ProcessorModel prin specificarea formatului pistelor si a continutului iesirii iar apoi se foloseste acel model la construirea unui Player, Processor-ul este conectat automat la dispozitivul de captura care îndeplineste necesitatile formatului (daca exista unul).
Exemplul 8.12. Captura si salvarea datelor audio si video |
formats[0] = new AudioFormat(AudioFormat.IMA4); formats[1] = new VideoFormat(VideoFormat.CINEPAK); FileTypeDescriptor outputType = new FileTypeDescriptor(FileTypeDescriptor.QUICKTIME); Processor p = null; try catch (IOException e) catch (NoProcessorException e) catch (CannotRealizeException e) // citeste de la iesirea Processor-ului DataSource source = p.getDataOutput(); // creaza un MediaLocator cu locatia fisierului unde se doreste salvarea bitilor MediaLocator dest = new MediaLocator("file://test.mov"); //creaza un DataSink care sa realizeze deschiderea fisierului DataSink filewriter = null; try catch (NoDataSinkException e) catch (IOException e) catch (SecurityException e) // porneste FileWriter si Processor-ul try catch (IOException e) p.start //opreste si inchide Processor-ul cand se termina captura // inchide DataSink-ul cand apare evenimentul EndOfStream |
|