标签: mci

如何以编程方式更改默认声音播放设备?

如何以编程方式更改用于播放和录制的默认默认音频设备?

是否有任何注册表设置,如窗口XP中的声音管理器?

这是哪个API?

windows winapi mci visual-c++

12
推荐指数
3
解决办法
4万
查看次数

无法播放24位音频

我正在尝试用我的AutoHotkey应用程序播放24位音频文件.它只使用SoundPlay.Windows 7没有问题,但Windows XP用户无法播放24位文件.

文件说:

所有Windows操作系统都应该能够播放.wav文件.但是,如果操作系统上未安装正确的编解码器或功能,则其他文件(.mp3,.avi等)可能无法播放.

文章中提到的可能的修复方法如何在Windows Media Player播放24位WAV文件正在修复Windows Media Player的问题,但不适用于autohotkey:

分步指南

  1. 下载传统高清音频过滤器
  2. regsvr32.exe AudioTypeConvert.ax
  3. 在Windows媒体播放器(工作)和AHK(没有声音)中播放24位文件.
  4. 要卸载的regsvr32.exe/u AudioTypeConvert.ax

预期行为: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)

audio windows-xp autohotkey codec mci

10
推荐指数
1
解决办法
1707
查看次数

从Visual C++中播放mp3的最简单方法

几年前,我在DShow/DSound周围编写了一些util库,让我在Windows C++应用程序中播放MP3.这仍然是在C++/MFC应用程序中执行此操作的常规方法,还是已经包含在常规Windows API中的DirectX区域?

我们的动机就是使用标准的Windows PlaySound方法进行WAV,并且希望能够使用类似的简单API来播放MP3,这些API可以是Windows提供的,也可以是我们编写的用于包装更复杂功能的东西.

编辑:这是一个大型的商业闭源项目.我们只想简单地玩游戏,为图书馆付出很多钱不会飞.

audio winapi mp3 directshow mci

6
推荐指数
3
解决办法
2万
查看次数

如何找到"访问冲突"的来源

简而言之,我有一个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)

windbg winmm access-violation mci windows-error-reporting

6
推荐指数
1
解决办法
7767
查看次数

如果路径太长,mciSendString将不播放音频文件

当文件的路径+文件名很长时,我注意到了

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:非工作等)

c++ windows audio winapi mci

6
推荐指数
1
解决办法
948
查看次数

“初始化 MCI 时出现问题”播放声音问题

我正在尝试使用 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)

我不确定这是否只是我的机器的问题还是我缺少的东西?

python audio mci python-3.x python-playsound

6
推荐指数
2
解决办法
4万
查看次数

试图打开CD托盘

我正在尝试使用一段代码打开和关闭计算机的CD托盘.我一直在使用MCI命令,并包含winmm.lib在我的项目配置的其他依赖项中.我已经包括了windows.hmmsystem.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托盘操作正在进行!任何人都可以建议我如何适应这个?

c++ winapi mci

4
推荐指数
1
解决办法
5683
查看次数

mciSendString是否必须具有“ wait”才能听到声音?

我正在尝试使用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推荐返回值的检查,但是我已经对其进行了仔细检查,在两种情况下都可以。

难道我做错了什么?

c++ audio mp3 mci audio-player

3
推荐指数
1
解决办法
1288
查看次数

使用mci发送字符串C++播放MP3

我正在尝试在我正在做的一个项目中播放一些 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

c++ clr mci visual-c++

2
推荐指数
1
解决办法
9232
查看次数

唱完了吗?(C#MCI)

我有一个MP3播放器发送MCI命令来播放暂停/ ff/rw /停止音频文件等,唯一我无法弄清楚怎么办是发送一个MCI命令告诉它播放下一首歌时目前一个人已经完成了比赛.

歌曲在ListBox中.我没有问题,实际上选择下一首歌曲,我只需要找出播放下一首歌曲的播放列表.我会感激任何帮助

谢谢 :)

c# command next mci winforms

1
推荐指数
1
解决办法
3935
查看次数