吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 804|回复: 12
收起左侧

[求助] 各位老师,C++代码如何检测音频文件正在播放呢?

[复制链接]
jtwc 发表于 2023-10-3 20:28
各位老师,C++代码如何检测音频文件有没有正在播放呢?用C++写一个监控程序,当监控检测到1.wav的文件发出声音时(确定为wav格式),监控程序马上把1写入文件a.csv。下面的代码不管用,该如何改呢?
[C++] 纯文本查看 复制代码
#include <iostream>
#include <fstream>
#include <Windows.h>
#include <sstream>

#include <mmsystem.h>

#pragma comment(lib, "winmm.lib")

int main() {
	std::string wavFile = "D:\\1.wav";
	std::string csvFile = "a.csv";
	while (true) {
		// 监控文件
		HANDLE hFile = CreateFile(wavFile.c_str(), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
		if (hFile == INVALID_HANDLE_VALUE) {
			std::cerr << "无法打开文件 " << wavFile << std::endl;
			return 1;
		}

		// 创建CSV文件
		std::ofstream csv(csvFile);
		if (!csv) {
			std::cerr << "无法创建文件 " << csvFile << std::endl;
			CloseHandle(hFile);
			return 1;
		}

		// 监控文件声音
		DWORD bytesRead;
		BYTE buffer[44]; // WAV文件头部大小为44字节

		if (ReadFile(hFile, buffer, sizeof(buffer), &bytesRead, NULL)) {
			// 检查是否为WAV文件
			if (bytesRead == sizeof(buffer) && buffer[0] == 'R' && buffer[1] == 'I' && buffer[2] == 'F' && buffer[3] == 'F' && buffer[8] == 'W' && buffer[9] == 'A' && buffer[10] == 'V' && buffer[11] == 'E') {
				// 检查是否有声音
				if (buffer[22] != 0 || buffer[23] != 0) {
					// 检查文件是否正在播放声音
					if (waveOutGetNumDevs() > 0) {
						csv << "1" << std::endl;
						csv.flush();
						std::cout << "有声音" << std::endl;
					}
				}
				else {
					std::cout << "无声音" << std::endl;
				}
			}
		}
		// 关闭文件和句柄
		csv.close();
		CloseHandle(hFile);
		Sleep(1000); // 每隔0.1秒检查一次文件

		
	}

	system("pause");
	return 0;
}

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

huanghan89 发表于 2023-10-3 21:06
膜拜高手···
DEATHTOUCH 发表于 2023-10-3 22:22
waveOutGetNumDevs只是获取设备数量的,要判断有没有播放声音可以用WASAPI来环回录制,给你微软官方文档链接吧:

https://learn.microsoft.com/zh-c ... /capturing-a-stream
这个是捕获用的,用来录音

https://learn.microsoft.com/zh-c ... /loopback-recording
这个是环回录制,在捕获的基础上改一下代码就行了

不过WASAPI有一点点小麻烦

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
hrh123 + 1 + 1 热心回复!

查看全部评分

 楼主| jtwc 发表于 2023-10-4 09:53
DEATHTOUCH 发表于 2023-10-3 22:22
waveOutGetNumDevs只是获取设备数量的,要判断有没有播放声音可以用WASAPI来环回录制,给你微软官方文档链 ...

老师,谢谢了,有没有简单的方法,我只是检测有没有播放声音?
DEATHTOUCH 发表于 2023-10-4 19:40
jtwc 发表于 2023-10-4 09:53
老师,谢谢了,有没有简单的方法,我只是检测有没有播放声音?

找到了个更简单的方法:
https://learn.microsoft.com/zh-c ... diometerinformation
用这个接口获取某个设备当前播放情况。
使用IAudioMeterInformation::GetChannelsPeakValues方法获取峰值,如果峰值大于0说明在播放。

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
jtwc + 1 + 1 我很赞同!

查看全部评分

 楼主| jtwc 发表于 2023-10-5 10:32
DEATHTOUCH 发表于 2023-10-4 19:40
找到了个更简单的方法:
https://learn.microsoft.com/zh-cn/windows/win32/api/endpointvolume/nn-endp ...

谢谢老师
小雨网络 发表于 2023-10-6 14:28
[C++] 纯文本查看 复制代码
#include <iostream>
#include <fstream>
#include <SDL.h>
#include <SDL_mixer.h>

void writeToCSV(const std::string& csvFile) {
    std::ofstream csv(csvFile, std::ios::app);
    if (!csv) {
        std::cerr << "无法创建文件 " << csvFile << std::endl;
        return;
    }
    csv << "1" << std::endl;
    csv.close();
}

int main(int argc, char* argv[]) {
    if (SDL_Init(SDL_INIT_AUDIO) < 0) {
        std::cerr << "无法初始化SDL: " << SDL_GetError() << std::endl;
        return 1;
    }

    if (Mix_OpenAudio(22050, MIX_DEFAULT_FORMAT, 2, 4096) == -1) {
        std::cerr << "无法初始化SDL_mixer: " << Mix_GetError() << std::endl;
        return 2;
    }

    std::string wavFile = "1.wav";
    std::string csvFile = "a.csv";
    Mix_Chunk *sound = Mix_LoadWAV(wavFile.c_str());

    if (!sound) {
        std::cerr << "无法加载音频文件: " << Mix_GetError() << std::endl;
        return 3;
    }

    // 监控文件
    if (Mix_PlayChannel(-1, sound, 0) == -1) {
        std::cerr << "无法播放音频文件: " << Mix_GetError() << std::endl;
        return 4;
    } else {
        writeToCSV(csvFile);
        std::cout << "正在播放: " << wavFile << std::endl;
    }

    SDL_Delay(5000); // 假设音频文件长度至少为5秒,或使用Mix_Playing()进行检测。
    
    Mix_FreeChunk(sound);
    Mix_CloseAudio();
    SDL_Quit();

    return 0;
}

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
jtwc + 1 + 1 我很赞同!

查看全部评分

 楼主| jtwc 发表于 2023-10-7 13:24
小雨网络 发表于 2023-10-6 14:28
[mw_shl_code=cpp,true]#include
#include
#include

感谢老师
 楼主| jtwc 发表于 2023-10-7 13:27
小雨网络 发表于 2023-10-6 14:28
[mw_shl_code=cpp,true]#include
#include
#include

老师,下面这2个头文哪里有呢?#include <SDL.h>
#include <SDL_mixer.h>
小雨网络 发表于 2023-10-7 16:17
jtwc 发表于 2023-10-7 13:27
老师,下面这2个头文哪里有呢?#include
#include

去SDL官方库下载这两个
https://www.libsdl.org/

您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 19:34

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表