Web カメラから写真を撮るための Java アプレット (NetBeans 7.4 で開発され、JMF を使用) があり、起動時に (JMF を使用して) Web カメラを自動的に初期化します...
(アプレット)
実行するには、次のように JAR ファイルの同じディレクトリ内に jmf.properties ファイルを追加する必要があります。
WebBrowser からスナップショットを取得するために HTML ページ内にこのコンポーネントを表示しようとしましたが、JMF はそこで動作しません。実行するたびに、次のメッセージが表示されます (WebCam を JMF で初期化しようとしています)。
次に、アプレットを表示するだけです
これは私の HTML コードです (Netbeans によって生成されます)
<HTML>
<HEAD>
<TITLE>Applet HTML Page</TITLE>
</HEAD>
<BODY>
<!--
*** GENERATED applet HTML launcher - DO NOT EDIT IN 'BUILD' FOLDER ***
If you need to modify this HTML launcher file (e.g., to add applet parameters),
copy it to where your applet class is found in the SRC folder. If you do this,
the IDE will use it when you run or debug the applet.
Tip: To exclude an HTML launcher from the JAR file, use exclusion filters in
the Packaging page in the Project Properties dialog.
For more information see the online help.
-->
<H3><HR WIDTH="100%">Applet HTML Page<HR WIDTH="100%"></H3>
<P>
<APPLET codebase="classes" code="com/xxx/pantallas/CamaraApplet.class" width=350 height=200></APPLET>
</P>
<HR WIDTH="100%"><FONT SIZE=-1><I>Generated by NetBeans IDE</I></FONT>
</BODY>
</HTML>
HTMLを開いたディレクトリ
HTMLからwebCamを実行するための助けもいただければ幸いです
要件:
- JDK 32Bit版をインストール済み
- JMF をインストール済み:ダウンロード ページへのリンク
- プロジェクト全体: ダウンロード ページへのリンク
- **必要なライブラリ***** :ダウンロード ページへのリンク
*** プロジェクトで JMF を使用するにはライブラリが必要です
このプロジェクトを実行するには、次を使用します。
- 2クラス
- 1 アプレット (メイン)
- 1 つの HTML ファイル
CameraApplet.java (アプレット)
import java.lang.reflect.InvocationTargetException;
import javax.media.Player;
import javax.swing.JPanel;
import static com.sun.java.accessibility.util.AWTEventMonitor.addWindowListener;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class CameraApplet extends javax.swing.JApplet {
private Player p1;
public Player getPlayer() {return p1;}
public void setPlayer(Player pin) {p1 = pin;}
public JPanel getCamera() {return panelCam;}
private void initComponents2() {
//Register all the listeners of the Events
AuxClass e = new AuxClass(this);
addWindowListener(e);
jmCArchivo.addActionListener(e);
//Loads in menu all detected devices
AuxClass.DevicesMenuApplet(this, jmDispositivos);
//applet size
setSize(680, 840);
//Autostarts camera
AuxClass.setCameraApplet(CameraApplet.this,
AuxClass.detectAvailableWebCameras().get(0),
0);
}
@Override
public void init() {
//Establecer los valores de look and feel del applet
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}
catch(ClassNotFoundException | IllegalAccessException | InstantiationException | UnsupportedLookAndFeelException e){
AuxClass.showErrorMessage(null, "Ocurrio un error: " + e.toString());
}
/* crea y muestra el applet */
try {
java.awt.EventQueue.invokeAndWait(new Runnable() {
public void run() {
initComponents();
initComponents2();
}
});
}
catch (InterruptedException | InvocationTargetException e){
AuxClass.showErrorMessage(null, "Ocurrio un error: " + e.toString());
}
}
/**
* This method is called from within the init() method to initialize the
* form. WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
panelCam = new javax.swing.JPanel();
jMenuBar1 = new javax.swing.JMenuBar();
jmCapturar = new javax.swing.JMenu();
jmCArchivo = new javax.swing.JMenuItem();
jmDispositivos = new javax.swing.JMenu();
setPreferredSize(new java.awt.Dimension(640, 480));
panelCam.setBorder(javax.swing.BorderFactory.createTitledBorder("Camara Web"));
panelCam.setPreferredSize(new java.awt.Dimension(640, 480));
panelCam.setLayout(new java.awt.BorderLayout());
jmCapturar.setText("Capturar");
jmCArchivo.setText("En Archivo");
jmCapturar.add(jmCArchivo);
jMenuBar1.add(jmCapturar);
jmDispositivos.setText("Dispositivos");
jMenuBar1.add(jmDispositivos);
setJMenuBar(jMenuBar1);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(panelCam, javax.swing.GroupLayout.DEFAULT_SIZE, 442, Short.MAX_VALUE)
.addContainerGap())
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
.addContainerGap()
.addComponent(panelCam, javax.swing.GroupLayout.DEFAULT_SIZE, 358, Short.MAX_VALUE)
.addContainerGap())
);
}// </editor-fold>
// Variables declaration - do not modify
private javax.swing.JMenuBar jMenuBar1;
private javax.swing.JMenuItem jmCArchivo;
private javax.swing.JMenu jmCapturar;
private javax.swing.JMenu jmDispositivos;
private javax.swing.JPanel panelCam;
// End of variables declaration
}
AuxClass.java
import java.awt.Component;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.awt.image.RenderedImage;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.imageio.ImageIO;
import javax.media.Buffer;
import javax.media.CannotRealizeException;
import javax.media.CaptureDeviceInfo;
import javax.media.Format;
import javax.media.Manager;
import javax.media.MediaLocator;
import javax.media.NoPlayerException;
import javax.media.Player;
import javax.media.cdm.CaptureDeviceManager;
import javax.media.control.FormatControl;
import javax.media.control.FrameGrabbingControl;
import javax.media.format.RGBFormat;
import javax.media.format.VideoFormat;
import javax.media.format.YUVFormat;
import javax.media.util.BufferToImage;
import javax.swing.JFileChooser;
import javax.swing.JMenu;
import javax.swing.JOptionPane;
public class AuxClass implements WindowListener,ActionListener{
private final CameraApplet padreApplet;
public AuxClass(CameraApplet padreApplet){this.padreApplet = padreApplet;}
//Menu Actions
@Override
public void actionPerformed(ActionEvent e) {
if(e.getActionCommand().equals("En Archivo")){
AuxClass.saveImageFile(AuxClass.capturePhoto(padreApplet.getPlayer()),
AuxClass.SaveFileAsDialog(padreApplet));
}
}
@Override
public void windowClosing(WindowEvent e) {AuxClass.stopPlayer(padreApplet.getPlayer());}
@Override
public void windowOpened(WindowEvent e) {
}
@Override
public void windowClosed(WindowEvent e) {
}
@Override
public void windowIconified(WindowEvent e) {
}
@Override
public void windowDeiconified(WindowEvent e) {
}
@Override
public void windowActivated(WindowEvent e) {
}
@Override
public void windowDeactivated(WindowEvent e) {
}
//This method handles the Saving image file as. Jpg
public static File SaveFileAsDialog(Component padre){
JFileChooser f;
File imageFile = null;
String imagePath = "";
f = new JFileChooser();
f.setDialogTitle("Save File As...");
f.showSaveDialog(padre);
if(f.getSelectedFile() != null){
imagePath = f.getSelectedFile().getAbsolutePath();
if (imagePath.lastIndexOf(".") > 0)
imagePath = imagePath.substring(0,imagePath.lastIndexOf("."));
imagePath = imagePath + ".jpg";
imageFile = new File(imagePath);
}
return imageFile;
}
public static void showErrorMessage(Component padre,String mensaje){
JOptionPane.showMessageDialog(padre,mensaje,"Captura Camara Web ",JOptionPane.ERROR_MESSAGE);
}
//This is the link between camera and the player class first time you turn the camera on
public static void setCameraApplet(CameraApplet camera,String device,int format){
Player player = AuxClass.createPlayer(device, format);
camera.setPlayer(player);
AuxClass.startPlayer(player);
camera.getCamera().add(player.getVisualComponent());
}
//----------------------------------------Player methods----------------------------------------
public static void startPlayer(Player p){
if(p!=null) p.start();
}
public static void stopPlayer(Player p){
if(p!=null){
p.stop();
p.deallocate();
p.close();
}
}
public static Image capturePhoto(Player p){
Image img = null;
if(p != null){
FrameGrabbingControl fgc = (FrameGrabbingControl)p.getControl("javax.media.control.FrameGrabbingControl");
Buffer buf = fgc.grabFrame();
BufferToImage btoi = new BufferToImage((VideoFormat)buf.getFormat());
img = btoi.createImage(buf);
}
else{
AuxClass.showErrorMessage(null, "¡Player has not started yet!");
}
return img;
}
public static void saveImageFile(Image img,File imagenArch){
String format = "JPG";
try {
if(img !=null && imagenArch!=null)
ImageIO.write((RenderedImage) img, format , imagenArch);
}
catch (IOException e) {
AuxClass.showErrorMessage(null, "Disk write error: " + e.toString());
}
}
//JDevices methods
//returns webCam's name selected
public static CaptureDeviceInfo returnDevice(String name){
return CaptureDeviceManager.getDevice(name);
}
//open webCamera selected
public static MediaLocator openDevice(CaptureDeviceInfo cdi){
return cdi.getLocator();
}
//Crea un Player a partir del nombre del dispositivo y del indice del formáto que se desea aplicar
public static Player createPlayer(String device,int f){
Player p = null;
try {
p = Manager.createRealizedPlayer(openDevice(returnDevice(device)));
Format []formats;
formats = getFormats(device);
FormatControl formatControl = (FormatControl)p.getControl("javax.media.control.FormatControl");
formatControl.setFormat (formats[f]);
}
catch (CannotRealizeException | IOException | NoPlayerException e) {
AuxClass.showErrorMessage(null, "Input-Output Error: \n" + e.toString());
}
return p;
}
//Returns available formats, passing device's name
public static Format[] getFormats(String name){
CaptureDeviceInfo cdi1 = returnDevice(name);
Format []formats = cdi1.getFormats();
return formats;
}
//Switches player's resolutions
public static void changeResolution(Player p,String device,int format){
if(p != null) p.stop();
Format []formats = getFormats(device);
FormatControl formatControl = (FormatControl)p.getControl("javax.media.control.FormatControl");
formatControl.setFormat (formats[format]);
p.start();
}
//Loads all the cameras detected and its actions within a JMenu object
public static void DevicesMenuApplet(CameraApplet camera, JMenu devices){
List<String> cameraList = detectAvailableWebCameras();
Format[] formatsArray;
for(int j= 0; j< cameraList.size(); j++){
JMenu menuFormato = new JMenu(cameraList.get(j));
JMenuFormato cameraRes = null;
CaptureDeviceInfo dev = CaptureDeviceManager.getDevice(cameraList.get(j));
formatsArray = dev.getFormats();
//get the formats/resolutions availables:
for(int i = 0; i < formatsArray.length; i++){
if(formatsArray[i].getEncoding().compareTo("yuv") == 0){
//this returns a menu element with label of the resolution and its actionlistener
cameraRes = new JMenuFormato(cameraList.get(j),
formatsArray[i].getEncoding()+" "+
((YUVFormat)formatsArray[i]).getSize().width + "x" +
((YUVFormat)formatsArray[i]).getSize().height,
i,
((YUVFormat)formatsArray[i]).getSize().width ,
((YUVFormat)formatsArray[i]).getSize().height ,
camera,
camera.getCamera());
}
else
if(formatsArray[i].getEncoding().compareTo("rgb") == 0){
cameraRes = new JMenuFormato(cameraList.get(j),
formatsArray[i].getEncoding()+" "+
((RGBFormat)formatsArray[i]).getSize().width+"x"+
((RGBFormat)formatsArray[i]).getSize().height,
i,
((RGBFormat)formatsArray[i]).getSize().width,
((RGBFormat)formatsArray[i]).getSize().height,
camera,
camera.getCamera());
}
menuFormato.add(cameraRes);//Adds the menu to JMenu list
}
devices.add(menuFormato);
}
}
//Detects all the camera devices detected inside a List
public static List<String> detectAvailableWebCameras(){
//make a reference to a JMF function for obtaining the devices
List<String> deviceList = CaptureDeviceManager.getDeviceList(null);
List<String> cameraList = new ArrayList<>();
Iterator it = deviceList.iterator();
String name = ""; //Stores all the names of the devices
while (it.hasNext()){ //Makes a cycle for listing all stored devices
CaptureDeviceInfo cdi = (CaptureDeviceInfo)it.next(); //Get device info
name = cdi.getName(); //Get detected device's name
//Filter only camera devices
if(name.indexOf("Image") != -1){cameraList.add(name);}
}
return cameraList;
}
}
JMenuFormat.java
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
//this class implements logic for obtaining menus and resolutions JFrame
public class JMenuFormato extends JMenuItem implements ActionListener{
private final int width;
private final int high;
private final int ordinal;
private final JPanel modifiable;
private final String device;
private final CameraApplet cameraApplet;
//Constructores (Version Applet y version JFrame)
public JMenuFormato(String device,String label,int ordinal,int width,int high,CameraApplet cameraApplet,JPanel modifiable){
super(label);
this.modifiable = modifiable;
this.width = width;
this.high = high;
this.cameraApplet = cameraApplet;
this.device = device;
this.ordinal = ordinal;
this.addActionListener(this);
}
@Override
public void actionPerformed(ActionEvent e) {
//Acciones para Applet (Class)
if(cameraApplet.getPlayer() == null){
AuxClass.setCameraApplet(cameraApplet, device, ordinal);
}
else{
AuxClass.changeResolution(cameraApplet.getPlayer(),device, ordinal);
}
cameraApplet.setSize(width+200, high+200);
}
}
index.html
<html>
<head>
<title>WebCam app</title>
</head>
<body>
<div><applet code="CameraApplet.class" archive="CapturaCamaraWeb.jar" width="680" height="840"></applet></div>
</body>
</html>