程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

python與C語言交互保姆級教程之0基礎音頻播放

編輯:Python

提示:本文需要一定的c編程基礎

文章目錄

  • 前言
  • 一、安裝ANACONDA
  • 二、使用步驟
    • 1.編寫py代碼
    • 2.編寫C代碼
    • 3.配置項目
  • 三、copy到python項目文件裡
  • 四、運行
  • 五、打造完美


前言

最近應用程序發現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++內容🧑‍


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved