如何以编程方式更改用于播放和录制的默认默认音频设备?
是否有任何注册表设置,如窗口XP中的声音管理器?
这是哪个API?
我正在尝试用我的AutoHotkey应用程序播放24位音频文件.它只使用SoundPlay.Windows 7没有问题,但Windows XP用户无法播放24位文件.
该文件说:
所有Windows操作系统都应该能够播放.wav文件.但是,如果操作系统上未安装正确的编解码器或功能,则其他文件(.mp3,.avi等)可能无法播放.
文章中提到的可能的修复方法如何在Windows Media Player中播放24位WAV文件正在修复Windows Media Player的问题,但不适用于autohotkey:
分步指南
预期行为:Windows Media Player和AutoHotkey应用程序中的音频文件回放没有错误.实际行为:仅在Windows Media Player中播放没有错误的音频文件,并且不在Windows XP下的AutoHotkey应用程序中播放.
进一步的调查
正如AutoHotKey论坛中所提到的,SoundPlay在底层使用mciSendString,可以通过直接调用来获取有关错误性质的更多信息.
使用mciSendString替代DLL调用我得到错误消息320,它对应于MCIERR_WAVE_OUTPUTSINUSE
所有可以播放当前格式文件的波形设备都在使用中.等到其中一个设备空闲; 然后,再试一次.
如何在AutoHotkey应用程序中在Windows XP中播放24位音频文件?
基于SoundPlay的测试应用(下载)
#NoEnv
SetWorkingDir %A_ScriptDir%
FileSelectFile, f
SoundPlay, %f%
Msgbox, You should hear audio - except for 24bit wave files under Windows XP.
Run Code Online (Sandbox Code Playgroud)
基于MCI的测试应用程序(下载)
#NoEnv
SetWorkingDir %A_ScriptDir%
FileSelectFile, f …Run Code Online (Sandbox Code Playgroud) 几年前,我在DShow/DSound周围编写了一些util库,让我在Windows C++应用程序中播放MP3.这仍然是在C++/MFC应用程序中执行此操作的常规方法,还是已经包含在常规Windows API中的DirectX区域?
我们的动机就是使用标准的Windows PlaySound方法进行WAV,并且希望能够使用类似的简单API来播放MP3,这些API可以是Windows提供的,也可以是我们编写的用于包装更复杂功能的东西.
编辑:这是一个大型的商业闭源项目.我们只想简单地玩游戏,为图书馆付出很多钱不会飞.
简而言之,我有一个C#应用程序执行大量mciSendString调用(通过dllimport)来控制wav文件播放(基本上是打开,播放,暂停,停止,状态,关闭).运行一段时间后,应用程序崩溃,恕不另行通知"访问冲突".
即使我从我的vs2012运行应用程序,视觉工作室也没有抓住异常.即使有'强行突破异常'选项,我也没有运气从vs2012调试这个.所以我设置WER来生成崩溃转储,我使用windbg和psscor2.dll插件来调试它.
然后按顺序,使用以下命令,这是我得到的(为了可读性而缩短为必要的):
$>.ecxr
eax=00000001 ebx=00000000 ecx=00000401 edx=00000000 esi=049725b8 edi=00000002
eip=4e88159e esp=0a4efa38 ebp=0a4efa54 iopl=0 nv up ei pl nz ac pe nc
cs=0023 ss=002b ds=002b es=002b fs=0053 gs=002b efl=00010216
<Unloaded_mciwave.dll>+0x159e:
4e88159e ?? ???
Run Code Online (Sandbox Code Playgroud)
$>〜*KB
# 19 Id: 105c.28cc Suspend: 1 Teb: 7ef06000
Unfrozen
user32!NtUserGetMessage+0x15
user32!GetMessageA+0xa1
winmm!mciwindow+0x102
kernel32!BaseThreadInitThunk+0xe
ntdll!__RtlUserThreadStart+0x70
ntdll!_RtlUserThreadStart+0x1b
# 30 Id: 105c.15f8 Suspend: 0 Teb: 7ef1b000 Unfrozen
ntdll!ZwWaitForMultipleObjects+0x15
KERNELBASE!WaitForMultipleObjectsEx+0x100
kernel32!WaitForMultipleObjectsExImplementation+0xe0
kernel32!WaitForMultipleObjects+0x18
kernel32!WerpReportFaultInternal+0x186
kernel32!WerpReportFault+0x70
kernel32!BasepReportFault+0x20
kernel32!UnhandledExceptionFilter+0x1af
ntdll!__RtlUserThreadStart+0x62
ntdll!_EH4_CallFilterFunc+0x12
ntdll!_except_handler4+0x8e
ntdll!ExecuteHandler2+0x26
ntdll!ExecuteHandler+0x24
ntdll!RtlDispatchException+0x127
ntdll!KiUserExceptionDispatcher+0xf
WARNING: Frame IP not in any known …Run Code Online (Sandbox Code Playgroud) 当文件的路径+文件名很长时,我注意到了
PlaySound(fName.c_str(), NULL, SND_ASYNC);
Run Code Online (Sandbox Code Playgroud)
有效,但不是
mciSendString((L"open \"" + fName + L"\" type waveaudio alias sample").c_str(), NULL, 0, NULL);
mciSendString(L"play sample", NULL, 0, NULL);
Run Code Online (Sandbox Code Playgroud)
失败命令的示例:
打开 "C:\ qisdjqldlkjsqdjqdqjslkdjqlksjlkdjqsldjlqjsdjqdksq\dajdjqjdlqjdlkjazejoizajoijoifjoifjdsfjsfszjfoijdsjfoijdsoifoidsjfojdsofjdsoijfoisjfoijoisdjfosjfqsd\Windows重要Stop.wav" 类型waveaudio别名样本
但:
我真的需要mciSendString而不是PlaySound(),因为PlaySound()不播放某些文件(48 khz音频文件,有时是24位文件等)
我需要能够播放具有可能长路径的音频文件,因为我的应用程序的最终用户可能有这样的文件
如何让mciSendString接受长文件名?
笔记:
我也尝试使用mciSendCommand这个MSDN示例,但它是一样的.
最大路径+文件名长度为127(127:工作,128 +:不工作)
如果真的不可能让mci*函数使用超过127个字符的文件名,那么我可以用winapi(没有外部库)来代替它吗?(PlaySound不是一个选项,因为不能与所有wav文件一起使用,例如48 khz:非工作等)
我正在尝试使用 Playsound 播放代码文件夹中的文件,但是每次运行代码时,它似乎都能够调用该文件,但我总是收到以下输出:
playsound.PlaysoundException:
Error 277 for command:
open "para.mp3" alias playsound_0.9208788744295284
A problem occurred in initializing MCI.
Run Code Online (Sandbox Code Playgroud)
运行的代码只是playsound函数的使用:
from playsound import playsound
playsound("01. Humongous.mp3")
Run Code Online (Sandbox Code Playgroud)
我不确定这是否只是我的机器的问题还是我缺少的东西?
我正在尝试使用一段代码打开和关闭计算机的CD托盘.我一直在使用MCI命令,并包含winmm.lib在我的项目配置的其他依赖项中.我已经包括了windows.h和mmsystem.h为好.
我正在使用的代码如下:
mciSendCommand(0, MCI_SET, MCI_SET_DOOR_OPEN, NULL);
mciSendCommand(1, MCI_SET, MCI_SET_DOOR_CLOSED, NULL);
Run Code Online (Sandbox Code Playgroud)
代码构建并运行良好,没有CD托盘操作正在进行!任何人都可以建议我如何适应这个?
我正在尝试使用mci函数编写mp3播放器。(win 7 64bit,vs2010,c ++)
当我尝试播放带有“等待”标志的mp3文件时,我可以听到该文件,但其他所有内容都会卡住,直到文件结束播放为止,如果我删除了“等待”标志,我可以继续工作但听不到任何声音。
这是代码示例:
unsigned long __stdcall PlayThread(void *myParam)
{
char* nameOfMp3 = (char*)myParam;
char* cmd = new char[MAX_PATH];
sprintf(cmd,"open \"%s\" type MPEGvideo alias myFile",nameOfMp3);
mciSendString(cmd,NULL,0,0);
mciSendString("play myFile wait",NULL,0,0);//here is the "wait" flag
mciSendString("close myFile",NULL,0,0);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我删除了对mci推荐返回值的检查,但是我已经对其进行了仔细检查,在两种情况下都可以。
难道我做错了什么?
我正在尝试在我正在做的一个项目中播放一些 mp3 文件作为背景音乐。我尝试使用 mcisendstring 播放它,但它无法工作:(
这些是我所做的:
CMP3_MCI myMp3;
std::string address= "C:\\Users\\music embed testing\\test.mp3";
myMp3.Load(address);
myMp3.Play();
Run Code Online (Sandbox Code Playgroud)
//加载函数
void Load(string szFileName)
{
m_szFileName = szFileName;
Load2();
}
Run Code Online (Sandbox Code Playgroud)
//加载2函数
void Load2()
{
std::string szCommand = "open \"" + GetFileName() + "\" type mpegvideo alias " + GetFileName();
mciSendString(szCommand.c_str(), NULL, 0, 0);
}
Run Code Online (Sandbox Code Playgroud)
//播放函数
void Play()
{
std::string szCommand = "play " + GetFileName() + " from 0";
mciSendString(szCommand.c_str(), NULL, 0, 0);
}
Run Code Online (Sandbox Code Playgroud)
//getFileName 基本上返回存储为私有属性的 m_szFileName
我有一个MP3播放器发送MCI命令来播放暂停/ ff/rw /停止音频文件等,唯一我无法弄清楚怎么办是发送一个MCI命令告诉它播放下一首歌时目前一个人已经完成了比赛.
歌曲在ListBox中.我没有问题,实际上选择下一首歌曲,我只需要找出当播放下一首歌曲的播放列表.我会感激任何帮助
谢谢 :)
mci ×10
audio ×5
c++ ×4
winapi ×4
mp3 ×2
visual-c++ ×2
windows ×2
audio-player ×1
autohotkey ×1
c# ×1
clr ×1
codec ×1
command ×1
directshow ×1
next ×1
python ×1
python-3.x ×1
windbg ×1
windows-xp ×1
winforms ×1
winmm ×1