首先,遵循"測試先行"的原則,先來看我們改造後的python這一端,你可以每次讀取音訊原始檔的乙個資料塊,將其轉遞給encoder物件的encode方法,這樣無論你的原始檔是何種格式,你都可以在encoder中進行自由的控制,示例**如下:
import
clame
inbufsize
=4096
if__name__=='
__main__':
encoder
=clame.encoder(
'test.***')
input
=file(
'test.raw',
'rb')
data
=input.read(inbufsize)
while
data
!=''
:encoder.encode(data)
data
=input.read(inbufsize)
input.close()
encoder.close()
再來看c擴充套件模組這一端,下面是完整的**:
#include
<
python.h
>
#include
<
lame.h
>
typedef
struct
clame_encoderobject;
static
pyobject
*encoder_new(pytypeobject
*type,pyobject
*args,pyobject
*kw)
static
void
encoder_dealloc(clame_encoderobject
*self)
if(self
->
outfp)
self
->
ob_type
->
tp_free(self);
}static
intencoder_init(clame_encoderobject
*self,pyobject
*args,pyobject
*kw)
if(self
->
outfp
||self
->
gfp)
self
->
outfp
=fopen(outpath,"wb
");self
->
gfp=
lame_init();
lame_init_params(self
->
gfp);
return0;
}static
pyobject
*encoder_encode(clame_encoderobject
*self,pyobject
*args)if(
!pyarg_parsetuple(args,"s#
",&in_buffer,
&in_length))
in_length/=2
;***_length=(
int)(
1.25
*in_length)
+7200
;***_buffer=(
char
*)malloc(***_length);
if(in_length
>0)
}free(***_buffer);
py_return_none;
}static
pyobject
*encoder_close(clame_encoderobject
*self)
***_length
=7200
;***_buffer=(
char
*)malloc(***_length);
***_bytes
=lame_encode_flush(self
->
gfp,***_buffer,
sizeof
(***_buffer));
if(***_bytes
>0)
free(***_buffer);
lame_close(self
->
gfp);
self
->
gfp=
null;
fclose(self
->
outfp);
self
->
outfp
=null;
py_return_none;
}static
pymethoddefencoder_methods=,
,};static
pytypeobjectclame_encodertype=;
static
pymethoddefclame_methods=};
pymodinit_funcinitclame()
編譯過程:
gcc-shared-i
/usr
/include
/python2.6
-i/usr/
local
/include
/lameclame
.c-l***lame-oclame.so
首先定義了clame_encoderobject結構體,這個結構體就是用來儲存狀態資訊的,欄位outfp用來儲存輸出檔案,gfp則儲存lame的狀態,可以用來檢查是否已經是重複呼叫已經呼叫過的函式了。
為了建立這個結構體的乙個新例項,我們需要定義encoder_new函式,你可以把這個函式視為python裡的__new__方法,當python直譯器需要建立你定義的型別的新例項時就會去呼叫這個方法。在這個方法裡沒作什麼操作,僅僅是做初始化工作,把outfp和gfp都設定為null,此外,與encoder_new函式對應,還需要定義encoder_dealloc方法來對例項進行析構,你可以把這個函式視為python的__del__方法,clame_encodertype結構體則是真正定義了我們的encoder物件,它的各個字段指定了_new,_close,_encode,_dealloc等方法。在initclame方法中,pymoduleobject則實際指定了在python程式中使用的encoder物件。
使用C語言擴充套件Python 四
首先,遵循 測試先行 的原則,先來看我們改造後的python這一端,你可以每次讀取音訊原始檔的乙個資料塊,將其轉遞給encoder物件的encode方法,這樣無論你的原始檔是何種格式,你都可以在encoder中進行自由的控制,示例 如下 import clame inbufsize 4096 if ...
使用c語言擴充套件python
背景 我們工作中可能有時需要和第三方對接,而第三方提供的sdk可能是c語言或者c 編寫的,而我們程式使用的語言是python,這時候就需要使用python呼叫c庫 參考官方文件 編寫python擴充套件分三步 第一步 建立應用 使用c語言編寫具體的功能 如果sdk已經提供了並且不需要我們整合,則跳過...
C語言擴充套件Python
python具有很好的開發靈活性,最大的特點是c語言可以對python進行擴充套件,目前工作中正在進行相關的開發,第一篇文章作為基礎.實現c函式,用python api封裝,實現倆個功能,1.say hello,列印hello world 2.calc pv,做加法用算.以下為使用方法 01pyth...