#include <opencv2/core.hpp> // 包含OpenCV核心功能头文件
#include <opencv2/videoio.hpp> // 包含OpenCV视频输入输出头文件
#include <opencv2/highgui.hpp> // 包含OpenCV高层GUI头文件
#include <iostream> // 包含标准输入输出流头文件
using namespace cv; // 使用cv命名空间中的所有标识符
using namespace std; // 使用std命名空间中的所有标识符
int main(int, char**)
{
Mat frame; // 定义一个Mat类型的变量,用来存储捕获的帧
vector<Mat> audioData; // 定义一个存储音频数据的向量
VideoCapture cap; // 初始化一个VideoCapture对象用于视频的捕获
vector<int> params { CAP_PROP_AUDIO_STREAM, 0,
CAP_PROP_VIDEO_STREAM, -1 }; // 定义初始化参数列表,指定音频流和视频流
cap.open(0, CAP_MSMF, params); // 使用参数列表打开摄像头设备
if (!cap.isOpened()) // 检查VideoCapture是否已成功打开
{
cerr << "ERROR! Can't to open microphone" << endl; // 若打开失败,输出错误信息
return -1; // 并返回-1
}
const int audioBaseIndex = (int)cap.get(CAP_PROP_AUDIO_BASE_INDEX); // 获取音频的基础索引
const int numberOfChannels = (int)cap.get(CAP_PROP_AUDIO_TOTAL_CHANNELS); // 获取音频通道总数
cout << "CAP_PROP_AUDIO_DATA_DEPTH: " << depthToString((int)cap.get(CAP_PROP_AUDIO_DATA_DEPTH)) << endl; // 输出音频数据的深度信息
cout << "CAP_PROP_AUDIO_SAMPLES_PER_SECOND: " << cap.get(CAP_PROP_AUDIO_SAMPLES_PER_SECOND) << endl; // 输出每秒音频样本数
cout << "CAP_PROP_AUDIO_TOTAL_CHANNELS: " << numberOfChannels << endl; // 输出音频通道总数
cout << "CAP_PROP_AUDIO_TOTAL_STREAMS: " << cap.get(CAP_PROP_AUDIO_TOTAL_STREAMS) << endl; // 输出音频流总数
const double cvTickFreq = getTickFrequency(); // 获取cup的频率
int64 sysTimeCurr = getTickCount(); // 记录系统当前的时刻
int64 sysTimePrev = sysTimeCurr; // 将当前时刻设置为之前的时刻,初始化用
while ((sysTimeCurr-sysTimePrev)/cvTickFreq < 10) // 当时间差小于10秒时循环
{
if (cap.grab()) // 捕获一帧数据
{
for (int nCh = 0; nCh < numberOfChannels; nCh++) // 遍历所有音频通道
{
cap.retrieve(frame, audioBaseIndex+nCh); // 提取音频数据
audioData.push_back(frame); // 将音频数据添加到向量中
sysTimeCurr = getTickCount(); // 更新当前时刻
}
}
else
{
cerr << "Grab error" << endl; // 如果捕获错误,则输出错误信息
break; // 并退出循环
}
}
int numberOfSamles = 0; // 初始化样本数
for (auto item : audioData) // 遍历所有捕获的音频数据
numberOfSamles+=item.cols; // 计算样本总数
cout << "Number of samples: " << numberOfSamles << endl; // 输出样本总数
return 0; // 返回0,正常结束程序
}
这段代码使用OpenCV库实现了视频和音频的捕获功能。它首先初始化并配置一个视频捕获对象,设置好参数以便使用摄像头设备来捕获音频流(关闭视频流)。程序会检查设备是否成功打开,并输出音频参数的相关信息。然后,它将进入循环,持续10秒钟内,捕获音频流的数据,并将每个音频帧放入一个向量容器中。循环完成后,程序计算出所捕获的音频样本数,并在控制台中输出结果。如果在任何时间点捕获失败,它将输出错误信息然后退出循环。最终,程序正常结束,并返回0。
终端输出:
CAP_PROP_AUDIO_DATA_DEPTH: CV_16S
CAP_PROP_AUDIO_SAMPLES_PER_SECOND: 44100
CAP_PROP_AUDIO_TOTAL_CHANNELS: 2
CAP_PROP_AUDIO_TOTAL_STREAMS: 1
Number of samples: 869590