上一篇中我们已经了解如何在Python程序和C模块之间进行值的相互传递,现在我们来进入实作阶段,看看如何将一个C语言开发的开源mp3编解码库LAME包装为一个Python下可以使用的扩展模块。
首先去http://lame.sourceforge.net/download.php下载LAME的源代码,然后切换到root用户编译源代码,
./configure
make
make install
安装完成后你可以在/usr/local/include/lame目录下找到lame.h头文件,我们在后面的demo程序中会include它的,下面就是一个非常简单的lame示例程序lame_test.c:
复制代码
代码
#include <stdio.h>
#include <stdlib.h>
#include <lame.h>
#define INBUFSIZE 4096
#define MP3BUFSIZE (int) (1.25 * INBUFSIZE) + 7200
int encode(char* inPath, char* outPath) {
int status = 0;
lame_global_flags* gfp;
int ret_code;
FILE* infp;
FILE* outfp;
short* input_buffer;
int input_samples;
char* mp3_buffer;
int mp3_bytes;
gfp = lame_init();
if (gfp == NULL) {
printf("lame_init failed\n");
status = -1;
goto exit;
}
ret_code = lame_init_params(gfp);
if (ret_code < 0) {
printf("lame_init_params returned %d\n",ret_code);
status = -1;
goto close_lame;
}
infp = fopen(inPath, "rb");
outfp = fopen(outPath, "wb");
input_buffer = (short*)malloc(INBUFSIZE*2);
mp3_buffer = (char*)malloc(MP3BUFSIZE);
do{
input_samples = fread(input_buffer, 2, INBUFSIZE, infp);
mp3_bytes = lame_encode_buffer_interleaved(gfp, input_buffer,input_samples/2, mp3_buffer, MP3BUFSIZE);
if (mp3_bytes < 0) {
printf("lame_encode_buffer_interleaved returned %d\n", mp3_bytes);
status = -1;
goto free_buffers;
} else if(mp3_bytes > 0) {
fwrite(mp3_buffer, 1, mp3_bytes, outfp);
}
}while (input_samples == INBUFSIZE);
mp3_bytes = lame_encode_flush(gfp, mp3_buffer, sizeof(mp3_buffer));
if (mp3_bytes > 0) {
printf("writing %d mp3 bytes\n", mp3_bytes);
fwrite(mp3_buffer, 1, mp3_bytes, outfp);
}
free_buffers:
free(mp3_buffer);
free(input_buffer);
fclose(outfp);
fclose(infp);
close_lame:
lame_close(gfp);
exit:
return status;
}
int main(int argc, char** argv) {
if (argc < 3) {
printf("usage: lame_test rawinfile mp3outfile\n");
}
encode(argv[1], argv[2]);
return 0;
}
复制代码
编译步骤:
gcc -I /usr/local/include/lame lame_test.c -lmp3lame -o lame_test
试验准备:
首先需要一个test.wav文件,先安装sox来将wav文件转为raw格式的数据:
sudo apt-get install sox
sox test.wav -t raw test.raw
然后执行lame_test来对其进行mp3编码:
./lame_test ./test.raw ./test.mp3 
好了,现在我们要在这个c程序的基础上将其包装为一个Python扩展模块。下面的pylame.c就是简单地调用lame_test.c中定义的encode方法,然后通过它对外部的python程序提高mp3编码的服务
复制代码
代码
#include <Python.h>
#include <lame.h>
int encode(char* ,char*);
static PyObject * pylame_encode(PyObject* self, PyObject* args) {
int status;
char* inPath;
char* outPath;
if (!PyArg_ParseTuple(args, "ss", &inPath, &outPath)) {        
return NULL;
}
status = encode(inPath, outPath);
return Py_BuildValue("i", status);
}
static PyMethodDef pylame_methods[] = {
{"encode", pylame_encode, METH_VARARGS, NULL},
{NULL, NULL, 0, NULL}
};
PyMODINIT_FUNC initpylame() {
Py_InitModule3("pylame", pylame_methods, "an simple lame module.");
}
复制代码
模块编译步骤:
gcc -shared -I /usr/include/python2.6 -I /usr/local/include/lame/ pylame.c lame_test.c -lmp3lame -o pylame.so
ok,现在lame扩展模块已经封装好了,可以到python程序中进行调用了。在pylame.so所在目录下新建一个python文件lame1.py代码如下:
import pylame
if __name__ == '__main__':
inPath = './test.raw'
outPath = './test.mp3'
pylame.encode(inPath, outPath)
编译执行: 
python ./lame1.py
你会发现生成了一个test.mp3,打开听听看是否是你想要的歌曲呢,呵呵。。。 
本文转自Phinecos(洞庭散人)博客园博客,原文链接:http://www.cnblogs.com/phinecos/archive/2010/05/22/1741667.html,如需转载请自行联系原作者

使用C语言扩展Python(三)相关推荐

  1. 用C语言扩展Python的功能的实例

    用C语言扩展Python的功能的实例 分类: C/C++ 编程技巧 Programes 2008-04-23 09:31 1232人阅读 评论(0)收藏 举报 python扩展语言cmethodsnu ...

  2. python代码用c语言封装_使用C语言扩展Python程序的简单入门指引

    一.简介 Python是一门功能强大的高级脚本语言,它的强大不仅表现在其自身的功能上,而且还表现在其良好的可扩展性上,正因如此,Python已经开始受到越来越多人的青睐,并且被屡屡成功地应用于各类大型 ...

  3. c语言实现python语法_用C语言扩展Python的功能

    转自:http://www.ibm.com/developerworks/cn/linux/l-pythc/ 一.简介 Python是一门功能强大的高级脚本语言,它的强大不仅表现在其自身的功能上,而且 ...

  4. 如何将c语言程序封装供python调用_转:用C语言扩展Python的功能

    一.简介 Python是一门功能强大的高级脚本语言,它的强大不仅表现在其自身的功能上,而且还表现在其良好的可扩展性上,正因如此,Python已经开始受到越来越多人的青睐,并且被屡屡成功地应用于各类大型 ...

  5. c语言转换为python语言_【转】用C语言扩展Python的功能

    一.简介 Python是一门功能强大的高级脚本语言,它的强大不仅表现在其自身的功能上,而且还表现在其良好的可扩展性上,正因如此,Python已经开始受到越来越多人的青睐,并且被屡屡成功地应用于各类大型 ...

  6. python安装c语言库_C语言扩展Python模块

    一. main.cpp #include #include "Python.h" static PyObject* Py_Add_Formular(PyObject *self, ...

  7. 使用C语言扩展Python(四)

    上一篇里的LAME项目已经展示了python如何与C语言交互,但程序仍不够理想,在python这一端仅仅是传递源文件和目标文件的路径,再调用C模块的encode方法来进行编码,但问题在于你无法控制en ...

  8. 用C语言扩展Python的功能

    https://www.ibm.com/developerworks/cn/linux/l-pythc/

  9. python c 混合编程 用c循环_混合编程:用 C 语言来扩展 Python 大法吧!

    Python 实在是一种让人上瘾的编程语言,简洁的语法+丰富的扩展包,几乎可以用 Python 做任何事情,唯一的黑点似乎就是「慢」,但是与高效的编译语言 C\C++ 互联以后,可以解决脚本语言运行速 ...

最新文章

  1. 重磅!2020年放假安排公布啦!五一休5天,国庆中秋连休8天
  2. python自动生成鸡汤文_20行python代码实现鸡汤智能生成器
  3. 关于ORACLE RAC心跳问题的释疑
  4. JAVA8 Stream方法使用详解reduce、IntStream(二)
  5. MySQL主从复制主库宕机:1更新完relaylog2最大post设为主库 配置及删除之前从库信息3其他从库新建连接
  6. java oca_OCA的Java拼图游戏第3部分
  7. 第二十二期:动画讲解TCP,再不懂请来打我
  8. LeetCode 1464. 数组中两元素的最大乘积
  9. Ubuntu 19.10 Beta 发布,正式版本定于 10 月份
  10. linux 软件包 rpm命令之安装、更新、卸载、依赖
  11. Excel2010学习笔记(二):公式函数篇
  12. MIUI(Android)使用Webview上传文件
  13. 用python把相同名称的放在一起,python实现将具有相同名称的文件放入相应的文件夹中,把,对应,内...
  14. 模板库:8张财务分析类报表,邀您提反馈
  15. mysql查询登录端口_mysql查看、修改端口、指定端口登录
  16. 解决9341系列LCD,使用杜邦线等连接线,造成白屏问题
  17. linux病毒通过U盘传播,一个通过U盘传播的病毒详细分析,近期抓的但是是09年的病毒...
  18. 有关STM32F103C8T6的超频
  19. SPDA-CNN:Unifying Semantic Part Detection and Abstraction for Fine-grained Recognition
  20. 大数据分析学习的详细解读

热门文章

  1. I.MX6 android 源码下载
  2. git常见操作--忽略文件以及常用命令【转】
  3. 看博客学学Android(十三)
  4. Solr索引数据同步ReplicationHandler
  5. cdr怎样把一张图片随意变形_PS手记|移动工具的使用与画布的变形
  6. 因特尔显卡自定义分辨率_蓝宝石RX 5600XT 6G D6 白金版OC显卡评测:两千价位段好选择...
  7. 3 个可以使你的 Python 代码更优雅、可读、直观和易于维护的工具
  8. android课程设计录音机,[转载]数字录音机(微机原理与接口技术-课程设计)
  9. python练习_Python随笔31:Python基础编程练习题27~28
  10. python第三方库jieba下载_Python第三方库____jieba