提示:本文需要一定的c编程基础
前言
最近应用程序发现py播放music的库有点不会弄,网上推荐的pygame播放MP3
会严重失真,文档少,其他的库运行老是失败,既然python可以联合c 那不如就用c的mci。
还能学会如何用python调用c,一箭双雕啊🧑💻
一、安装ANACONDA
ANACONDA 是一个可以管理python包的工具,会python的应该都知道,现在用这个防止因为包版本不一样而不能使用。
推荐博文
安装好后自带ctypes库,这个库可以帮我们和c交流🤪
二、使用步骤
1.编写py代码
代码如下(示例):
from ctypes import *
music = CDLL("Project7") # 加载dll 不用加后缀名
_str = b"m.mp3"
music.playMusic(_str)
input() # 暂停不让程序结束
首先在你的相对路径放一个mp3文件
字符串前面一定要b修饰 bytes类型
先不要运行
2.编写C代码
我这里的IDE是VS2019 有些配置我这会提到
新建C++空项目然后创建文件,导入代码
点击源文件-添加-新建项
这里要改名改成.c
这里要改成x64 非常重要
贴代码😍😍
代码下面拷贝:
#include <Windows.h>
#include <mmsystem.h>
#include <stdio.h>
#pragma comment(lib,"WINMM.lib")
_declspec(dllexport) void playMusic(char* file)
{
char temp[256] = { 0 };
sprintf(temp,"play %s",file); // 播放完再返回 "play %s wait" | 重复播放 "play %s repeat"
mciSendString(temp, 0, 0, 0);
printf("this c !\n");
}
说明:您现在还不能编译 有些配置还没弄 先讲讲代码
该代码为纯c语言 后缀是.c不是.cpp
如果你想使用cpp 请在—decl前面加 extern "C"
_declspec(dllexport)是导出符号的关键修饰 常用于dll文件
char *那里可以接收 bytes这样传值
mmsystem是c的多媒体库支持 甚至可以播放视频
`
3.配置项目
(1)点击项目-属性 打开这个对话框🧑💻
(2)设置配置类型 为动态库 dll 🤔
(3)点击高级 设置字符集为多字节 🍕 目的是这样才有声音
(4)点击C/C++ 把SDL检查改为 ‘’否‘’😍 然后点 “确定”
(5)开始编译 按ctrl+B
编译成功后打开所在文件夹
右键这里
然后进入x64-Debug 注意是x64文件夹里面的Debug
这就是编译好的dll
三、copy到python项目文件里
把dll文件拷贝到python项目里面
提示:我这里演示的IDE是PyCharm
打开文件夹
四、运行
from ctypes import *
music = CDLL("Project7") # 加载dll 不用加后缀名
_str = b"m.mp3"
music.playMusic(_str)
input() # 暂停不让程序结束 音乐就能正常播放
这里用这个music.来访问
CDLL表示载入C语言的调用方式
运行程序
这下就有声音了
在终端按个回车就会结束了
五、打造完美
添加 关闭、暂停、快进功能
#include <Windows.h>
#include <mmsystem.h>
#include <stdio.h>
#pragma comment(lib,"WINMM.lib")
_declspec(dllexport) void playMusic(char* file)
{
char temp[256] = { 0 };
sprintf(temp, "play %s", file); // 播放完再返回 "play %s wait" | 重复播放 "play %s repeat"
mciSendString(temp, 0, 0, 0);
printf("this c !\n");
}
_declspec(dllexport) void closeMusic(char* file) // 关闭
{
char temp[256] = { 0 };
sprintf(temp, "close %s", file);
mciSendString(temp, 0, 0, 0);
}
_declspec(dllexport) void pauseMusic(char* file) // 暂停
{
char temp[256] = { 0 };
sprintf(temp, "pause %s", file);
mciSendString(temp, 0, 0, 0);
}
_declspec(dllexport) void resumeMusic(char* file) // 继续
{
char temp[256] = { 0 };
sprintf(temp, "resume %s", file);
mciSendString(temp, 0, 0, 0);
}
// 快进
_declspec(dllexport) void stepMusic(char* file) // 往右边前进
{
char temp[256] = { 0 };
sprintf(temp, "step %s", file);
mciSendString(temp, 0, 0, 0);
}
_declspec(dllexport) void reverseMusic(char* file) // 回退
{
char temp[256] = { 0 };
sprintf(temp, "step %s reverse", file);
mciSendString(temp, 0, 0, 0);
}
关注我 更新更多python/C/C++内容🧑💻