【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
相关推荐
说私域33 分钟前
私域电商逆袭密码:AI 智能名片小程序与商城系统如何梦幻联动
人工智能·小程序
请站在我身后1 小时前
复现Qwen-Audio 千问
人工智能·深度学习·语言模型·语音识别
love you joyfully1 小时前
目标检测与R-CNN——paddle部分
人工智能·目标检测·cnn·paddle
AI视觉网奇1 小时前
Detected at node ‘truediv‘ defined at (most recent call last): Node: ‘truediv‘
人工智能·python·tensorflow
西西弗Sisyphus1 小时前
开放世界目标检测 Grounding DINO
人工智能·目标检测·计算机视觉·大模型
抓哇能手2 小时前
数据库系统概论
数据库·人工智能·sql·mysql·计算机
火云洞红孩儿2 小时前
基于AI IDE 打造快速化的游戏LUA脚本的生成系统
c++·人工智能·inscode·游戏引擎·lua·游戏开发·脚本系统
EasyNVR2 小时前
互联网视频云平台EasyDSS无人机推流直播技术如何助力野生动植物保护工作?
音视频·无人机·视频监控
悠着,大嘟嘟2 小时前
FFmpeg音频解码详解
ffmpeg·音视频
风清扬雨2 小时前
【计算机视觉】超简单!傅里叶变换的经典案例
人工智能·计算机视觉