提示:本文需要一定的c編程基礎
最近應用程序發現py播放music的庫有點不會弄,網上推薦的pygame播放MP3
會嚴重失真,文檔少,其他的庫運行老是失敗,既然python可以聯合c 那不如就用c的mci。
還能學會如何用python調用c,一箭雙雕啊🧑
ANACONDA 是一個可以管理python包的工具,會python的應該都知道,現在用這個防止因為包版本不一樣而不能使用。
推薦博文
安裝好後自帶ctypes庫,這個庫可以幫我們和c交流🤪
代碼如下(示例):
from ctypes import *
music = CDLL("Project7") # 加載dll 不用加後綴名
_str = b"m.mp3"
music.playMusic(_str)
input() # 暫停不讓程序結束
首先在你的相對路徑放一個mp3文件
字符串前面一定要b修飾 bytes類型
先不要運行
我這裡的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的多媒體庫支持 甚至可以播放視頻
`
(1)點擊項目-屬性 打開這個對話框🧑
(2)設置配置類型 為動態庫 dll
(3)點擊高級 設置字符集為多字節 目的是這樣才有聲音
(4)點擊C/C++ 把SDL檢查改為 ‘’否‘’ 然後點 “確定”
(5)開始編譯 按ctrl+B
編譯成功後打開所在文件夾
右鍵這裡
然後進入x64-Debug 注意是x64文件夾裡面的Debug
這就是編譯好的dll
把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++內容🧑