标题:mciSendString 函数
只看楼主
yu965634383
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:119
专家分:195
注 册:2017-9-1
结帖率:100%
已结贴  问题点数:20 回复次数:12 
mciSendString 函数
mciSendString 函数 怎么进行循环播放音乐啊
搜索更多相关主题的帖子: 函数 循环 播放 音乐 
2017-10-15 13:53
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:2 
播放完重新再播放,是单个文件重播还是多个文件重播?
2017-10-15 15:51
yu965634383
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:119
专家分:195
注 册:2017-9-1
得分:0 
先单个
弄懂之后再看多个的
我这样写
mciSendStringA ("open \"C:\\Users\\yutang\\Desktop\\ZARD - 负けないで (live).wav\" alias mymusic" , 0 , 0 , NULL);//文件名有空格,则需要在路径的前后加上双引号的转义字符 \" ;

mciSendStringA ("play mymusic repeat" , NULL , 0 , NULL);
没有反应,一次都不播放


[此贴子已经被作者于2017-10-15 17:00编辑过]


菜鸟一枚,求各位大神多多关照。
2017-10-15 16:49
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:4 
Win10环境试了一下命令参数repeat,mciSendString返回的是“无效的命令参数”。
难道废了命令参数repeat?
可以自定义循环播放,如:
            int i;
            for (i=0; i<3; ++i)
            {
                mciSendString("play MyPlay wait", NULL, 0, 0);
                mciSendString("seek MyPlay to start", NULL, 0, 0);
            }


2017-10-15 21:55
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:4 
以下是引用吹水佬在2017-10-15 21:55:05的发言:

Win10环境试了一下命令参数repeat,mciSendString返回的是“无效的命令参数”。
难道废了命令参数repeat?
可以自定义循环播放,如:
            int i;
            for (i=0; i<3; ++i)
            {
                mciSendString("play MyPlay wait", NULL, 0, 0);
                mciSendString("seek MyPlay to start", NULL, 0, 0);
            }

也可用PlaySound做后台播放。
#include <stdio.h>
#include <windows.h>

typedef BOOL (WINAPI *PLAYSOUND)(LPCTSTR, HMODULE, DWORD);

int main(void)
{
    HMODULE hLib;
    hLib = LoadLibrary("Winmm.dll");
    if (hLib == 0) return 0;
    PLAYSOUND PlaySound = (PLAYSOUND)GetProcAddress(hLib, "PlaySound");
    if (PlaySound != 0)
    {
        PlaySound("C:\\TEMP\\test.wav", 0, SND_ASYNC|SND_LOOP);
        printf("按任一键...停止播放");
        getch();
        PlaySound(NULL, 0, SND_PURGE);
    }
    FreeLibrary(hLib);
    return 0;
}
2017-10-16 06:02
yu965634383
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:119
专家分:195
注 册:2017-9-1
得分:0 
好的,我试试看

菜鸟一枚,求各位大神多多关照。
2017-10-16 07:32
yu965634383
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:119
专家分:195
注 册:2017-9-1
得分:0 
MCIERROR mciError = mciSendStringA ("open C:\\Users\\yutang\\Desktop\\1.wav type avivideo alias mymusic" , buf1 , strlen (buf1) , NULL);//文件名有空格,则需要在路径的前后加上双引号的转义字符 \" ;
    puts (buf1);
    if (mciError)
    {
        mciGetErrorStringA (mciError , buf , strlen (buf));
        MessageBoxA (NULL ,buf , "警告" , 1);
    }

    mciSendStringA ("play mymusic repeat" , NULL , 0 , NULL);

我在文件名后面加了个播放方式的指令,就是type avivideo 这个,它居然可以重复播放了,这不是用来播放视频的吗?

我还有个问题: 文件路径可不可以用一个变量来代替啊?
我打算将上面的代码包装起来,写成一个新的函数,而函数的参数就是文件的路径。这样我就可以播放很多歌曲了。我在网上查了很久,但是好像没有这方面的,好郁闷啊。


[此贴子已经被作者于2017-10-17 00:42编辑过]


菜鸟一枚,求各位大神多多关照。
2017-10-17 00:39
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:4 
以下是引用yu965634383在2017-10-17 00:39:29的发言:

MCIERROR mciError = mciSendStringA ("open C:\\Users\\yutang\\Desktop\\1.wav type avivideo alias mymusic" , buf1 , strlen (buf1) , NULL);//文件名有空格,则需要在路径的前后加上双引号的转义字符 \" ;
    puts (buf1);
    if (mciError)
    {
        mciGetErrorStringA (mciError , buf , strlen (buf));
        MessageBoxA (NULL ,buf , "警告" , 1);
    }

    mciSendStringA ("play mymusic repeat" , NULL , 0 , NULL);

我在文件名后面加了个播放方式的指令,就是type avivideo 这个,它居然可以重复播放了,这不是用来播放视频的吗?

我还有个问题: 文件路径可不可以用一个变量来代替啊?
我打算将上面的代码包装起来,写成一个新的函数,而函数的参数就是文件的路径。这样我就可以播放很多歌曲了。我在网上查了很久,但是好像没有这方面的,好郁闷啊。

多谢经验分享
不要用strlen获取buf长度, strlen是以'\0'结束,只用来获取字符串长度,可用sizeof(buf)获取buf的大小。
文件名用字符串处理就可以,如:
MCIERROR mciPlay(char *szFileName)
{
    char cmd[1024]={0};
    sprintf(cmd, "%s%s%s", "open ", szFileName, " type avivideo alias mymusic");
    MCIERROR mciError = mciSendStringA(cmd, NULL, 0, 0);
    if (mciError)
        return mciError;
    return mciSendStringA("play mymusic repeat", NULL, 0, 0);
}

    char *szFileName = "C:\\Users\\yutang\\Desktop\\1.wav";
    MCIERROR mciError = mciPlay(szFileName);

[此贴子已经被作者于2017-10-17 09:16编辑过]

2017-10-17 07:11
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:2 
试了一下播放MP3,可以忽略type avivideo这个,能重复播放。
2017-10-17 07:14
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:3 
查了一下,这个设备类型(type device_type)也有讲究的。
在注册表看到有这些相关的MCI设备内容:



2017-10-17 10:37



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-481424-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.063052 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved