【opencv】示例-videocapture_microphone.cpp 使用OpenCV库实现的音频捕获

cpp 复制代码
#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。

终端输出:

properties 复制代码
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
相关推荐
johnny23334 分钟前
AI工作流编排平台
人工智能
百***35481 小时前
DeepSeek在情感分析中的细粒度识别
人工智能
Qzkj6661 小时前
从规则到智能:企业数据分类分级的先进实践与自动化转型
大数据·人工智能·自动化
weixin79893765432...2 小时前
React + Fastify + DeepSeek 实现一个简单的对话式 AI 应用
人工智能·react.js·fastify
大千AI助手2 小时前
概率单位回归(Probit Regression)详解
人工智能·机器学习·数据挖掘·回归·大千ai助手·概率单位回归·probit回归
狂炫冰美式3 小时前
3天,1人,从0到付费产品:AI时代个人开发者的生存指南
前端·人工智能·后端
LCG元3 小时前
垂直Agent才是未来:详解让大模型"专业对口"的三大核心技术
人工智能
aqi003 小时前
FFmpeg开发笔记(八十九)基于FFmpeg的直播视频录制工具StreamCap
ffmpeg·音视频·直播·流媒体
我不是QI3 小时前
周志华《机器学习—西瓜书》二
人工智能·安全·机器学习
操练起来4 小时前
【昇腾CANN训练营·第八期】Ascend C生态兼容:基于PyTorch Adapter的自定义算子注册与自动微分实现
人工智能·pytorch·acl·昇腾·cann