wjp 发表于 2019-1-30 01:48:51

mp3怎么播放

我知道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


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

BngThea 发表于 2019-1-30 08:56:19

这是系统的一个库,你直接仿造别人的代码根据你的需求修改一下就行了
参考这篇:
https://blog.csdn.net/jackson35296/article/details/2479393?utm_source=blogxgwz5

wjp 发表于 2019-1-30 16:51:26

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

{:10_266:}看不懂啊,好多函数跟结构都比知道啥意思啊{:10_266:},百度上面的乱糟糟的看不懂{:10_266:}

wjp 发表于 2019-1-30 17:13:16

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

MCI_OPEN_PARMS 这个打开设备结构是什么啊{:10_266:}mciOpen.lpstrDeviceType = "mpegvideo";这个赋值的字符串是什么啊,我百度它有四个成员怎么只赋值了两个{:10_266:},其他两个没用吗?{:10_266:}mciSendCommand函数命令消息有几种呀{:10_266:}MCI_PLAY_PARMS mciPlay这个播放用的结构是什么是,怎么赋值呀{:10_266:}{:10_266:}查百度太乱了,头都看晕了{:10_266:}求大佬指点{:10_245:}

行客 发表于 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;
}

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

附图:


帮助文档:
https://baike.baidu.com/item/mciSendString/2905255?fr=aladdin

qq532401019 发表于 2019-1-30 17:43:54

print(result)print(result)print(result)print(result)print(result)print(result)print(result)print(result)print(result)

行客 发表于 2019-1-30 18:10:07

5楼是控制台应用程序模式。这个是Windows应用程序的实现:
https://www.taodocs.com/p-84382723.html

wjp 发表于 2019-1-30 19:12:05

行客 发表于 2019-1-30 17:27
看你的帖子应该是想要命令行的。以下代码是非常简单、非常经济的在控制台下的MP3播放代码:




不报错,但运行没声音呀 不会播放

行客 发表于 2019-1-30 19:50:44

wjp 发表于 2019-1-30 19:12
不报错,但运行没声音呀 不会播放

你的文件路径对吗?需要在C盘根目录下命名一个a.mp3文件。

行客 发表于 2019-1-30 19:51:23

C:/a.mp3

行客 发表于 2019-1-30 19:52:34

肯定是可以正常播放的,我已经测试过了。还需要注意,你的a.mp3这个文件,是不是是正常的.mp3文件,如果文件没问题,那播放就没问题

wjp 发表于 2019-1-30 20:54:03

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

只能在C盘吗?有什么办法放着其他盘吗    我刚实验下,好像文件名不能包含空格,有空格也不行

wjp 发表于 2019-1-30 20:56:19

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

看不到,网速不好一直转圈圈{:10_266:}

wjp 发表于 2019-1-30 21:14:18

行客 发表于 2019-1-30 17:27
看你的帖子应该是想要命令行的。以下代码是非常简单、非常经济的在控制台下的MP3播放代码:




大佬第一个参数能详细解释下吗,看不太懂{:10_266:}

行客 发表于 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就是定义的播放的文件名,你也可以使用变量替代。
你说的第一行是指的这一行吗?

wjp 发表于 2019-1-30 22:21:44

行客 发表于 2019-1-30 21:38
使用函数前必须应该包含头文件:#include

并导入库:#pragma comment


看懂了,谢谢大佬{:10_254:}

wjp 发表于 2019-1-30 22:30:33

行客 发表于 2019-1-30 01:48
使用函数前必须应该包含头文件:#include

并导入库:#pragma comment


大佬能麻烦你在给我讲讲3楼我的问题吗{:10_266:}

行客 发表于 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 则表明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;
}

wjp 发表于 2019-1-30 23:09:58

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

mciSendCo ...

下面你写的看懂了{:10_266:},谢谢
页: [1]
查看完整版本: mp3怎么播放