【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
相关推荐
雍凉明月夜2 小时前
深度学习网络笔记Ⅱ(常见网络分类1)
人工智能·笔记·深度学习
北岛寒沫2 小时前
北京大学国家发展研究院 经济学辅修 经济学原理课程笔记(第十三课 垄断竞争)
人工智能·经验分享·笔记
AI营销实验室2 小时前
AI 工具何高质量的为销售线索打分?
大数据·人工智能
Wang201220132 小时前
RNN和LSTM对比
人工智能·算法·架构
xueyongfu2 小时前
从Diffusion到VLA pi0(π0)
人工智能·算法·stable diffusion
jackylzh2 小时前
配置pytorch环境,并调试YOLO
人工智能·pytorch·yolo
杜子不疼.2 小时前
AI Ping双款新模型同步免费解锁:GLM-4.7与MiniMax M2.1实测
人工智能
打码人的日常分享2 小时前
企业数据资产管控和数据治理解决方案
大数据·运维·网络·人工智能·云计算
百***78752 小时前
小米MiMo-V2-Flash深度解析:国产开源大模型标杆与海外AI接入方案
人工智能·开源
大数据追光猿2 小时前
【Prompt】Prompt Caching:原理、实现与高并发价值
人工智能·大模型·prompt·agent