【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
相关推荐
2501_931819702 分钟前
虚拟文化体验翻译:虚拟体验场景名称的文化适配与多语呈现
人工智能
AIGS00118 分钟前
企业AI落地:Agent OS 治理框架实践
java·大数据·人工智能·机器学习·人工智能ai大模型应用
江华森37 分钟前
【玩转 AtomCode】隐藏高级功能挖掘:MCP、Hooks、Skills、Plugin 完全指南
人工智能
qq_291579251 小时前
AI电商主图视频在线生成:技术解析、工具横评与实战指南
人工智能·音视频
风途科技~1 小时前
多参数水质在线监测设备—水环境实时管控解决方案
大数据·人工智能
lh17931 小时前
数据产业服务分类(53)——分类设计——数据能力集成
java·人工智能·分类
使用小功能大师1 小时前
从零到一:使用阿里云百炼搭建企业级 AI Agent 完全实战手册(2026超详细版)
人工智能·阿里云·云计算
十铭忘1 小时前
VideoMAE v2:使用双重掩码扩展视频掩码自编码器
人工智能
金色的暴发户1 小时前
一劳永逸解决Codex手机验证
前端·人工智能·开源
陕西企来客1 小时前
2026年7月本地化AI搜索引擎优化策略
人工智能