Thursday, July 26, 2012

VC++: Capture camera using DirectShow note (AMCAP)


See my SkyDrive email from Noël Danjou & SkyDrive folder (Works/Sources)

Add below (or similar) to Tools/Options.../Projects and Sosutions/VC++ Directories/

- Win32/Include files:
C:\Program Files\Microsoft SDKs\Windows\v7.1\Samples\multimedia\directshow\baseclasses
C:\Program Files\Microsoft SDKs\Windows\v7.1\Samples\multimedia\directshow\common
C:\Program Files\Microsoft SDKs\Windows\v7.1\Include

Build this project in both Debug & Release mode (C:\Program Files\Microsoft SDKs\Windows\v7.1\Samples\multimedia\directshow\baseclasses\baseclasses.sln) before adding to Win32/Libraty files
- Win32/Libraty files:
C:\Program Files\Microsoft SDKs\Windows\v7.1\Samples\multimedia\directshow\baseclasses\Debug

Refer to HowToInstall.txt

Thursday, July 19, 2012

Java: VLCJ full screen playback


1. Links
http://forum.videolan.org/viewtopic.php?f=32&t=85597




2. Code

import uk.co.caprica.vlcj.player.embedded.DefaultFullScreenStrategy;
...

    public VlcjMediaHandler(JPanel panel) {
        params = new VlcParamsBuilder();
        statusProperty = new SimpleObjectProperty<PlayState>(PlayState.STOPPED);
    JFrame f = new JFrame();
    f.setContentPane(panel);
//    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.setSize(800, 600);
        factory = new MediaPlayerFactory("--no-video-title-show");
//        mediaPlayer = factory.newEmbeddedMediaPlayer();
        mediaPlayer = factory.newEmbeddedMediaPlayer(new DefaultFullScreenStrategy(f));
            f.setVisible(true);
            mediaPlayer.setFullScreen(true);
    }
   
  /*  public static synchronized VlcjMediaHandler getSingletonVlcjMedia() {
        if (vlcjMedia == null) {
            vlcjMedia = new VlcjMediaHandler();
    }
    return vlcjMedia;
    }
    */






public class Controls extends JPanel{

    VlcjMediaHandler media = new VlcjMediaHandler(this);

.....
}

Tuesday, July 17, 2012

Good for Theora

Good for Theora
    public String[] buildWithoutPreview() {
        List<String> params = new ArrayList<String>();       
        params.add(":dshow-adev=none");
        params.add(String.format(":dshow-vdev=%s", getDeviceName()));
        params.add(String.format(":dshow-aspect-ratio=%s", getAspectRatio()));
        params.add(":live-caching=300");
        if(width > 0 && height > 0)
            params.add(String.format(":dshow-size=%dx%d", width, height));
/*        StringBuilder chain = new StringBuilder(":sout=#");
        chain.append("duplicate{dst='")
             .append(buildTranscodeParams())
             .append("'}");
        params.add(chain.toString());     
*/
//params.add(String.format(":sout=#transcode{vcodec=h264,vb=1024,fps=15,scale=0,width=%d,height=%d}", width, height));
//params.add(String.format(":std{access=file,mux=mp4,dst='C:\\test.mp4'}"));
        params.add(String.format(":sout=#transcode{vcodec=theo,vb=1024,fps=15,scale=0,width=%d,height=%d}:std{access=file,mux=ogg,dst='C:\\testTheo.mp4'}", width, height));
//        params.add(String.format(":sout=#transcode{vcodec=h264,vb=1024,fps=15,scale=0,width=%d,height=%d}:std{access=file,mux=mp4,dst='C:\\test.mp4'}", width, height));
        String[] result = params.toArray(new String[params.size()]);
        logger.log(Level.INFO, Arrays.toString(result));

//        params.add(String.format(":sout=#transcode{vcodec=h264,vb=512,fps=%d,scale=0,width=%d,height=%d,acodec=mpga,ab=128,channels=2,samplerate=44100}:std{access=file,mux=mp4,dst='C:\\test.mp4'}", getFramerate(), width, height));
//        String[] result = {"sout=#transcode{vcodec=h264,vb=1024,fps=15,scale=0,width=1280,height=720,acodec=mpga,ab=128,channels=2,samplerate=44100}:std{access=file,mux=mp4,dst='C:\\test.mp4'}"};
        return result;
    }

Thursday, July 12, 2012

Java: Safe javafx code in swing application



Example

        media.statusProperty().addListener(new javafx.beans.value.ChangeListener<PlayState>(){

            @Override
            public void changed(ObservableValue<? extends PlayState> ov, PlayState oldValue, final PlayState newValue) {
                SwingUtilities.invokeLater(new Runnable() {
                    public void run() {
                        if(newValue == PlayState.STOPPED)
                            cameraConfig.setEnableControls(true);
                        else
                            cameraConfig.setEnableControls(false);

                        switch(newValue) {
                            case PLAYING:
                                playButton.setIcon(iconPause);
                                stopButton.setEnabled(true);
                                playButton.setEnabled(true);
                                recordButton.setEnabled(false);
                                slider.setEnabled(true);
                                previewCheckBox.setEnabled(false);
                                previewCheckBox.setSelected(false);
                                break;
                            case RECORDING:
                                playButton.setIcon(iconPlay);
                                stopButton.setEnabled(true);
                                playButton.setEnabled(false);
                                recordButton.setEnabled(false);
                                slider.setEnabled(false);
                                previewCheckBox.setEnabled(false);
                                break;
                            case PAUSED:
                                playButton.setIcon(iconPlay);
                                stopButton.setEnabled(true);
                                playButton.setEnabled(true);
                                recordButton.setEnabled(false);
                                slider.setEnabled(true);
                                break;
                            case STOPPED:
                                resetControls();
                                break;
                            default:    // should never happened
                                break;
                        }
                    }
                });
            }
           
        });



Wednesday, July 4, 2012

Java: Javafx tracking variable status using addListener

    public enum PlayState {
        STOPPED, PAUSED, PLAYING, RECORDING, PREVIEWING
    };
...

    private final ObjectProperty<PlayState> statusProperty;
...
    public ObjectProperty<PlayState> statusProperty() {
        return statusProperty;
    }
...



        media.statusProperty().addListener(new javafx.beans.value.ChangeListener<PlayState>(){

            @Override
            public void changed(ObservableValue<? extends PlayState> ov, PlayState oldValue, PlayState newValue) {
                switch(newValue) {
                    case PLAYING:
                        playButton.setIcon(iconPause);
                        stopButton.setEnabled(true);
                        playButton.setEnabled(true);
                        recordButton.setEnabled(false);
                        slider.setEnabled(true);
                        previewCheckBox.setEnabled(false);
                        previewCheckBox.setSelected(false);
                        break;
                    case RECORDING:
                        playButton.setIcon(iconPlay);
                        stopButton.setEnabled(true);
                        playButton.setEnabled(false);
                        recordButton.setEnabled(false);
                        slider.setEnabled(false);
                        previewCheckBox.setEnabled(false);
                        break;
                    case PAUSED:
                        playButton.setIcon(iconPlay);
                        stopButton.setEnabled(true);
                        playButton.setEnabled(true);
                        recordButton.setEnabled(false);
                        slider.setEnabled(true);
                        break;
                    case STOPPED:
                        playButton.setIcon(iconPlay);
                        stopButton.setEnabled(false);
                        playButton.setEnabled(true);
                        recordButton.setEnabled(true);
                        slider.setEnabled(false);
                        slider.setValue(0);
                        previewCheckBox.setEnabled(true);
                        lStartRecordTime = -1;
                        break;
                    default:    // should never happened
                        break;
                }

            }
           
        });

Java: Recording screen using VLCJ lib



Recording screen

    private void doRecordScreen() {
        mediaPlayer.prepareMedia("screen://", " :screen-fps=10.000000 :live-caching=300");
        mediaPlayer.play();
        statusProperty.set(PlayState.PREVIEWING);
    }



Monday, July 2, 2012

Java: Add icon to a JPanel



Using a JLabel as a container

    private Icon iconMcLogo = new ImageIcon(getClass().getResource("control/mclogo.png"));
    private final JLabel lbMcLogo = new JLabel("    ");

Constructor:
        lbMcLogo.setIcon(iconMcLogo);
        panel.add(lbMcLogo);


Something more than that

 package com.marinecyb.arch.nbm.videograbber;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.*;

public class CameraConfig extends JPanel{

    private Icon iconMcLogo = new ImageIcon(getClass().getResource("control/mclogo.png"));
    private final JLabel lbMcLogo = new JLabel("    ");

    private final JLabel lbFps = new JLabel("FPS");
    private final JLabel lbCameraSize = new JLabel("Size");
    private final JComboBox cbCameras = new JComboBox();
    private final JComboBox cbFps = new JComboBox();
    private final JComboBox cbCameraSize = new JComboBox();
    private final JButton btRefreshCameras = new JButton("Refresh");
    private final JButton btAdvancedProperties = new JButton("Advanced Properties");
    private String sSelectedCamera = "";
    private static String[] cameraList;
    private static String[] fpsList = {"25", "30"};
    private static String[] sizeListMS = {"640x480", "800x600", "1024x768", "1280x720"};
    private static String[] sizeListHP = {"640x480", "800x600", "1024x768", "1280x720"};
    private static String[] sizeListStandard = {"640x480", "800x600", "1024x768"};

    public CameraConfig(){
        super();

        lbMcLogo.setIcon(iconMcLogo);
        updateCameras();
        initFps();
        updateSize();

        btRefreshCameras.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                updateCameras();
            }
        });

        cbCameras.addItemListener(new ItemListener() {

            @Override
            public void itemStateChanged(ItemEvent e) {
                sSelectedCamera = (String)cbCameras.getSelectedItem();
                if(sSelectedCamera != null){
                    MediaProperties.setCameraName((String)cbCameras.getSelectedItem());
                }
            }
        });

        cbFps.addItemListener(new ItemListener() {

            @Override
            public void itemStateChanged(ItemEvent e) {
                MediaProperties.setFrameRate(Integer.parseInt((String)(String)cbFps.getSelectedItem()));
            }
        });

        cbCameraSize.addItemListener(new ItemListener() {

            @Override
            public void itemStateChanged(ItemEvent e) {
                MediaProperties.setImageSize((String)cbCameraSize.getSelectedItem());
            }
        });

        btAdvancedProperties.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                new CameraInfoProvider().showAdvancedProperties(MediaProperties.getCameraIndex());
            }
        });

        addControls();
    }

    private void updateCameras(){
        cameraList = new CameraInfoProvider().getConnectedCameras();
        cbCameras.removeAllItems();
        String sCameraName = MediaProperties.getCameraName();
        int iFound = -1;
        for(int i = 0; i < cameraList.length; i++){
            cbCameras.addItem(cameraList[i]);
           
            if(sCameraName != null && sCameraName.contains(cameraList[i]))
                iFound = i;
        }

        if(iFound >= 0)
            cbCameras.setSelectedItem(MediaProperties.getCameraName());
        else{
            cbCameras.setSelectedIndex(0);
            MediaProperties.setCameraName((String)cbCameras.getSelectedItem());
        }

        sSelectedCamera = (String)cbCameras.getSelectedItem();
    }

    private void initFps(){
        int iFps = MediaProperties.getFrameRate();
        for(int i = 0; i < fpsList.length; i++){
            cbFps.addItem(fpsList[i]);
            if(iFps == Integer.parseInt(fpsList[i]))
                cbFps.setSelectedIndex(i);
        }
    }

    private void updateSize(){
        int localWidth = MediaProperties.getImageWidth();
        int localHeight = MediaProperties.getImageHeight();
        String localSize = String.valueOf(localWidth) + "x" + String.valueOf(localHeight);

        if(cbCameraSize != null)
            cbCameraSize.removeAllItems();
        if(sSelectedCamera == null){
            return;
        }
        if (sSelectedCamera.contains("Microsoft")){
            for(int i = 0; i < sizeListMS.length; i++)
                cbCameraSize.addItem(sizeListMS[i]);
        }
        else if (sSelectedCamera.contains("HP")){
            for(int i = 0; i < sizeListHP.length; i++)
                cbCameraSize.addItem(sizeListHP[i]);
        }
        else{
            for(int i = 0; i < sizeListStandard.length; i++)
                cbCameraSize.addItem(sizeListStandard[i]);
        }

        cbCameraSize.setSelectedItem(localSize);
    }

    public void addControls(){
        this.add(lbMcLogo);
        this.add(btRefreshCameras);
        this.add(cbCameras);
        this.add(lbFps);
        this.add(cbFps);
        this.add(lbCameraSize);
        this.add(cbCameraSize);
        this.add(btAdvancedProperties);
    }

    public void toggle(){
        this.setVisible(!this.isVisible());
    }
}