`
jxxms
  • 浏览: 104469 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Java在线视频聊天

阅读更多


/***************************************************

* 程序文件名称: VAplay.java

* 功能:处理视频图像捕获和音频播放

***************************************************/

import java.awt.*;

import java.awt.image.*;

import java.awt.event.*;

import java.util.*;

import java.io.*;

import java.net.*;

import javax.imageio.*;

import javax.swing.*;

import javax.media.*;

import javax.media.protocol.*;

import javax.media.control.*;

import javax.media.util.*;

import javax.media.format.*;

import com.sun.image.codec.jpeg.*;

 

class VAplay extends JFrame implements Runnable

{

//定义视频图像播放器

private static Player player = null;

//定义音频播放器

private static Player player2 = null;

//获取视频设备

private CaptureDeviceInfo device = null;

//获取音频设备

private CaptureDeviceInfo device2 = null;

//媒体定位器

private MediaLocator locator = null;

private Image image;

private Buffer buffer = null;

private BufferToImage b2i = null;

//设置摄像头驱动类型

String str = "vfw:Microsoft WDM Image Capture (Win32):0";

//定义播放组件变量

Component comV,comVC,comA;

//定义面板

JPanel p1,p2,p3,p4;

JLabel label=new JLabel("对方IP:");

//初始时,在接收图像窗口显示一幅静态图片

JLabel label2=new JLabel(new ImageIcon("image//load.gif"));

//定义二个线程,用于接收数据和发送数据

Thread thread1,thread2;

 

VAplay()

{

    super("★视频传输★");

   setBounds(150,100,500,500);

   p1=new JPanel(new GridLayout(1,2));

   p2=new JPanel(new GridLayout(2,1));

   p3=new JPanel(new BorderLayout());

   p4=new JPanel(new BorderLayout());

   //加载文本数据传输类

   p1.add(new TxtChat());

   p1.add(p2);

   p2.add(p3);

   p2.add(p4);

   p3.add("North",new JLabel("Java视频图像传输"));

   p3.add(label2,"Center");

   add(label,"North");

   add(p1,"Center");

    try

     {

             //在本地播放视频

       jbInit();

             //在本地播放音频

       speaker();

     }

    catch(Exception e)

     {

       e.printStackTrace();

     }

    thread1=new Thread(this);

    thread2=new Thread(this);

//负责接收对方数据

thread1.start();

//负责向对方发送数据

thread2.start();

 

    addWindowListener(new WindowAdapter()

    {

     public void windowClosing(WindowEvent e)

     {

     System.exit(0);

     }

    });

    setVisible(true);

    validate();

}

  

//在本地播放视频

private void jbInit() throws Exception

{    

//初始化设备,str为设备驱动

device = CaptureDeviceManager.getDevice(str);

//确定所需的协议和媒体资源的位置

locator = device.getLocator();

try

   {

    //调用sethint后Manager会尽力用一个能和轻量级组件混合使用的Renderer来创建播放器

    Manager.setHint(Manager.LIGHTWEIGHT_RENDERER,new Boolean(true));

    //通过管理器创建播放线程使player达到Realized状态

    player = Manager.createRealizedPlayer(locator);

    player.start();

 

    if((comV = player.getVisualComponent()) != null)

      //player.getVisualComponent()是一个播放视频媒体组件。

      {

       p4.add(comV,"Center");

      }

    if((comVC=player.getControlPanelComponent())!=null)

      //player.getControlPanelComponent()是显示时间的组件

      {

       p4.add(comVC,"South");

      }

   }

catch (Exception e)

   {

     e.printStackTrace();

   }

setBounds(200,100,600, 550);

setVisible(true);

int new_w= p4.getWidth(); //输出的图像宽度

int new_h= p4.getHeight(); //输出的图像高度

//MediaTracker类跟踪一个Image对象的装载,完成图像加载

MediaTracker mt = new MediaTracker(this.p4);

try

   {

    mt.addImage(image, 0);//装载图像

mt.waitForID(0);//等待图像全部装载

   }

catch (Exception e)

   {

     e.printStackTrace();

   }

//将图像信息写入缓冲区

BufferedImage buffImg = new BufferedImage(new_w, new_h,BufferedImage.TYPE_INT_RGB);

Graphics g = buffImg.createGraphics();

g.drawImage(image, 0, 0, new_w, new_h, this.p4);

g.dispose();

}

   

//在本地播放音频

private void speaker() throws Exception

{

Vector deviceList = CaptureDeviceManager.getDeviceList(new

      AudioFormat(AudioFormat.LINEAR,44100,16,2));

if(deviceList.size()>0)

    {

     device2 = (CaptureDeviceInfo)deviceList.firstElement();

    }

else

    {

     System.out.println("找不到音频设备!");

    }

try

    {

     player2 = Manager.createRealizedPlayer(device2.getLocator());

     player2.start();

     if((comA = player2.getControlPanelComponent())!=null)

      {

     p3.add(comA,"South");

      }

    }

catch(Exception e)

    {

     e.printStackTrace();

    }

}

   

//线程,接收或发送视频图像数据

public void run()

{

DatagramPacket pack=null;

DatagramSocket maildata=null;

byte data[]=new byte[320*240];

try

   {

//定义数据包

pack=new DatagramPacket(data,data.length);

//定义数据报接收包

maildata=new DatagramSocket(999);

   }

catch(Exception e){ }

while(true)

   {

   if(Thread.currentThread()==thread1)

{

if(maildata==null)

{

break;

}

else

{

try

{

   //接收

   maildata.receive(pack);

   ByteArrayInputStream input=new ByteArrayInputStream(data);

   Image message=ImageIO.read(input);

   //在接收图像窗口显示视频图像

   label2.setIcon(new ImageIcon(message));

   label.setText("对方IP:"+pack.getAddress()+

" 端口:"+pack.getPort());

}

catch(Exception e)

{

   System.out.println("接收图像数据失败!");

}

   }

}

else if(Thread.currentThread()==thread2)

{

try

{

   //捕获要在播放窗口显示的图象帧

   FrameGrabbingControl fgc = (FrameGrabbingControl) player.getControl(

        "javax.media.control.FrameGrabbingControl");

       // 获取当前祯并存入Buffer类

       buffer = fgc.grabFrame();

       b2i = new BufferToImage( (VideoFormat) buffer.getFormat());

       image = b2i.createImage(buffer); //转化为图像

   //创建image图像对象大小的图像缓冲区

   BufferedImage bi = (BufferedImage) createImage(image.getWidth(null),

       image.getHeight(null));

       //根据BufferedImage对象创建Graphics2D对象

       Graphics2D g2 = bi.createGraphics();

       g2.drawImage(image, null, null);

     ByteArrayOutputStream output=new ByteArrayOutputStream();

   //转换成JPEG图像格式

   JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder( output );

   JPEGEncodeParam jpeg = encoder.getDefaultJPEGEncodeParam(bi);

   jpeg.setQuality(0.5f,false);

   encoder.setJPEGEncodeParam(jpeg);

      encoder.encode(bi);

   output.close();

   InetAddress address=InetAddress.getByName("localhost");

   DatagramPacket datapack1=new DatagramPacket(output.toByteArray(),output.size(),

address,555);

   DatagramSocket maildata1=new DatagramSocket();

   maildata1.send(datapack1);

   Thread.sleep(400);

}

catch(Exception e)

{

System.out.println("视频发送失败!");

}

}

   }

}

   

public static void main(String args[])

{

new VAplay();

}

}

 

class TxtChat extends JPanel implements ActionListener,Runnable

{

JPanel p1,p2,p3,p4;

JLabel jpic;

JTextArea txt1,txt2;

JButton btn1,btn2;

JScrollPane scroll,scroll2;

Thread thread;

boolean boo1=false,boo2=false;

 

TxtChat()

{

setLayout(new BorderLayout());

 

txt1=new JTextArea();

txt2=new JTextArea();

p1=new JPanel(new GridLayout(2,1));

p2=new JPanel();

p3=new JPanel(new BorderLayout());

jpic=new JLabel(new ImageIcon("image//upload.gif"));

btn1=new JButton("电子文档");

btn2=new JButton("发送信息");

 

scroll=new JScrollPane(txt1,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,

JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);

scroll2=new JScrollPane(txt2,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,

JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);

p1.add(scroll);

p1.add(p3);

p2.add(btn1);

p2.add(btn2);

p3.add(jpic,"North");

p3.add(scroll2,"Center");

 

add(p1,"Center");

add(p2,"South");

 

setVisible(true);

Font f=new Font("",Font.PLAIN,18);

txt1.setFont(f);

txt1.setForeground(Color.red);

txt2.setFont(f);

txt2.setForeground(Color.blue);

btn1.setBackground(Color.cyan);

btn2.setBackground(Color.yellow);

 

btn1.addActionListener(this);

btn2.addActionListener(this);

 

thread=new Thread(this);

thread.start();

 

}

 

public void actionPerformed(ActionEvent e)

{

   if(e.getSource()==btn2)

{

     byte buffer[]=txt2.getText().trim().getBytes();

try

{

InetAddress address=InetAddress.getByName("localhost");

DatagramPacket data_pack=new DatagramPacket(buffer,buffer.length,address,888);

DatagramSocket mail_data=new DatagramSocket();

txt1.append("我说:"+txt2.getText()+'\n');

mail_data.send(data_pack);

txt2.setText("");

}

catch(Exception e1)

{

System.out.println("聊天信息发送失败!");

}

}

}

 

public void run()

{

DatagramPacket pack=null;

DatagramSocket mail_data=null;

byte data[]=new byte[8192];

try

{

    pack=new DatagramPacket(data,data.length);

mail_data=new DatagramSocket(666);

}

catch(Exception e){ }

while(true)

{

if(Thread.currentThread()==thread)

{

   if(mail_data==null)

{break;}

   else

{

try

{

   mail_data.receive(pack);

   int length=pack.getLength();

   String message=new String(pack.getData(),0,length);

   txt1.append("某某说:"+message+'\n');

}

catch(Exception e)

{

System.out.println("接收数据失败!");

}

}

   }

}// while end

} //run() end

}

分享到:
评论
3 楼 luiprw 2012-08-21  
2 楼 luiprw 2012-08-21  
注释很详细.. 回去研究..谢谢分享
1 楼 俊.李 2011-01-25  
拿回家研究一下,有时间再来讨论。

相关推荐

Global site tag (gtag.js) - Google Analytics