微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

无缝视频分享

如何解决无缝视频分享

我正在尝试在 LAN 上共享屏幕,但它显示出非常明显的延迟。我尝试了几种技术,但仍然很明显滞后。我尝试了以下技术:

  1. 从 OutputStream 在套接字上发送帧
  2. 使用 aspose 库在发送前压缩帧 (jpeg)
  3. 将帧添加到队列,然后轮询队列以发送它们

但是尽管尝试了所有方法,延迟仍然清晰可见。任何人都可以分享他们对如何进一步改进这一点的看法,以便在 LAN 上共享屏幕时没有/几乎没有延迟?

发件人.java

class SendScreen extends Thread{

    Socket socket=null;
    Robot robot=null;
    Rectangle rectangle=null;
    boolean continueLoop=true;
    Queue<BufferedImage> q;
  
    OutputStream oos=null;

    public SendScreen(Socket socket,Robot robot,Rectangle rect) {
    this.socket=socket;
    this.robot=robot;
    rectangle=rect;
        
        q= new LinkedList<>();
    start();
    }

    public void run(){
    
        try{
    oos=socket.getoutputStream(); 
    }catch(IOException ex){
        ex.printstacktrace();
    }

    while(continueLoop){
    BufferedImage image=robot.createScreenCapture(rectangle);

    try{                                                      
             /* 
            ByteArrayOutputStream ous = new ByteArrayOutputStream();
                
           ImageIO.write(image,"jpeg",ous);

             InputStream inStream = new ByteArrayInputStream( ous.toByteArray() );

            Image original=Image.load(inStream);
    JpegOptions jpegOptions = new JpegOptions()
      {{
        // Apply compression
            setCompressionType(JpegCompressionMode.Progressive);
      }};
  
  // Save compressed image  
  ous.flush();*/ 
    q.add(image);
    //q.poll();
    ImageIO.write( q.poll(),oos);
//  original.save(oos);
            
            
            
        //ImageIO.write(image,oos);
    }catch(IOException ex){
        ex.printstacktrace();
    }
    
    
    }
    }
}

接收器.java

class ReceiveScreen extends Thread{
    private ObjectInputStream cObjectInputStream = null;
    private JPanel cPanel = null;
    private boolean continueLoop = true;
    InputStream oin = null;
    Image image1 = null;

    public ReceiveScreen(InputStream in,JPanel p){
        oin = in;
        cPanel = p;
        start();
    }

    public void run(){
        try{
            //Read screenshots of the client and then draw them
            while(continueLoop){
                byte[] bytes = new byte[1024*1024];
                int count = 0;
                do{
                    count+=oin.read(bytes,count,bytes.length-count);
                }while(!(count>4 && bytes[count-2]==(byte)-1 && bytes[count-1]==(byte)-39));

                image1 = ImageIO.read(new ByteArrayInputStream(bytes));
                image1 = image1.getScaledInstance(cPanel.getWidth(),cPanel.getHeight(),Image.SCALE_FAST);

                //Draw the received screenshots

                Graphics graphics = cPanel.getGraphics();
                graphics.drawImage(image1,cPanel.getWidth(),cPanel);
            }

        } catch(IOException ex) {
            ex.printstacktrace();
        }
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?