鱼C论坛

 找回密码
 立即注册
查看: 2041|回复: 19

[已解决]mp3怎么播放

[复制链接]
发表于 2019-1-30 01:48:51 From FishC Mobile | 显示全部楼层 |阅读模式
50鱼币
我知道playsound能播放mav文件,那mp3用什么播放啊,百度上说用mci可以实现,但是mci是什么啊,怎么用啊........
最佳答案
2019-1-30 01:48:52
本帖最后由 行客 于 2019-1-30 21:53 编辑

使用函数前必须应该包含头文件:#include<mmsystem.h>  

并导入库:#pragma comment<lib."winmm.lib">


mciSendString(TEXT("open C:/a.mp3 alias donglihuoche"),NULL,0,NULL);
mciSendString是用来播放多媒体文件的API指令。

该函数有四个参数:
第一个参数:要发送的命令字符串。对于程序员来说,可以把MCI理解为设备面板上的一排按键,通过选择不同的按键(发送不同的MCI命令)可以让设备完成各种功能,而不必关心设备内部实现。
      TEXT("open C:/a.mp3 alias donglihuoche")是一个字符串,等同于"open C:/a.mp3 alias donglihuoche"(TEXT是一个宏定义,只是为了表示这是一个字符串,没有其他实质性意义)。
      命令字符串:一般命令有 open、play 、close等。

      open为打开命令。格式为:open device_name type device_type alias device_alias
              device_name:设备名,一般使用文件名字。这里为C:/a.mp3
              type device_type:设备类型,可省略。这里进行了省略
              alias device_alias:设备别名,在以后操作时可以使用此名字,方便。alias是别名的意思。这里定义别名为donglihuoche,即alias donglihuoche。所以下面的play就可以使用别名donglihuoche了而不再需要使用文件路径。

第二个参数:接收返回信息的字符串,一般为NULL。这里设为NULL

第三个参数:接收返回信息字符串的大小,可设为0。这里设为0

第四个参数:回调窗口句柄,一般NULL。这里设为NULL


该函数返回值:函数执行成功返回零,否则返回错误代码

最佳答案

查看完整内容

使用函数前必须应该包含头文件:#include 并导入库:#pragma comment mciSendString(TEXT("open C:/a.mp3 alias donglihuoche"),NULL,0,NULL); mciSendString是用来播放多媒体文件的API指令。 该函数有四个参数: 第一个参数:要发送的命令字符串。对于程序员来说,可以把MCI理解为设备面板上的一排按键,通过选择不同的按键(发送不同的MCI命令)可以让设备完成各种功能,而不必关心设备内部实现。       T ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-1-30 01:48:52 | 显示全部楼层    本楼为最佳答案   
本帖最后由 行客 于 2019-1-30 21:53 编辑

使用函数前必须应该包含头文件:#include<mmsystem.h>  

并导入库:#pragma comment<lib."winmm.lib">


mciSendString(TEXT("open C:/a.mp3 alias donglihuoche"),NULL,0,NULL);
mciSendString是用来播放多媒体文件的API指令。

该函数有四个参数:
第一个参数:要发送的命令字符串。对于程序员来说,可以把MCI理解为设备面板上的一排按键,通过选择不同的按键(发送不同的MCI命令)可以让设备完成各种功能,而不必关心设备内部实现。
      TEXT("open C:/a.mp3 alias donglihuoche")是一个字符串,等同于"open C:/a.mp3 alias donglihuoche"(TEXT是一个宏定义,只是为了表示这是一个字符串,没有其他实质性意义)。
      命令字符串:一般命令有 open、play 、close等。

      open为打开命令。格式为:open device_name type device_type alias device_alias
              device_name:设备名,一般使用文件名字。这里为C:/a.mp3
              type device_type:设备类型,可省略。这里进行了省略
              alias device_alias:设备别名,在以后操作时可以使用此名字,方便。alias是别名的意思。这里定义别名为donglihuoche,即alias donglihuoche。所以下面的play就可以使用别名donglihuoche了而不再需要使用文件路径。

第二个参数:接收返回信息的字符串,一般为NULL。这里设为NULL

第三个参数:接收返回信息字符串的大小,可设为0。这里设为0

第四个参数:回调窗口句柄,一般NULL。这里设为NULL


该函数返回值:函数执行成功返回零,否则返回错误代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-1-30 08:56:19 | 显示全部楼层
这是系统的一个库,你直接仿造别人的代码根据你的需求修改一下就行了
参考这篇:
https://blog.csdn.net/jackson352 ... tm_source=blogxgwz5
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-1-30 16:51:26 | 显示全部楼层
BngThea 发表于 2019-1-30 08:56
这是系统的一个库,你直接仿造别人的代码根据你的需求修改一下就行了
参考这篇:
https://blog.csdn.net/ ...

看不懂啊,好多函数跟结构都比知道啥意思啊,百度上面的乱糟糟的看不懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-1-30 17:13:16 | 显示全部楼层
BngThea 发表于 2019-1-30 08:56
这是系统的一个库,你直接仿造别人的代码根据你的需求修改一下就行了
参考这篇:
https://blog.csdn.net/ ...

MCI_OPEN_PARMS 这个打开设备结构是什么啊mciOpen.lpstrDeviceType = "mpegvideo";这个赋值的字符串是什么啊,我百度它有四个成员怎么只赋值了两个,其他两个没用吗?mciSendCommand函数命令消息有几种呀MCI_PLAY_PARMS mciPlay这个播放用的结构是什么是,怎么赋值呀查百度太乱了,头都看晕了求大佬指点
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-1-30 17:27:28 | 显示全部楼层
本帖最后由 行客 于 2019-1-30 21:25 编辑

看你的帖子应该是想要命令行的。以下代码是非常简单、非常经济的在控制台下的MP3播放代码:
#include <windows.h>
#include <mmsystem.h>
#pragma comment(lib,"winmm.lib")


int main(int argc, char* argv[])
{
        mciSendString(TEXT("open C:/a.mp3 alias donglihuoche"),NULL,0,NULL);
        //mciSendString((LPCWSTR)("seek yeah to start"),0,0,0);
        mciSendString(TEXT("play donglihuoche"),NULL,0,NULL);
        //mciSendString((LPCWSTR)"close yeah",NULL,0,NULL);
        
        Sleep(100000000);

        return 0;
}

我刚刚进行了实际的编译并播放通过。如果有疑问,请继续跟帖。如果想要复杂的实现模式,再给你更为全面的方案。

附图:
1.png

帮助文档:
https://baike.baidu.com/item/mciSendString/2905255?fr=aladdin
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-1-30 17:43:54 | 显示全部楼层
print(result)print(result)print(result)print(result)print(result)print(result)print(result)print(result)print(result)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-1-30 18:10:07 | 显示全部楼层
5楼是控制台应用程序模式。这个是Windows应用程序的实现:
https://www.taodocs.com/p-84382723.html
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-1-30 19:12:05 | 显示全部楼层
行客 发表于 2019-1-30 17:27
看你的帖子应该是想要命令行的。以下代码是非常简单、非常经济的在控制台下的MP3播放代码:

不报错,但运行没声音呀 不会播放
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-1-30 19:50:44 | 显示全部楼层
wjp 发表于 2019-1-30 19:12
不报错,但运行没声音呀 不会播放

你的文件路径对吗?需要在C盘根目录下命名一个a.mp3文件。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-1-30 19:51:23 | 显示全部楼层
C:/a.mp3
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-1-30 19:52:34 | 显示全部楼层
肯定是可以正常播放的,我已经测试过了。还需要注意,你的a.mp3这个文件,是不是是正常的.mp3文件,如果文件没问题,那播放就没问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-1-30 20:54:03 | 显示全部楼层
行客 发表于 2019-1-30 19:52
肯定是可以正常播放的,我已经测试过了。还需要注意,你的a.mp3这个文件,是不是是正常的.mp3文件,如果文 ...

只能在C盘吗?有什么办法放着其他盘吗    我刚实验下,好像文件名不能包含空格,有空格也不行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-1-30 20:56:19 | 显示全部楼层
行客 发表于 2019-1-30 18:10
5楼是控制台应用程序模式。这个是Windows应用程序的实现:
https://www.taodocs.com/p-84382723.html

看不到,网速不好一直转圈圈
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-1-30 21:14:18 | 显示全部楼层
行客 发表于 2019-1-30 17:27
看你的帖子应该是想要命令行的。以下代码是非常简单、非常经济的在控制台下的MP3播放代码:

大佬第一个参数能详细解释下吗,看不太懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-1-30 21:17:49 | 显示全部楼层
本帖最后由 行客 于 2019-1-30 21:25 编辑

mciSendString(TEXT("open C:/a.mp3 alias donglihuoche"),NULL,0,NULL);
中的C:\a.mp3就是定义的播放的文件名,你也可以使用变量替代。
你说的第一行是指的这一行吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-1-30 22:21:44 | 显示全部楼层
行客 发表于 2019-1-30 21:38
使用函数前必须应该包含头文件:#include  

并导入库:#pragma comment

看懂了,谢谢大佬
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-1-30 22:30:33 | 显示全部楼层
行客 发表于 2019-1-30 01:48
使用函数前必须应该包含头文件:#include  

并导入库:#pragma comment

大佬能麻烦你在给我讲讲3楼我的问题吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-1-30 22:53:00 | 显示全部楼层
本帖最后由 行客 于 2019-1-30 23:00 编辑
wjp 发表于 2019-1-30 22:30
大佬能麻烦你在给我讲讲3楼我的问题吗


如果你看完了上面的mciSendString的介绍,这里应该也比较好理解。如果有疑问可继续跟帖。

mciSendCommand播放mp3文件

该函数与mciSendString函数不同,该函数是基于命令消息(定义的常量)的,而mciSendString函数的命令是基于字符串的

函数原型如下:

MCIERROR mciSendCommand(
MCIDEVICEID IDDevice, //设备的ID,打开是不用此参数,一般设置为NULL。强调一下,打开命令不需要此参数。
UINT uMsg, //命令消息,如:MIC_OPEN(与上述open字符串是等价的)
DWORD fdwCommand, //额外的命令标记,如:指定 MCI_OPEN_ALIAS&#160;则表明dwParam参数所指结构体中的lpOpen参数指向的为别名;若为MCI_OPEN_ELEMENT则表明lpOpen参数指向的为文件名

DWORD_PTR dwParam //为一结构指针,如:MCI_OPEN_PARMS(打开是所需的结构体)、MCI_PLAY_PARMS(播放是所需的结构体)、MCI_GENERIC_PARMS(结束时所需的结构体)
);



MCI_OPEN_PARMS open;//定义打开结构体变量
open.lpstrElementName = _T("res\\和兰花在一起.mp3");//填充参数
mciSendCommand(NULL,MCI_OPEN,MCI_OPEN_ELEMENT,DWORD_PTR(&open));//打开
MCI_PLAY_PARMS play;//定义播放结构题变量
mciSendCommand(open.wDeviceID,MCI_PLAY,MCI_WAIT,DWORD_PTR(&play));//播放,此处是阻塞模式,播放完后才返回。也可以指定为0

//////////////////////////////////////////////当不需要播放时,关闭

MCI_GENERIC_PARMS close;
mciSendCommand(DeviceID,MCI_CLOSE,0,DWORD_PTR(&close));

DeviceID与打开时的ID一致

这种方式和上面的播放是一样的作用,但效率要高些。

我修改了以下代码,请你参考:
// mciSendString.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

#include <windows.h>
#include <mmsystem.h>
#pragma comment(lib,"winmm.lib")


int main(int argc, char* argv[])
{
//         mciSendString(TEXT("open C:/a.mp3 alias shanv"),NULL,0,NULL);
//         //mciSendString((LPCWSTR)("seek yeah to start"),0,0,0);
//         mciSendString(TEXT("play shanv"),NULL,0,NULL);
//         //mciSendString((LPCWSTR)"close yeah",NULL,0,NULL);
//         
//         Sleep(100000000);


        MCI_OPEN_PARMS op;
        op.dwCallback=NULL;
        op.lpstrAlias=NULL;
        op.lpstrDeviceType=TEXT("MPEGAudio"); //设备类型,大多数文件可以这样设置
        op.lpstrElementName=TEXT("C:\\a.mp3") ;//文件路径
        op.wDeviceID=NULL;                            //打开设备成功以后保存这个设备号备用
        UINT rs;                                                 //接受函数返回结果
        rs=mciSendCommand(NULL,MCI_OPEN,MCI_OPEN_ELEMENT ,(DWORD)&op);//发送命令打开设备,成功返回0,否则返回错误号,第三个参数这里必须MCI_OPEN_ELEMENT
                if(rs==0)             //设备打开成功就播放文件
                {
                        MCI_PLAY_PARMS pp;
                        pp.dwCallback=NULL;
                        pp.dwFrom=0;                      //开始播放的位置
                        mciSendCommand(op.wDeviceID,MCI_PLAY,MCI_WAIT,(DWORD)&pp);//播放文件,如果第三个参数设为MCI_WAIT则程序窗口会被阻塞,为了避免这种情况可以设为MCI_NOTIFY ,这两个标志的详细区别请见MSDN,区别不小哦。
                }

                MCI_GENERIC_PARMS gp;
                gp.dwCallback=NULL;
                mciSendCommand(op.wDeviceID,MCI_CLOSE,MCI_WAIT,(DWORD)&gp);


        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-1-30 23:09:58 | 显示全部楼层
行客 发表于 2019-1-30 22:53
如果你看完了上面的mciSendString的介绍,这里应该也比较好理解。如果有疑问可继续跟帖。

mciSendCo ...

下面你写的看懂了,谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-3 06:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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