视频传输
我用的是Java
开始的时候是没有想法的,后面发现只要慢慢来,找对方法还是可行的.
先设计思路.
a: 视频的话, 先要获得在摄像头前我们的图片,并且把它传输到电脑中. 注意: 要不断的获取.
b:将图片转化为可传输的数据. 通过协议到达对方机器中
c:对方接收数据, 将图片还原成图片.
首先考虑如何获得图片?
要使用到其他包OPENCV
//首先创建界面
public void Ui(){
JFrame jf = new JFrame();
jf.setSize(1000,600);
jf.setDefaultCloseOperation(3);
jf.setLocationRelativeTo(null);
jf.setVisible(true);
g0 = jf.getGraphics();
g1 = jf.getGraphics();
//地址创立
servesocket = new DatagramSocket(port1);
sendAddr = InetAddress.getByName("对方的地址");
sendsocket = new DatagramSocket(port0);
}
Graphics g0,g1;
//获得图片
public void videoRun() throws Exception {
//抓起图片
OpenCVFrameGrabber grabber0 = new OpenCVFrameGrabber(0);
grabber0.start();
//创建转换器
Java2DFrameConverter converter = new Java2DFrameConverter();
//线程,因为接受和发送是同时进行的
new Thread() {
public void run() {
while (true) {
BufferedImage img = null;
try {
//将抓起的视频界面转换为图片
img = converter.getBufferedImage(grabber0.grabFrame());
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
//将视频在自己界面播放
g0.drawImage(img, 0, 0, jp2.getWidth(), jp2.getHeight(), null);
try {
//用流来传输,将图片转化为数据
ImageIO.write(img, "jpg", outStream);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//转化为数据
byte[] buffer = outStream.toByteArray();
发送数据
send(buffer);
try {
new Thread().sleep(15);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}.start();
}
b: 接下来是发送图片给对方
private DatagramSocket sendsocket;
private InetAddress sendAddr;
private int port0 = 13000;
private int port1 = 14000;
public void send(byte[] buffer)
{
DatagramPacket packet = new DatagramPacket(buffer, buffer.length,sendAddr, port1);
try {
sendsocket.setSendBufferSize(buffer.length );
sendsocket.send(packet);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
c:接下来便是接受对方传过来的信息了
接受分为三个部分.接受信息,处理数据,展现视频
public void operate0(byte[] byte0)
{
ByteArrayInputStream inStream = new ByteArrayInputStream(byte0);
BufferedImage img1;
try {
img1 = ImageIO.read(inStream);
g1.drawImage(img1, 0, 0 , jp1.getWidth(), jp1.getHeight(), null);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
// 接受信息
/**创立接收端口
* 接受数据() 创立缓存包,接受长度,
* 处理数据
*/
DatagramSocket servesocket;
private int port2;
public void receive() throws SocketException
{
new Thread(){
public void run(){
while(true){
byte[] byte0 = null;
try {
//接受对方传递数据的字节长度
byte0 = new byte[servesocket.getReceiveBufferSize()];
} catch (SocketException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
//创建缓存包
DatagramPacket data = new DatagramPacket(byte0, byte0.length);
//3
try {
//接受数据
servesocket.receive(data);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//处理数据
operate0(byte0);
//获取对方的端口,同样你还能获得其他的信息
port2 = data.getPort();}}
}.start();
}
}
}