首先感谢大神的分享:https://blog.csdn.net/eguid_1/article/details/52804246
以下是个人集合自己环境的分析和整理
1、实现功能
(1)抓取本地录音设备(即,话筒)的实时音频
(2)抓取本地摄像头实时视频
(3)音频与视频时两个线程分别进行的,互不干扰
(4)多8bit的音频转小字节序问题,请参考http://blog.csdn.net/eguid_1/article/details/52790848
(5)本章代码包含大量注释,用来阐述每个API的用法和作用
实际:需要实时监控多个摄像头并分析
2、代码实现
流的推送:本地环境中已经实现javacv推流到nginx-rtmp服务器
/**
* 推送/录制本机的音/视频(Webcam/Microphone)到流媒体服务器(Stream media server)
*
* @param WEBCAM_DEVICE_INDEX
* - 视频设备,本机默认是0
* @param AUDIO_DEVICE_INDEX
* - 音频设备,本机默认是4
* @param outputFile
* - 输出文件/地址(可以是本地文件,也可以是流媒体服务器地址)
* @param captureWidth
* - 摄像头宽
* @param captureHeight
* - 摄像头高
* @param FRAME_RATE
* - 视频帧率:最低 25(即每秒25张图片,低于25就会出现闪屏)
* @throws org.bytedeco.javacv.FrameGrabber.Exception
*/
public static void recordWebcamAndMicrophone(int WEBCAM_DEVICE_INDEX, int AUDIO_DEVICE_INDEX, String outputFile,
int captureWidth, int captureHeight, int FRAME_RATE) throws org.bytedeco.javacv.FrameGrabber.Exception {
long startTime = 0;
long videoTS = 0;
/**
* FrameGrabber 类包含:OpenCVFrameGrabber
* (opencv_videoio),C1394FrameGrabber, FlyCaptureFrameGrabber,
* OpenKinectFrameGrabber,PS3EyeFrameGrabber,VideoInputFrameGrabber, 和
* FFmpegFrameGrabber.
*/
OpenCVFrameGrabber grabber = new OpenCVFrameGrabber(WEBCAM_DEVICE_INDEX);
grabber.setImageWidth(captureWidth);
grabber.setImageHeight(captureHeight);
System.out.println("开始抓取摄像头...");
int isTrue = 0;// 摄像头开启状态
try {
grabber.start();
isTrue += 1;
} catch (org.bytedeco.javacv.FrameGrabber.Exception e2) {
if (grabber != null) {
try {
grabber.restart();
isTrue += 1;
} catch (org.bytedeco.javacv.FrameGrabber.Exception e) {
isTrue -= 1;
try {
grabber.stop();
} catch (org.bytedeco.javacv.FrameGrabber.Exception e1) {
isTrue -= 1;
}
}
}
}
if (isTrue < 0) {
System.err.println("摄像头首次开启失败,尝试重启也失败!");