作者Freak1033 (金が信念! XD)
看板Python
标题Re: [问题] 录音 & call c function
时间Sat Jul 1 00:02:21 2006
※ 引述《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
1F:推 lozbwlmnxu:感谢!! 正是我想要的 07/01 10:58