/client/oim-fx/src/test/java/com/oim/test/video/DesktopSaveTest.java

https://github.com/oimchat/oim-fx · Java · 161 lines · 124 code · 23 blank · 14 comment · 5 complexity · 56d7b53ee60f303e55c99a1b9f8e1011 MD5 · raw file

  1. package com.oim.test.video;
  2. import java.awt.CardLayout;
  3. import java.awt.Color;
  4. import java.awt.FlowLayout;
  5. import java.awt.event.ActionEvent;
  6. import java.awt.event.ActionListener;
  7. import java.awt.image.BufferedImage;
  8. import javax.swing.JButton;
  9. import javax.swing.JFrame;
  10. import javax.swing.JLabel;
  11. import javax.swing.JPanel;
  12. import javax.swing.JTabbedPane;
  13. import org.bytedeco.javacpp.avcodec;
  14. import org.bytedeco.javacpp.avutil;
  15. import org.bytedeco.javacpp.opencv_core.IplImage;
  16. import org.bytedeco.javacv.FFmpegFrameRecorder;
  17. import org.bytedeco.javacv.Frame;
  18. import org.bytedeco.javacv.Java2DFrameConverter;
  19. import org.bytedeco.javacv.OpenCVFrameConverter;
  20. import com.oim.common.system.ClientRobot;
  21. import static org.bytedeco.javacpp.opencv_imgcodecs.cvLoadImage;
  22. public class DesktopSaveTest extends JFrame {
  23. private static final long serialVersionUID = 1L;
  24. JPanel basePanel = new JPanel();
  25. JPanel buttonPanel = new JPanel(new FlowLayout());
  26. JPanel tabPanel = new JPanel();
  27. JPanel ownPanel = new JPanel();
  28. JTabbedPane tabbedPane = new JTabbedPane();
  29. boolean start = false;
  30. public DesktopSaveTest() {
  31. this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  32. this.setTitle("桌面录制");
  33. this.setSize(480, 680);
  34. this.setResizable(false);
  35. this.setLocationRelativeTo(null);
  36. this.setLayout(null);
  37. this.add(basePanel);
  38. this.add(buttonPanel);
  39. initUI();
  40. init();
  41. }
  42. private void initUI() {
  43. tabPanel.setLayout(new CardLayout());
  44. tabPanel.add(tabbedPane);
  45. basePanel.setBounds(0, 0, 450, 550);
  46. buttonPanel.setBounds(0, 550, 480, 70);
  47. basePanel.setLayout(null);
  48. basePanel.add(tabPanel);
  49. basePanel.setBackground(new Color(125, 155, 52));
  50. tabPanel.setBounds(0, 0, 450, 275);
  51. JButton startButton = new JButton("开始");
  52. buttonPanel.add(startButton);
  53. startButton.addActionListener(new ActionListener() {
  54. public void actionPerformed(ActionEvent e) {
  55. start = true;
  56. }
  57. });
  58. JButton stopButton = new JButton("停止");
  59. buttonPanel.add(stopButton);
  60. stopButton.addActionListener(new ActionListener() {
  61. public void actionPerformed(ActionEvent e) {
  62. start = false;
  63. }
  64. });
  65. new ImageThread().start();
  66. }
  67. private void init() {
  68. final JLabel label = new JLabel();
  69. JPanel panel = new JPanel();
  70. panel.setLayout(new CardLayout());
  71. panel.add(label);
  72. // panel.setBackground(Color.red);
  73. tabbedPane.addTab("000", panel);
  74. }
  75. public static void main(String[] args) {
  76. DesktopSaveTest camera = new DesktopSaveTest();
  77. camera.setVisible(true);
  78. }
  79. class ImageThread extends Thread {
  80. String saveMp4name = "Temp/f1.mp4"; // 保存的视频名称
  81. FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(saveMp4name, 1920, 1080);
  82. OpenCVFrameConverter.ToIplImage conveter = new OpenCVFrameConverter.ToIplImage();
  83. Java2DFrameConverter converter = new Java2DFrameConverter();
  84. long time = 0;
  85. boolean has = false;
  86. public void run() {
  87. recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264);// 28
  88. //recorder.setVideoCodec(avcodec.AV_CODEC_ID_FLV1);// 28
  89. // recorder.setVideoCodec(avcodec.AV_CODEC_ID_MPEG4); // 13
  90. recorder.setFormat("mp4");
  91. // recorder.setFormat("mov,mp4,m4a,3gp,3g2,mj2,h264,ogg,MPEG4");
  92. recorder.setFrameRate(20);
  93. recorder.setPixelFormat(avutil.AV_PIX_FMT_BGR24);
  94. //recorder.setPixelFormat(0);// yuv420p
  95. //recorder.setPixelFormat(7);
  96. while (true) {
  97. try {
  98. createImage();
  99. sleep(50);
  100. } catch (InterruptedException e) {
  101. e.printStackTrace();
  102. }
  103. }
  104. }
  105. public void createImage() {
  106. if (start) {
  107. try {
  108. if (!has) {
  109. recorder.start();
  110. has = true;
  111. }
  112. BufferedImage img = ClientRobot.getScreen();
  113. //IplImage..createFrom(img);
  114. //IplImage image = cvLoadImage("");
  115. Frame frame = converter.convert(img);
  116. // IplImage image = conveter.convert(frame);
  117. recorder.record(frame);
  118. // 释放内存? cvLoadImage(fname); // 非常吃内存!!
  119. // opencv_core.cvReleaseImage(image);
  120. //recorder.re
  121. } catch (Exception e) {
  122. // TODO: handle exception
  123. }
  124. } else {
  125. if (has) {
  126. try {
  127. recorder.stop();
  128. recorder.release();
  129. has = false;
  130. } catch (org.bytedeco.javacv.FrameRecorder.Exception e) {
  131. // TODO Auto-generated catch block
  132. e.printStackTrace();
  133. }
  134. }
  135. }
  136. }
  137. }
  138. }