屏幕录像器-怎样把生成的图片压缩成-以及解压播放

巴西内马尔 发布于 2016/09/07 11:43
阅读 124
收藏 0

        我用JAVA写了一个屏幕录像器。

        可以捕获屏幕,并将生成的图片存储到磁盘中。

        每1s生成若干张图片。

        当生成了很多图片后。整个文件夹就变得很大。

        我通过播放器,将图片一张张播放来形成视频(这样可以完成简单的录像器功能)

        但网上的录像器都是生成的是视频格式。

        请问,我怎么把若干张图片压缩成视频格式.....

加载中
0
能源-小米粥
能源-小米粥
你好,大神。能把你的代码给我一份吗?
巴西内马尔
巴西内马尔
我不是大神,我也才學,我找一下,等下給你
0
巴西内马尔
巴西内马尔

=====================================================

                        屏幕錄像

package com.sunny.videotape;

import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.util.Date;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class MainFrame {
  
 private JFrame mainJFrame = new JFrame("屏幕录像器");
 
 private JPanel mainJPanel = new JPanel();
 
 private JButton jbtnStart = new JButton("开始");
 private JButton jbtnStop = new JButton("停止");
 
 private JLabel jlTime = new JLabel();
 
 private JFileChooser fileChooser = new JFileChooser();
 
 private File selectFile = null;
 
 VideotapeThread videotape;
 RecordingTime recordingTime;
 
 public MainFrame() {
  // TODO Auto-generated constructor stub
  this.initView();
  
  this.startListener();
  
  this.stoptListener();
 }
 
 /*
  *  录像器的页面布局
  */
 private void initView() {
  
  mainJFrame.setSize(350,80);
  mainJFrame.setLocationRelativeTo(null);
  
  mainJFrame.add(mainJPanel);
  mainJPanel.add(jlTime);
  jlTime.setText(0 + "Day - " + "00H - 00M - 00S" );
  mainJPanel.add(jbtnStart);
  mainJPanel.add(jbtnStop);
  
  mainJFrame.setVisible(true);
  mainJFrame.setResizable(false);
  mainJFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 }
 
 /*
  * 添加开始监听事件
  */
 private void startListener() {
  jbtnStart.addActionListener(new ActionListener() {
   @Override
   public void actionPerformed(ActionEvent e) {
    // TODO Auto-generated method stub
    if (videotape == null) {
     fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
     int res = fileChooser.showSaveDialog(mainJFrame);
     if(res == JFileChooser.APPROVE_OPTION) {
      selectFile = fileChooser.getSelectedFile();  
      if (selectFile.exists() == false) {// 文件夹不存在,则创建
       selectFile.mkdir();
      }
     }
     videotape = new VideotapeThread(selectFile);
     videotape.start();
    }    
    if(recordingTime == null) {
     recordingTime = new RecordingTime(jlTime);
     recordingTime.start(); 
    }
   }
  });
 }
 
 /*
  * 添加停止监听事件
  */
 private void stoptListener() {
    
  jbtnStop.addActionListener(new ActionListener() {
   
   @Override
   public void actionPerformed(ActionEvent e) {
    // TODO Auto-generated method stub
    if(videotape != null) {
     videotape.setFlag(false);
    }
    if(recordingTime != null) {
     recordingTime.setFlag(false);
    }
   }
  });
 }
 
 
 public static void main(String[] args) {
  new MainFrame();
 }

}


package com.sunny.videotape;
import javax.swing.JLabel;
/*
 *  顯示時間
 */
public class RecordingTime extends Thread {
 
 private JLabel recordingTime;
 
 private int second = 0;
 
 private int minute = 0;
 
 private int hour = 0;
 
 private int day = 0;
 
 private boolean flag = true;
 
 public RecordingTime(JLabel recordingTime) {
  // TODO Auto-generated constructor stub
  this.recordingTime = recordingTime;
 }
 
 @Override
 public void run() {
  // TODO Auto-generated method stub
  while(flag) {
   try {
    Thread.sleep(1000);
    second++;
    runTime();
    setFormat();
   } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
  }
 }
 
 private void setFormat() {
  StringBuffer str = new StringBuffer();
  str.append(day + "Day - ");
  if(hour < 10) {
   str.append("0" + hour + "H - ");
  } else {
   str.append(hour + "H - ");
  }
  if(minute < 10) {
   str.append("0" + minute + "M - ");
  } else {
   str.append(minute + "M - ");
  }
  if(second < 10) {
   str.append("0" + second + "S");
  } else {
   str.append(second + "S");
  }
  recordingTime.setText(str.toString());
 }
 
 private void runTime() {
  if(second == 60) {
   second = 0;
   minute = 1;
  }
  if(minute == 60) {
   minute = 0;
   hour = 1;
  }
  if(hour == 24) {
   hour = 0;
   ++day;
  }
 }
 
 public void setFlag(boolean flag) {
  this.flag = flag;
 }
}



package com.sunny.videotape;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.Date;
import javax.imageio.ImageIO;
public class VideotapeThread extends Thread {
 
 
 //屏幕的宽
 private int scrrenWidth;
 //屏幕的高
 private int scrrenHeight;
 
 // 這是一個工具類
 private Toolkit toolKit;
 
 private Robot robot;
 
 // 可以用flag來控制綫程   (可以添加代碼   做成開始 和  停止 )
 private boolean flag = true;
 
 private File selectFile;
 
 public VideotapeThread(File selectFile) {
  
  // 獲取屏幕的分辨率
  scrrenWidth = toolKit.getDefaultToolkit().getScreenSize().width;
  scrrenHeight = toolKit.getDefaultToolkit().getScreenSize().height;
  
  this.selectFile = selectFile;
  
 }
 
 @Override
 public void run() {
  try{
   while(flag) {
    if(robot == null) {
     robot = new Robot();
    }
    
    // BufferedImage 在内存中暫時存儲圖片   通過Robot方法捕獲屏幕并生成圖片
    BufferedImage scrrenImage = robot.createScreenCapture(new Rectangle(scrrenWidth, scrrenHeight));
    
    // ImageIo類中的方法將圖片保存在磁盤中
    ImageIO.write(scrrenImage, "jpeg", new File(selectFile, new Date().getTime() + ".jpg"));
    
    //每333秒捕獲一張圖片 (視頻是每秒補貨若干張)
    Thread.sleep(333);
   }
  } catch(Exception e) {
   e.printStackTrace();
  }
 
 }
 
 // 通過這個方法可以設置停止或暫停鍵
 public void setFlag(boolean flag) {
 
  this.flag = flag;
 }
}


===================================================

                           播放器

package com.sunny.player;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.File;

import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.JScrollPane;
import javax.swing.border.Border;

public class player {

 private JFrame playerJFrame = new JFrame("播放器");
 
 private JPanel playerJPanel = new JPanel();
 
 private JPanel otherJPanel = new JPanel();
 
 private JButton jbtnPlay = new JButton("播放");
 
 // 滾動條
 private JScrollPane js = new JScrollPane();
 
 private JLabel image = new JLabel();
 
 private JProgressBar jpg = new JProgressBar();
 
 private JFileChooser jfChooser = new JFileChooser();
 
 private File file;
 
 public player() {

  this.initView();
  
  this.playerListener();
 }
 
 // 初始化界面
 private void initView() {
  playerJFrame.setSize(700, 800);
  playerJFrame.setLocationRelativeTo(null); // 將佈局設置為空佈局
  
  playerJFrame.add(playerJPanel);
  playerJPanel.setLayout(new BorderLayout());
  
  playerJPanel.add(js, BorderLayout.CENTER);
  js.setViewportView(image);
  
  playerJPanel.add(otherJPanel,BorderLayout.SOUTH);
  
  otherJPanel.add(jbtnPlay);
  otherJPanel.add(jpg);
  
  playerJPanel.addMouseMotionListener(new MouseAdapter() {  // 通過這個方法來獲取鼠標的坐標   一般用來空佈局時的佈局
   @Override
   public void mouseMoved(MouseEvent e) {
    
    playerJFrame.setTitle(e.getX() + " " + e.getY());
   }
  });

  
  playerJFrame.setVisible(true);
  playerJFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 }
 
 private void playerListener() {
  jbtnPlay.addActionListener(new ActionListener() {
   
   @Override
   public void actionPerformed(ActionEvent e) {
    
    if(file == null) {
     
     // 通過文件選擇器選擇文件
     jfChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
     
     int res = jfChooser.showOpenDialog(playerJFrame);
     
     if(res == JFileChooser.APPROVE_OPTION) {
      file = jfChooser.getSelectedFile();
      Thread player = new Thread(new PlayerThread(file, image, jpg));
      player.start();
     }
    }
   }
  });
 }
 
 public static void main(String[] args) {
  new player();
 }
}


package com.sunny.player;
import java.awt.Component;
import java.awt.Graphics;
import java.io.File;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JProgressBar;
/*
 *  屏幕錄像時生成的是圖片  衹能通過這個類來獲取當前文件下的圖片  一張一張的播放
 */
public class PlayerThread implements Runnable {
 
 private File file;
 
 // 在標簽中添加圖片
 private JLabel image;
 
 private JProgressBar jpg;
 
 public PlayerThread(File file, JLabel image, JProgressBar jpg) {
  // TODO Auto-generated constructor stub
  this.file = file;
  this.image = image;
  this.jpg = jpg;
 }
 
 @Override
 public void run() {
  // TODO Auto-generated method stub
  File[] files = file.listFiles();
  jpg.setMaximum(files.length);
  int i = 0;
  jpg.setValue(0);
  for (File file : files) {
   image.setIcon(new ImageIcon(file.getPath()));
   jpg.setValue(++i);
   try {
    Thread.sleep(330);
   } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
  }
 }
}


0
北极心
北极心
ffmpeg也行能帮到你
巴西内马尔
巴西内马尔
谢谢,我查了以下。感觉不会用。
0
北极心
北极心
对了,声卡获取音频流,要不你这视频没声音,不过我觉得你的方案有问题
巴西内马尔
巴西内马尔
我截取的是桌面,是一张张图片,还没考虑到声音。
返回顶部
顶部