`
jxxms
  • 浏览: 106882 次
  • 性别: 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  
拿回家研究一下,有时间再来讨论。

相关推荐

    java 基于websocket实现的视频聊天

    在这个项目中,WebSocket被用来实现实时的视频流传输,创建一个类似Skype或Zoom的在线视频聊天环境。 首先,我们需要理解WebSocket的工作原理。传统的HTTP协议是基于请求-响应模型的,即客户端发起请求,服务器响应...

    java websocket实现视频聊天

    Java WebSocket 实现视频聊天是一种在Web上实现实时通信的技术,它允许服务器和客户端之间建立持久的连接,以便数据可以在两个方向上同时传输,而无需为每个消息创建新的HTTP请求。在本项目中,Java WebSocket被用来...

    java语音视频聊天程序

    java语音视频聊天程序 实现了java 局域网内 语音视频 聊天的程序 基于jmf开发的 如果下载后该程序运行了 需要安装jfm 和配置jfm的环境变量 直接运行sounds包下的chatloginfame即可,handlens包下的程序为java的放大...

    java视频聊天(anychat).zip

    Java视频聊天程序基于AnyChat平台开发,是一种实现在线实时音视频通信的技术方案。在这个项目中,我们主要关注Java编程语言如何与AnyChat平台相结合,来创建一个功能丰富的视频聊天应用。下面将详细介绍Java在视频...

    基于Java视频会议系统的设计与实现 的毕业设计,它可以实现多人视频会议、视频聊天等功能

    基于Java的视频会议系统是一种基于网络的实时视频会议系统,它可以实现多人视频会议、视频聊天等功能。该系统主要由会议控制器、视频处理器、音频处理器、网络通信模块等组成。 会议控制器负责会议的创建、管理和...

    java视频聊天(anychat)

    Java视频聊天系统,如标题所述,是基于AnyChat平台开发的一种实时通信应用。AnyChat是一款专业级的多媒体通信中间件,常用于实现音视频互动、文字聊天等功能,尤其适用于在线教育、远程医疗、游戏社交等领域。在这个...

    jmf.rar_Java视频聊天_java 视频 聊天_java 视频聊天_jmf_jmf video chat

    在“jmf.rar_Java视频聊天_java 视频 聊天_java 视频聊天_jmf_jmf__video_chat”这个压缩包中,我们可以推断出它包含了一个使用JMF实现的Java视频聊天程序。这个程序允许用户在局域网(LAN)环境中进行视频通信。 1...

    web (2)_java_DEMO_视频聊天_

    【标题】"web (2)_java_DEMO_视频聊天_" 指示这是一个基于Java的Web应用程序DEMO,专门设计用于实现视频聊天功能。在Web开发中,DEMO项目通常包含了一个可运行的基础架构,帮助开发者理解特定技术的实现方式或提供...

    java项目在线聊天系统视频

    项目在线聊天系统,基于java开发的项目在线聊天系统,提供搭建视频

    java多人视频聊天室

    在本文中,我们将深入探讨如何使用Java编程语言来实现一个多人视频聊天室。这个聊天室的设计基于经典的客户端/服务器(C/S)架构,利用Java的多线程特性来支持多个用户同时在线交流。 首先,我们要理解Java多线程在...

    java在线聊天系统视频

    一个java初级的在线聊天学习视频,都是初级的东西,有助于了解一些基本IO使用!

    java在线聊天系统

    Java在线聊天系统是一种基于Java技术实现的实时通讯应用,它允许用户通过互联网进行文本、语音甚至视频交流。本文将深入探讨Java在构建此类系统时的关键技术和实现细节。 首先,Java平台因其跨平台兼容性、丰富的...

    java多人在线聊天

    Java 多人在线聊天系统是一种基于网络编程技术实现的通信应用,它允许用户通过互联网或者局域网进行实时的文本、语音甚至视频交流。这个系统的实现主要依赖于Java的Socket编程和多线程技术,同时也涉及到网络协议的...

    虚拟在线视频聊天室程序,视频聊天室源码

    虚拟在线视频聊天室程序是一种基于互联网技术实现的社交平台,让用户可以实时进行音频和视频交流。这类程序的核心在于提供一个安全、稳定且交互性强的环境,使得用户即使身处不同的地理位置,也能通过网络进行面对面...

    java毕业设计——Java聊天室的设计与实现(论文+开题报告+答辩PPT+源代码+数据库+讲解视频).zip

    java毕业设计——Java聊天室的设计与实现(论文+开题报告+答辩PPT+源代码+数据库+讲解视频).zip java毕业设计——Java聊天室的设计与实现(论文+开题报告+答辩PPT+源代码+数据库+讲解视频).zip java毕业设计——...

    java语音视频聊天程序.zip

    Java语音视频聊天程序是一个基于Java技术实现的交互式通信应用,它允许用户通过网络进行语音和视频通话。这个程序展示了Java在实时通信(RTC)领域的强大功能,特别是结合了语音识别技术,使得用户可以通过语音指令来...

    浏览器视频聊天,多人视频聊天,webrtc,java

    这个版本支持一对一聊天,多对多聊天,以及传送文件等功能, 源码地址:https://github.com/js1688/cat 会持续更新 成果展现地址:https://www.tanjun.xyz 也可以直接下载此文件,maven构建项目所以源码才几十KB而已 没用...

    java 在线聊天系统

    Java在线聊天系统是一种基于Java技术实现的实时通讯应用,它允许用户通过互联网进行文本、语音甚至视频交流。这种系统的核心在于网络编程、多线程、并发处理以及数据传输的高效性和安全性。以下是对该系统的一些关键...

    Android局域网视频聊天

    在Android平台上实现局域网视频聊天涉及到多个技术领域和组件的整合。首先,我们要了解局域网通信的基本原理,这通常依赖于Wi-Fi或者蓝牙等无线网络技术,使得在同一网络下的设备能够相互通信。在这个项目中,...

Global site tag (gtag.js) - Google Analytics