JMFでリアルタイム動画配信 | JavaのJMFを使用したライブチャットシステムの製作方法

このQ&Aのポイント
  • JavaのJMFを使用してWebカメラからの動画をネットワークで相手に見れるシステムを製作する方法について解説します。
  • GrabFrameクラスを使用してリアルタイムのビデオキャプチャを行い、画像を表示するプログラムを作成します。
  • BufferToImageクラスを使用して、Bufferオブジェクトから画像を作成する際に、imgオブジェクトはjpg形式で作成されます。
回答を見る
  • ベストアンサー

JMFでリアルタイム動画配信

JavaのJMFを使用してWebカメラからの動画をネットワークで相手に見れるシステムを製作しています。 つまり、ライブチャットみたいなものを作っています。 その際に参考になると思うようなリストを手にいれました。 public class GrabFrame extends JPanel { Player player; Image img = null; public static void main(String[] args) { JFrame frame = new JFrame("Grab"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setBounds(100, 100, 320, 240); frame.getContentPane().add(new GrabFrame()); frame.setVisible(true); } public GrabFrame(){ try { player = Manager.createRealizedPlayer(new MediaLocator("vfw://0")); } catch(Exception e){ System.out.println(e); System.exit(1); } new Timer(20, new ActionListener(){ public void actionPerformed(ActionEvent e){ grab_proc(); repaint(); } }).start(); player.start(); } void grab_proc(){ FrameGrabbingControl frameGrabber =(FrameGrabbingControl)player.getControl("javax.media.control.FrameGrabbingControl"); Buffer buf = frameGrabber.grabFrame(); img =(new BufferToImage((VideoFormat)buf.getFormat()).createImage(buf)); } public void paint(Graphics g){ if(null == img) return; g.drawImage(img, 0, 0, getWidth(), getHeight(), null); } } このリストでのrepaint()なんていうメソッドはないのに実行してるのはおかしいと思いました。どなたか理由を教えてください。 あと img =(new BufferToImage((VideoFormat)buf.getFormat()).createImage(buf)); ここでのimgはjpgなんですか?? 無知ですみません。どなたか指導お願いします。

  • Java
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • PecoPlus
  • ベストアンサー率76% (144/188)
回答No.1

 こんばんは。 >このリストでのrepaint()なんていうメソッドはないのに >実行してるのはおかしいと思いました。  GrabFrameクラスは、JPanelクラスを継承しています。  つまり、JPanelが持っている継承可能なメソッドは、書かれていなくても、あらかじめすべて持っていることになります。  repaint()メソッドはその中の一つですね。 >img =(new BufferToImage((VideoFormat)buf.getFormat()).createImage(buf)); >ここでのimgはjpgなんですか??  imgは、Imageクラスのインスタンスです。  Imageクラスは抽象クラスなので、実際の具象クラスは、なんなのかJMFに詳しくないのでわからないのですが、どっちにしろ、中身は生のピクセルデータの集合でしょうから、jpgのような圧縮はされてないと思いますよ。

vj8xdq
質問者

補足

返事遅れてもうしわけありません。 PecoPlusさんありがとうございます。 継承ですか、初歩を忘れてしまってました。 さらに質問を追加なのですが、imageクラスのインスタンスimgをストリームやソケットを使って別なところに送ることは可能なのでしょうか?? わかる方またよろしくお願いします。

関連するQ&A

  • JFrameクラスの挙動に対する推察と質問

    JFrameクラスの挙動に対する推察と質問 現在、プログラムでJFrameクラスを使って,Windowを表示させるアプリをつくっているのですが、repaintがうまく動作しません。 コードで説明させていただきますと、 public class Main{   public static void main(String[] args){     Drow drow ;     drow = new Drow();     drow.createFrame();     drow.repaint();//画面は更新されない   } } public class Drow extends JPanel{   JFrame frame;   static Image jpg;   static int x;   static int y;   public void createFrame()    {     frame = new JFrame();     Drow app = new Drow();     frame.getContentPane().add(app);     frame.getContentPane().add( new Drow() );     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);     frame.setBounds(10, 10, 300, 200);     frame.setTitle("タイトル");     frame.setVisible(true);   }   public void paintComponent(Graphics g){     super.paintComponent(g);     g.drawOval(x, y, 80, 80);   } } このソースのMain文でrepaintを実行させているのですが、画面は更新されません。 このエラーについて自分なりに原因を推察した所、JFrameは自分で自分のクラスのインスタンスを作成しているからではないかと考えました。 なので私がrepaintを実行しても、それは私の作ったdrowインスタンスのpaintComponentが実行されているだけで、JFrameが自動でつくったインスタンスの方には影響がないのだと推察しました。 ここで質問なのですが、私の推察はあっているでしょうか? また、このようなrepaintをMain文で実行したい場合はどのようにしたらよいのでしょうか? お返事お待ちしております。

    • ベストアンサー
    • Java
  • TABキーの検出

    Swingコンポーネントで、TABキーのイベントを取得する 方法を教えてください。 タブキー以外は検出できるのですが… import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import javax.swing.JFrame; import javax.swing.JPanel; public class TabKeyListener { public TabKeyListener() { JPanel panel = new JPanel(); panel.addKeyListener( new KeyListener(){ public void keyPressed(KeyEvent e) { System.out.println(e.getKeyCode()); } public void keyReleased(KeyEvent e) { } public void keyTyped(KeyEvent e) { } } ); JFrame frame = new JFrame(); frame.add(panel); frame.setBounds(100,100,200,200); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); panel.requestFocusInWindow(); } public static void main(String[] args) { new TabKeyListener(); } }

    • ベストアンサー
    • Java
  • createImage()を使いコンパイル

    このプログラムをcreateImage()を使ってイメージを作りたいのですが自分で変更してもコンパイルできません><;どのように変更したらイメージをつくることができるのでしょうか?回答よろしくおねがいしまあす(^^; import java.awt.Color; import java.awt.Color; import java.awt.Graphics; import java.awt.Image; import java.awt.event.MouseEvent; import java.awt.event.MouseMotionListener; import java.awt.image.BufferedImage; import javax.swing.JComponent; import javax.swing.JFrame; class Test extends JComponent implements MouseMotionListener { public static void main(String[] args) { JFrame frame = new JFrame(); frame.getContentPane().add(new Test()); frame.setBounds(0 , 0 , 400 , 300); frame.setVisible(true); frame.setDefaultCloseOperation(JFrame.EXIT ON CLOSE); } Image image; public Test() { addMouseMotionListener(this); image = new BufferedImage(400, 300, BufferedImage.TYPE INT RGB); Graphics g = image.getGraphics(); g.setColor(new Color(0xFF, 0xFF, 0xFF)); g.fillRect(0, 0, 400, 300); }public void paintComponent(Graphics g) { g.drawImage(image, 0, 0, this); } public void mouseDragged(MouseEvent e) { Graphics g = image.getGraphics(); g.setColor(new Color(0, 0, 0)); g.fillOval(e.getX() - 5, e.getY() - 5, 5 , 5); repaint(); }public void mouseMoved(MouseEvent e) {} }

  • createImage()を使い コンパイル

    このプログラムをcreateImage()を使ってイメージを作りたいのですが自分で変更してもコンパイルできません><;どのように変更したらイメージをつくることができるのでしょうか?回答よろしくおねがいしまあす(^^; import java.awt.Color; import java.awt.Color; import java.awt.Graphics; import java.awt.Image; import java.awt.event.MouseEvent; import java.awt.event.MouseMotionListener; import java.awt.image.BufferedImage; import javax.swing.JComponent; import javax.swing.JFrame; class Test extends JComponent implements MouseMotionListener { public static void main(String[] args) { JFrame frame = new JFrame(); frame.getContentPane().add(new Test()); frame.setBounds(0 , 0 , 400 , 300); frame.setVisible(true); frame.setDefaultCloseOperation(JFrame.EXIT ON CLOSE); } Image image; public Test() { addMouseMotionListener(this); image = new BufferedImage(400, 300, BufferedImage.TYPE INT RGB); Graphics g = image.getGraphics(); g.setColor(new Color(0xFF, 0xFF, 0xFF)); g.fillRect(0, 0, 400, 300); }public void paintComponent(Graphics g) { g.drawImage(image, 0, 0, this); } public void mouseDragged(MouseEvent e) { Graphics g = image.getGraphics(); g.setColor(new Color(0, 0, 0)); g.fillOval(e.getX() - 5, e.getY() - 5, 5 , 5); repaint(); }public void mouseMoved(MouseEvent e) {} }

  • 画像の表示について(初心者より)

    今、eclipseを使用して任意の画像の表示をするプログラムを作ってるのですが、JFrameを使用しメニューを実装した上で画像を表示させると画像の裏にメニューのリンク(というのかわかりませんが)が表示されてしまいます。どのように表記すればいいのでしょうか?関係ありそうな部分を記載しますのでご教授おねがいします。 public myimage(){ try { bimage = ImageIO.read(new File"sample.jpg")); } catch (Exception e) { e.printStackTrace(); bimage = null; } JFrame frame = new JFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setBounds(0,0,640, 480); frame.getContentPane().add(c); frame.setJMenuBar(buildMenu()); frame.setLocationRelativeTo(null); frame.setVisible(true); }

  • swingのJframeについて

    JFrameについて質問があるのですが import javax.swing.*; public class JFrameTest extends JFrame{ public static void main(String[] args){ JFrameTest frame = new JFrameTest(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setBounds(10, 10, 300, 200); frame.setTitle("タイトル"); frame.setVisible(true); } JFrameTest(){ JPanel p = new JPanel();   Container contentPane = getContentPane(); ContentPane.add(p);   pack(); } } このプログラムと import javax.swing.*; public class JFrameTest{ public static void main(String[] args){ JFrame frame = new JFrame("フレームのタイトル"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setBounds( 10, 10, 300, 200); frame.setVisible(true); JPanel p = new JPanel();   Container contentPane = frame.getContentPane(); frame.ContentPane.add(p);   frame.pack(); } } このプログラムは何が違うのでしょう? やってることはまったく一緒だと思ってたのですが、全然違うみたいです。 上のプログラムの JFrameTest(){ はコンストラクタと呼ばれるものなのでしょうか? しょぼい質問で申し訳ないのですが誰か教えていただけないでしょうか。

    • ベストアンサー
    • Java
  • 「継承されたメソッドの可視性を下げることは出来ません。」というエラーの

    「継承されたメソッドの可視性を下げることは出来ません。」というエラーの意味がわかりません。  JAVA初心者です、宜しくお願いします。  下のようなコードを書きましたが、"void paint(Graphics g)"の箇所で 「Canvasから継承されたメソッドの可視性を下げることは出来ません。」 とのエラーメッセジが出ました。  "public void paint(Graphics g)"とかくと、エラーは消えました。  何故"public"をつける必要があるのでしょうか。  また、クラス自身には、publicをつけない場合には、publicと見なされると本で読みましたが  メッソドにはこのようなルールはないのでしょうか。 ======================================= public class Canvas_test extends Canvas { public static void main(String[] args) { JFrame frame = new JFrame(); frame.setTitle("Canvas_test"); frame.setBounds(0,0,480,380); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setResizable(false); frame.setLayout(null); JPanel cp = new JPanel(); cp.setLayout(null); frame.add(cp); cp.setBounds(38,20,400,300); Canvas canvas = new Canvas_test(); cp.add(canvas); canvas.setBounds(0,0,400,300); frame.setVisible(true); } void paint(Graphics g) { g.drawString("aaaa",40,40); } } ========================================

    • ベストアンサー
    • Java
  • ボタンクリック後パネルを再描画repaintしたい

    ボタンをクリック後にstaticで保持していた値にプラス1して その値をパネルに再描画したいと思っています。 下記のプログラムだとボタンをクリックすると (<1<2<3<4)となって画像と数字が増えてしまいます 行いたいのは数字の部分だけが再描画されて カウントされて<3と表示されるだけになってもらいたい クラス1つ目 import java.awt.BorderLayout; import java.awt.Cursor; import java.awt.event.MouseEvent; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; public class Sample extends JFrame{ static int value=1; JPanel work = new JPanel(); public static void main(String[] args) { Sample frame = new Sample(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setBounds(100, 200, 200, 100); frame.add(frame.createPanel(), BorderLayout.LINE_END); frame.setVisible(true); } public JPanel createPanel() { ImageIcon icon = new ImageIcon("./img/left.gif"); JLabel label = new JLabel(); Cursor c = new Cursor(Cursor.HAND_CURSOR); label.setCursor(c); label.setIcon(icon); JLabel strLabel = new JLabel(); String str = Integer.toString(value); strLabel.setText(str); work.add(label); work.add(strLabel); label.addMouseListener(new myListener()); return work; } class myListener extends MouseAdapter{ public void mouseClicked(MouseEvent e){ System.out.print(Sample.value++); createPanel().repaint(); setVisible(true); } } } クラス2つ目 import java.awt.event.MouseEvent; import java.awt.event.MouseListener; public class MouseAdapter implements MouseListener{ public void mouseClicked(MouseEvent e){} public void mouseEntered(MouseEvent e){} public void mouseExited(MouseEvent e){} public void mousePressed(MouseEvent e){} public void mouseReleased(MouseEvent e){} }

    • ベストアンサー
    • Java
  • JAVA+SWING+WEBカメラを使用して、WEBカメラの動画を表示

    JAVA+SWING+WEBカメラを使用して、WEBカメラの動画を表示させるGUIアプリーションを開発しています。 JFrame上に「player.getVisualComponent()」をaddするとフレーム全体に画像が表示されますが、以下のソースコードの様に「player.getVisualComponent()」をJPanel上にaddするとPanelのサイズ一杯に動画が表示されるのではなく、WEBカメラのデフォルトサイズで必ず表示されてしまいます。 JPanel上で任意の大きさでWEBカメラからの動画を表示させることは可能なのでしょうか? ちなみにWEBカメラの動画表示アプリのソースコードは以下の通りです。 import javax.media.*; import javax.swing.*; public class ImageView { public static void main(String args[]) throws Exception { JFrame frame = new JFrame("ImageView"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Player player = Manager.createRealizedPlayer(new MediaLocator("vfw://0")); JPanel panel = new JPanel(); panel.add(player.getVisualComponent()); frame.setBounds(100, 100, 640, 480); frame.getContentPane().add(panel); frame.setVisible(true); player.start(); } } 宜しくお願いいたします。

    • ベストアンサー
    • Java
  • javaアプリのswingに関する質問です

    始めて投稿させていただきます。 現在、javaアプリケーションのswingを利用し、ボタンを押したら画像が表示され、ウエイトの時間を過ぎると自動的に画像が消え、またボタンが表示され・・・を繰り返すプログラムを作っています。 ですが、色々なサイトを拝見させていただき、修正を加えたのですが思うように動いてくれません。 そこで、皆様のお知恵を拝借出来ればと思い投稿させていただきました。 下記にソースコードを記載しております。 すべてのソースコードを記載しておりますので長くなっております。 また最終的には、50個前後のボタン、画像の拡大等を行う予定です。 長文になりますがアドバイスをいただけましたら幸いです。 -----------以下ソースコード-------------------- import java.io.*; import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.imageio.*; class Test extends JPanel implements ActionListener{ static JFrame frame = new JFrame(); JButton bt1; JButton bt2; JPanel pn1 = new JPanel(); Dimension dim = this.getToolkit().getScreenSize(); int eventNo = -1; public Test() { frame.setTitle("これ"); frame.setUndecorated(true); frame.setBounds(0, 0, 640, 480); btStart(); pn1.setLayout(new FlowLayout()); frame.add(pn1); frame.setVisible(true); } public void btStart(){ bt1 = new JButton("テスト"); bt2 = new JButton("終了"); pn1.add(bt1); pn1.add(bt2); bt1.addActionListener(this); bt2.addActionListener(this); } // ボタン消去メソッド public void btFormat(){ frame.remove(pn1); bt1 = null; bt2 = null; } public void actionPerformed(ActionEvent e){ if(e.getActionCommand() == "テスト") {eventNo = 1;} if(e.getActionCommand() == "終了") {eventNo = 46;} repaint(); } public void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2 = (Graphics2D)g; if(eventNo == 46){ System.exit(0); }else if(eventNo == -1){ g2.clearRect(0, 0, 640, 480); }else if(eventNo >= 0){ eventNo = -1; btFormat(); try{ g2.drawImage(ImageIO.read(new File("./image/001.jpg")), 0, 0, this); frame.add(this); sleep(100); g2.clearRect(0, 0, 640, 480); btStart(); pn1.setLayout(new FlowLayout()); frame.add(pn1); }catch(Exception e){ System.out.println(e); } } } // ウェイトを掛けるメソッド public synchronized void sleep(long msec) { for(int i=0; i<=msec; i++){ try { wait(1); } catch(InterruptedException e) { e.printStackTrace(); } } } public static void main(String[] args) { frame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); frame.getContentPane().add( new Test() ); } }

    • ベストアンサー
    • Java

専門家に質問してみよう