Re: [問題] 錄音 & call c function

看板Python作者 (金が信念! XD)時間18年前 (2006/06/30 23:32), 編輯推噓1(100)
留言1則, 1人參與, 最新討論串5/5 (看更多)
※ 引述《lozbwlmnxu (lozb)》之銘言: : 沒想到要考慮這麼多 orz : 我之前都是用matlab錄音的 用wavrecord()這個函式 : 這個函式給他sample frequency 和 bit等參數 : 他就會開始錄音 變成wav檔 : 現在想在python上找一個像這種功能的函式 : 我也寫了很多信號處理的c程式 都是針對wave檔做處理的 : 所以希望寫一個python的視窗程式 把這些c程式做一個好用的介面 : 我不懂API : 能達到錄音的功能 並存成 *.wav 格式的檔案 linux 或 windows都可以 : 因為已經有的c程式 在這二個系統下都可以跑 : 如果是可以錄音 但出來的檔案不是*.wav的話也是可以 只要是像wav檔一樣 : 只記錄波形大小等振幅資料 我都可以接受 : 反而這樣我可以更省力 直接把錄到的資料丟到寫好的程式即可。 : 請問這樣有解嗎? 如果沒有平台偏好的話... 我覺得用 linux 的 OSS 應該會最方便, 一來是有內建的 module 可以用, 二來是不管是 OSS 或 ALSA 都有支援 OSS 介面. 以下是幾個你可能會想用的 module: audioop 可以用來處理 raw samples. (stored in python string) wave 可以用來處理 .wav 格式 ossaudiodrv 可以用來對付 OSS 介面 文件可以看這裡: http://docs.python.org/lib/mmedia.html OSS 介面我沒有用過, 所以這邊你可能得自己實驗了, 似乎直接 open, setparameters, 之後 read 出來的就是 raw samples. 不過它的 buffering 似乎不是很好用, 我不知道它要怎麼 query buffer size, 或是設定 callback... --- 至於呼叫 C 函數, 我稍微實驗了一下要怎麼用 ctypes 傳 byte array 跟 int, 其實還蠻簡單的, 以下是我的實驗: $ cat dyn.c #include <stdio.h> void hello(int n, char *s){ fwrite(s, 1, n, stdout); } $ gcc -shared -fPIC dyn.c -o dyn.so $ python Python 2.4.3 (#1, May 11 2006, 17:04:29) [GCC 3.4.6 (Gentoo 3.4.6-r1, ssp-3.4.5-1.0, pie-8.7.9)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import ctypes >>> dyn=ctypes.CDLL("./dyn.so") >>> dyn.hello(6,"hello\n") hello 6 >>> dyn.hello(4,"hello\n") hell4 >>> dyn.hello(7,"hel\0lo\n") hello 7 如果只是要傳聲音樣本的話, 我想應該是足夠的. -- その乾いた哀愁の瞳に去來するものは何か? 失ったもの 得たもの そして廣大なネットの狹間で彼が見たものとは? 虛像と實存と記號の中に彼は今、何を想うのか? <バトルプログラマーシラセ> -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.109.224.64

07/01 10:58, , 1F
感謝!! 正是我想要的
07/01 10:58, 1F
文章代碼(AID): #14fKFqkA (Python)
文章代碼(AID): #14fKFqkA (Python)