/***************************************************
* 程序文件名称: 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
}
相关推荐
在这个项目中,WebSocket被用来实现实时的视频流传输,创建一个类似Skype或Zoom的在线视频聊天环境。 首先,我们需要理解WebSocket的工作原理。传统的HTTP协议是基于请求-响应模型的,即客户端发起请求,服务器响应...
Java WebSocket 实现视频聊天是一种在Web上实现实时通信的技术,它允许服务器和客户端之间建立持久的连接,以便数据可以在两个方向上同时传输,而无需为每个消息创建新的HTTP请求。在本项目中,Java WebSocket被用来...
java语音视频聊天程序 实现了java 局域网内 语音视频 聊天的程序 基于jmf开发的 如果下载后该程序运行了 需要安装jfm 和配置jfm的环境变量 直接运行sounds包下的chatloginfame即可,handlens包下的程序为java的放大...
Java视频聊天程序基于AnyChat平台开发,是一种实现在线实时音视频通信的技术方案。在这个项目中,我们主要关注Java编程语言如何与AnyChat平台相结合,来创建一个功能丰富的视频聊天应用。下面将详细介绍Java在视频...
基于Java的视频会议系统是一种基于网络的实时视频会议系统,它可以实现多人视频会议、视频聊天等功能。该系统主要由会议控制器、视频处理器、音频处理器、网络通信模块等组成。 会议控制器负责会议的创建、管理和...
Java视频聊天系统,如标题所述,是基于AnyChat平台开发的一种实时通信应用。AnyChat是一款专业级的多媒体通信中间件,常用于实现音视频互动、文字聊天等功能,尤其适用于在线教育、远程医疗、游戏社交等领域。在这个...
在“jmf.rar_Java视频聊天_java 视频 聊天_java 视频聊天_jmf_jmf__video_chat”这个压缩包中,我们可以推断出它包含了一个使用JMF实现的Java视频聊天程序。这个程序允许用户在局域网(LAN)环境中进行视频通信。 1...
【标题】"web (2)_java_DEMO_视频聊天_" 指示这是一个基于Java的Web应用程序DEMO,专门设计用于实现视频聊天功能。在Web开发中,DEMO项目通常包含了一个可运行的基础架构,帮助开发者理解特定技术的实现方式或提供...
项目在线聊天系统,基于java开发的项目在线聊天系统,提供搭建视频
在本文中,我们将深入探讨如何使用Java编程语言来实现一个多人视频聊天室。这个聊天室的设计基于经典的客户端/服务器(C/S)架构,利用Java的多线程特性来支持多个用户同时在线交流。 首先,我们要理解Java多线程在...
一个java初级的在线聊天学习视频,都是初级的东西,有助于了解一些基本IO使用!
Java在线聊天系统是一种基于Java技术实现的实时通讯应用,它允许用户通过互联网进行文本、语音甚至视频交流。本文将深入探讨Java在构建此类系统时的关键技术和实现细节。 首先,Java平台因其跨平台兼容性、丰富的...
Java 多人在线聊天系统是一种基于网络编程技术实现的通信应用,它允许用户通过互联网或者局域网进行实时的文本、语音甚至视频交流。这个系统的实现主要依赖于Java的Socket编程和多线程技术,同时也涉及到网络协议的...
虚拟在线视频聊天室程序是一种基于互联网技术实现的社交平台,让用户可以实时进行音频和视频交流。这类程序的核心在于提供一个安全、稳定且交互性强的环境,使得用户即使身处不同的地理位置,也能通过网络进行面对面...
java毕业设计——Java聊天室的设计与实现(论文+开题报告+答辩PPT+源代码+数据库+讲解视频).zip java毕业设计——Java聊天室的设计与实现(论文+开题报告+答辩PPT+源代码+数据库+讲解视频).zip java毕业设计——...
Java语音视频聊天程序是一个基于Java技术实现的交互式通信应用,它允许用户通过网络进行语音和视频通话。这个程序展示了Java在实时通信(RTC)领域的强大功能,特别是结合了语音识别技术,使得用户可以通过语音指令来...
这个版本支持一对一聊天,多对多聊天,以及传送文件等功能, 源码地址:https://github.com/js1688/cat 会持续更新 成果展现地址:https://www.tanjun.xyz 也可以直接下载此文件,maven构建项目所以源码才几十KB而已 没用...
Java在线聊天系统是一种基于Java技术实现的实时通讯应用,它允许用户通过互联网进行文本、语音甚至视频交流。这种系统的核心在于网络编程、多线程、并发处理以及数据传输的高效性和安全性。以下是对该系统的一些关键...
在Android平台上实现局域网视频聊天涉及到多个技术领域和组件的整合。首先,我们要了解局域网通信的基本原理,这通常依赖于Wi-Fi或者蓝牙等无线网络技术,使得在同一网络下的设备能够相互通信。在这个项目中,...