2013-05-26 2 views
2

Я хочу записать видео с веб-камеры и посмотреть, что я записываю на экране. Индивидуально, я могу либо увидеть его на экране, который берет веб-камеру, либо записывать видео, но не то, и другое. Когда я записываю, jpanel не обновляется. Он не сообщает об ошибках вообще. Как это исправить? Большое спасибо. Извините за мой английский.Записать и показать видео JMF

public class NewJFrame extends javax.swing.JFrame implements ActionListener { 

    private static boolean debugDeviceList = false; 
    private static String defaultVideoDeviceName = "Microsoft WDM Image Capture"; 
    private static String defaultAudioDeviceName = "DirectSoundCapture"; 
    private static String defaultVideoFormatString = "size=640x480, encoding=yuv, maxdatalength=614400"; 
    private static String defaultAudioFormatString = "linear, 48000.0 hz, 16-bit, stereo, signed"; 
    private Timer timer = new Timer(40, this); 
    private Player player; 

    public NewJFrame(){ 
     initComponents(); 


     MediaLocator videoMediaLocator = new MediaLocator("vfw://0"); 
     DataSource myDataSource = Manager.createDataSource(videoMediaLocator); 

     player = Manager.createPlayer(myDataSource); 
     player.start();          

     DataSource videoDataSource = myDataSource; 
     MediaLocator audioMediaLocator = new MediaLocator("dsound://"); 
     DataSource audioDataSource = null; 

     audioDataSource = Manager.createDataSource(audioMediaLocator); 

     DataSource dArray[] = new DataSource[2]; 
     dArray[0] = videoDataSource; 
     dArray[1] = audioDataSource; 
     DataSource mixedDataSource = null; 

     mixedDataSource = Manager.createMergingDataSource(dArray); 


     FileTypeDescriptor outputType = new FileTypeDescriptor(FileTypeDescriptor.MSVIDEO); 

     Format outputFormat[] = new Format[2]; 
     outputFormat[0] = new VideoFormat(VideoFormat.INDEO50); 
     outputFormat[1] = new AudioFormat(AudioFormat.GSM_MS); 

     processorModel = new ProcessorModel(mixedDataSource, outputFormat, outputType); 

     processor = Manager.createRealizedProcessor(processorModel); 

     source = processor.getDataOutput(); 

     dest = new MediaLocator("file:.\\testcam.avi"); 

     dataSink = null; 
     dataSinkListener = null; 
     dataSink = Manager.createDataSink(source, dest); 
     dataSinkListener = new MyDataSinkListener(); 
     dataSink.addDataSinkListener(dataSinkListener); 
     dataSink.open(); 
    }      

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {           

     timer.start(); 
     dataSink.start(); 
     processor.start(); 
    }           

    private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {           
     timer.stop(); 
     processor.stop(); 
     processor.close(); 

     dataSinkListener.waitEndOfStream(10); 
     dataSink.close(); 

     Stdout.log("[all done]"); 
    }           

    public static void main(String args[]) { 

     java.awt.EventQueue.invokeLater(new Runnable() { 

      public void run() { 
        new NewJFrame().setVisible(true); 
      } 
     }); 
    } 


    public BufferedImage grabFrameImage() { 
     Image image = null; 
     FrameGrabbingControl fGrabbingControl = null; 
     if (player != null) { 
      fGrabbingControl = (FrameGrabbingControl) player.getControl("javax.media.control.FrameGrabbingControl"); 
     } 
     javax.media.Buffer buffer = fGrabbingControl.grabFrame(); 
     if (buffer != null) { 
      image = new BufferToImage((VideoFormat) buffer.getFormat()).createImage(buffer); 
     } 
     if (image != null) { 
      return (BufferedImage) image; 
     } 
     return null; 
    } 
} 
+0

когда я пишу player.start(); до процессора = Manager.createRealizedProcessor (processorModel); запись видео, но jPanel не перерисовывает, это белое все время. когда я пишу player.start(); после процессора = Manager.createRealizedProcessor (processorModel); Я вижу, какую запись веб-камеры (jPanel repait), но когда я открываю avi-файл, он пуст. Plese помогите мне никому. Что я делаю неправильно? – user2366175

ответ

1

Попробуйте использовать исходный код jmapps jmstudio, хороший код для него. Речь идет о приемнике данных и дескрипторе файла.

Концепция: запись из источника с помощью устройства захвата, вам нужен снимок данных, а затем загрузка системы, сохранение в файл и загрузка игрока из файла.

Если вы не читаете файл в Player, он не работает в JMF. Был онлайн в течение 14,5 лет и никаких проблем с видео в прямом эфире JMF.

Смежные вопросы