【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
相关推荐
人工不智能5773 小时前
拆解 BERT:Output 中的 Hidden States 到底藏了什么秘密?
人工智能·深度学习·bert
盟接之桥3 小时前
盟接之桥说制造:引流品 × 利润品,全球电商平台高效产品组合策略(供讨论)
大数据·linux·服务器·网络·人工智能·制造
kfyty7253 小时前
集成 spring-ai 2.x 实践中遇到的一些问题及解决方案
java·人工智能·spring-ai
h64648564h4 小时前
CANN 性能剖析与调优全指南:从 Profiling 到 Kernel 级优化
人工智能·深度学习
数据与后端架构提升之路4 小时前
论系统安全架构设计及其应用(基于AI大模型项目)
人工智能·安全·系统安全
忆~遂愿4 小时前
ops-cv 算子库深度解析:面向视觉任务的硬件优化与数据布局(NCHW/NHWC)策略
java·大数据·linux·人工智能
Liue612312314 小时前
YOLO11-C3k2-MBRConv3改进提升金属表面缺陷检测与分类性能_焊接裂纹气孔飞溅物焊接线识别
人工智能·分类·数据挖掘
一切尽在,你来4 小时前
第二章 预告内容
人工智能·langchain·ai编程
23遇见4 小时前
基于 CANN 框架的 AI 加速:ops-nn 仓库的关键技术解读
人工智能
Codebee4 小时前
OoderAgent 企业版 2.0 发布的意义:一次生态战略的全面升级
人工智能