JavaCV
- 1.引入依赖
- 2.获取视频 (无声音)
- 3.获取音频 (无视频)
- 4.获取视频 + 音频 (分开获取)
1.引入依赖
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>javacv-platform</artifactId>
<version>1.5.7</version>
</dependency>
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>javacv</artifactId>
<version>1.5.7</version>
</dependency>
2.获取视频 (无声音)
package com.jsxs.controller;
import javax.swing.JFrame;
import org.bytedeco.ffmpeg.global.avcodec;
import org.bytedeco.javacv.CanvasFrame;
import org.bytedeco.javacv.FFmpegFrameRecorder;
import org.bytedeco.javacv.OpenCVFrameGrabber;
import java.io.*;
public class Video_Start {
public static void main(String[] args) throws IOException, InterruptedException {
OpenCVFrameGrabber grabber = new OpenCVFrameGrabber(0);
grabber.start();
System.out.println("开始新建摄像头窗口");
String canasName = "摄像头窗口";
CanvasFrame canvas = new CanvasFrame(canasName);
System.out.println("窗口设置");
canvas.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
canvas.setVisible(true);
FFmpegFrameRecorder recorder = new FFmpegFrameRecorder("E://output.mp4", grabber.getImageWidth(), grabber.getImageHeight(),1);
recorder.setFormat("mp4");
recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264);
recorder.setFrameRate(65);
recorder.setVideoBitrate(2000000);
recorder.start();
while (canvas.isDisplayable()) {
canvas.showImage(grabber.grab());
recorder.record(grabber.grab());
}
System.out.println("调用了关闭摄像头按钮");
grabber.stop();
recorder.stop();
}
}

3.获取音频 (无视频)
package com.jsxs.controller;
import java.io.File;
import java.util.concurrent.TimeUnit;
import javax.sound.sampled.AudioFileFormat;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.TargetDataLine;
public class AudioRecode {
public static void recode() throws Exception {
String path = "E://first.wav";
AudioFormat format = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, 44100, 16, 2, 4, 44100, true);
DataLine.Info info = new DataLine.Info(TargetDataLine.class,format);
TargetDataLine tDataLine = (TargetDataLine)AudioSystem.getLine(info);
tDataLine.open(format);
tDataLine.start();
Thread audioThd = new Thread(new Runnable() {
@Override
public void run() {
AudioInputStream in = new AudioInputStream(tDataLine);
try {
System.out.println("开始录音");
File saveFile = new File(path);
AudioSystem.write(in, AudioFileFormat.Type.WAVE, saveFile);
} catch (Exception e) {
e.printStackTrace();
return;
}
}
});
audioThd.start();
TimeUnit.SECONDS.timedJoin(audioThd, 10);
if (audioThd.isAlive()){
audioThd.interrupt();
}
System.out.println("录音结束");
}
public static void main(String[] args) throws Exception {
recode();
}
}

4.获取视频 + 音频 (分开获取)
package com.jsxs.controller;
import org.bytedeco.ffmpeg.global.avcodec;
import org.bytedeco.javacv.CanvasFrame;
import org.bytedeco.javacv.FFmpegFrameRecorder;
import org.bytedeco.javacv.OpenCVFrameGrabber;
import javax.sound.sampled.*;
import javax.swing.*;
import java.io.File;
import java.io.IOException;
import java.util.concurrent.TimeUnit;
public class video_audio {
public static void main(String[] args) throws IOException, InterruptedException {
OpenCVFrameGrabber grabber = new OpenCVFrameGrabber(0);
grabber.start();
System.out.println("开始新建摄像头窗口");
String canasName = "摄像头窗口";
CanvasFrame canvas = new CanvasFrame(canasName);
System.out.println("窗口设置");
canvas.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
canvas.setVisible(true);
FFmpegFrameRecorder recorder = new FFmpegFrameRecorder("E://output.mp4", grabber.getImageWidth(), grabber.getImageHeight(), 1);
recorder.setFormat("mp4");
recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264);
recorder.setFrameRate(25);
recorder.setVideoBitrate(2000000);
Thread audio = new Thread(() -> {
try {
recode();
} catch (Exception e) {
e.printStackTrace();
}
});
audio.start();
recorder.start();
while (canvas.isDisplayable()) {
canvas.showImage(grabber.grab());
recorder.record(grabber.grab());
}
System.out.println("关闭录音中...");
audio.stop();
System.out.println("录音关闭完成00");
System.out.println("关闭相机中...");
grabber.stop();
recorder.stop();
System.out.println("相机关闭成功");
}
public static void recode() throws Exception {
String path = "E://first.wav";
AudioFormat format = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, 44100, 16, 2, 4, 44100, true);
DataLine.Info info = new DataLine.Info(TargetDataLine.class, format);
TargetDataLine tDataLine = (TargetDataLine) AudioSystem.getLine(info);
tDataLine.open(format);
tDataLine.start();
AudioInputStream in = new AudioInputStream(tDataLine);
try {
System.out.println("开始录音");
File saveFile = new File(path);
AudioSystem.write(in, AudioFileFormat.Type.WAVE, saveFile);
} catch (Exception e) {
e.printStackTrace();
return;
}
}
}
