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 |
|