Visualizzazione dei risultati da 1 a 6 su 6

Discussione: [J2ME] Video recording

  1. #1

    j2me and video recording

    Ciao a tutti,
    sto lavorando ad una applicazione midlet per dispositivi mobili su piattaforma j2me ed ho la necessità di avere il controllo del flusso di ripresa della videocamera.
    Spulciando le API della SUN e cercando su diversi forum ho trovato spesso le stesse proposte, ma niente di funzionante.
    L'oggetto in questione sarebbe RecordControl, riporto un po di codice trovato in giro

    public void recordVideo()
    {
    try
    {
    //Create a Player that captures live audio.
    //Player p = Manager.createPlayer("capture://audio");
    //p.realize();
    // Get the RecordControl, set the record stream,
    // start the Player and record for 5 seconds.
    rc = (RecordControl)player.getControl("RecordControl");
    output = new ByteArrayOutputStream();
    rc.setRecordStream(output);
    rc.startRecord();
    //player.start();
    Thread.currentThread().sleep(5000);
    //rc.commit();
    //player.close();
    }
    //catch (IOException ioe) {}
    //catch (MediaException me) {}
    catch (Exception ie) { }
    }

    public void stopRecord()
    {
    try
    {
    System.out.println("BUFFER OUTPUT:" + output.size());
    rc.commit();
    rc.stopRecord();
    }
    catch (Exception e){}
    }
    }
    Ho provato questo approccio su diverse configurazioni, sia sull'emulatore della SUN, che su alcuni cellulari (Nokia 6680, SonyEricsson K700i).
    Il problema è che la chiamata <rc = (RecordControl)player.getControl("RecordControl"); > restituisce sempre null nonostante il dispositivo supportasse la registrazione video (supports.video.capture)....


    ...chi mi aiuta?

    Grazie in anticipo.

  2. #2
    Utente di HTML.it
    Registrato dal
    Feb 2004
    Messaggi
    724
    codice:
    capture://audio
    qui hai messo audio, però poi parli di video. cosa vuoi fare?? vuoi far girare l'appl sul cell e registrare il flusso della fotocamera in modalità video???

  3. #3
    Ovviamente si tratta di un errore di CTRL+C CTRL+V
    La stringa doveva essere capture://video

    Per il resto, quello che mi serve è poter gestire quel flusso, magari come flusso di byte da associare ad un ByteArrayOutputStream, ma per ora mi accontenterei di non vedere più null in fase di debug quando controllo il valore di rc dopo l'istruzione incriminata

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2004
    Messaggi
    724
    mi pare di capire che tu stia usando JMF, ti consiglio di spulciare il manuale perchè è un po difficile da usare soprattutto se non si sa dove mettere le mani...
    La prima cosa che ti consiglio è di usare un processor al posto di un player perchè è più configurabile.
    Poi con questo codice vedi tutti i dispositivi di cattura disponibili
    codice:
    import java.io.*;
    import java.util.Vector;
    import javax.media.*;
    import javax.media.format.*;
    
    
    public class Devicew {
    
    public static void main(String [] args) {
    
    Vector devices = CaptureDeviceManager.getDeviceList(null);
    
    System.out.println("Number of capture devices: " + devices.size());
    for (int n = 0; n < devices.size(); n++) {
    CaptureDeviceInfo info = (CaptureDeviceInfo) devices.elementAt(n);
    System.out.println("we found something" + n);
    System.out.println(info.toString());
    }
    }
    }
    e questo esempio ti mostra come creare il processor per acquisire il video dal dispositio di acquisizione
    codice:
    import javax.media.*;
    import javax.media.util.*;
    import javax.media.format.*;
    import javax.swing.*;
    import javax.swing.event.*;
    import java.awt.*;
    import java.awt.event.*;
    import javax.media.control.*;
    
    class testing extends JFrame implements ControllerListener,ActionListener
    {
    //Variables for gui
    public JButton play=new JButton("Play");
    public JButton stop=new JButton("Stop");
    public JPanel p1=new JPanel();
    public JPanel p2=new JPanel();
    Container c;
    //Variables for videocapturing
    boolean stateTransitionOK = true;
    Object waitSync = new Object();
    Processor p;
    
    ///Variables required to store the movie
    DataSink sink;
    MediaLocator dest = new MediaLocator("save_video.wav");
    ///methods
    public testing()
    {
    super("Video Capture Demo");
    setupvideocapture();
    setupgui();
    }
    
    public void setupgui()
    {
    c.add(play);
    c.add(stop);
    addWindowListener(new WindowHandler());
    stop.addActionListener(this);
    play.addActionListener(this);
    setSize(350,350);
    setVisible(true);
    show();
    }
    
    public void actionPerformed(ActionEvent ae)
    {
    String str;
    str=ae.getActionCommand();
    if(str=="Play")
    {
    try
    {
    //Before starting capturing store the movie to the HDD
    p.start();
    sink = Manager.createDataSink(p.getDataOutput(), dest); 
    sink.open();
    sink.start();
    }
    catch(Exception e)
    {
    
    }
    }
    else if(str=="Stop")
    { 
    try
    {
    // sink.stop();
    p.stop();
    }
    catch(Exception e)
    {
    }
    }
    }
    
    public void setupvideocapture()
    {
    c=getContentPane();
    c.setLayout(new FlowLayout());
    try
    {
    p = Manager.createProcessor(new MediaLocator("vfw://0"));
    p.addControllerListener(this);
    p.configure();
    waitForState(p.Configured);
    p.setContentDescriptor(null);
    p.prefetch();
    waitForState(p.Prefetched);
    c.add(p.getVisualComponent());
    
    ///Intializing the saving procedure
    }
    catch(Exception e)
    {
    System.out.println(e);
    }
    }
    public void controllerUpdate(ControllerEvent evt)
    {
    if (evt instanceof ConfigureCompleteEvent || evt instanceof RealizeCompleteEvent || evt instanceof PrefetchCompleteEvent)
    {
    synchronized (waitSync)
    {
    stateTransitionOK = true;
    waitSync.notifyAll();
    }
    }
    else if (evt instanceof ResourceUnavailableEvent)
    {
    synchronized (waitSync)
    {
    System.out.println("ResourceUnavailable");
    stateTransitionOK = false;
    waitSync.notifyAll();
    }
    }
    else if (evt instanceof EndOfMediaEvent)
    {
    p.close();
    System.exit(0);
    }
    }
    
    boolean waitForState(int state)
    {
    synchronized (waitSync)
    {
    try
    {
    while (p.getState() != state && stateTransitionOK)
    waitSync.wait();
    }
    catch (Exception e) {}
    }
    return stateTransitionOK;
    }
    
    //Entry point
    public static void main(String args[])
    {
    testing t=new testing();
    }
    }
    
    class WindowHandler extends WindowAdapter
    {
    public void windowClosing(WindowEvent e)
    {
    System.exit(0);
    }
    }

  5. #5
    Purtroppo non posso lavorare con JMF in quanto la mia applicazione avrebbe la piccola pretesa di dover girare su un cellulare... dunque ho a disposizione soltanto le librerie della micro edition (J2ME)

  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2004
    Messaggi
    724
    magari è già incluso perchè il codice che hai postato sembra proprio che abbia come base JMF... Se così nn fosse me ne tiro fuori... Ciao

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.