python与C语言交互保姆级教程之0基础音频播放

提示:本文需要一定的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++内容🧑‍💻

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值