按照网上说的教程来用tinycap录音,比如:
按他们说的用ctrl+c 这样数据就会存下来。
但是我把c.wav从手机里取出后播放时,说打不开。从UltraEdit打开后,发现文件头是空的。
原因应该是这样的,
void sigint_handler(int sig) { capturing = 0; }
unsigned int capture_sample(FILE *file, unsigned int card, unsigned int device, unsigned int channels, unsigned int rate, enum pcm_format format, unsigned int period_size, unsigned int period_count) {
...
while (capturing && !pcm_read(pcm, buffer, size)) { if (fwrite(buffer, 1, size, file) != size) { fprintf(stderr,"Error capturing sample\n"); break; } bytes_read += size; }
...
int main(int argc, char **argv)
...
/* install signal handler and begin capturing */ signal(SIGINT, sigint_handler); frames = capture_sample(file, card, device, header.num_channels, header.sample_rate, format, period_size, period_count); printf("Captured %d frames\n", frames);
/* write header now all information is known */ header.data_sz = frames * header.block_align; header.riff_sz = header.data_sz + sizeof(header) - 8; fseek(file, 0, SEEK_SET); fwrite(&header, sizeof(struct wav_header), 1, file);
fclose(file);
...
在执行capture_sample循环时,如果收到SIGINT信号,那么capturing=0录音循环结束。代码继续走下去写入文件头,然后关闭文件。
现在发现没有写入文件头,那么就是在adb里执行ctrl+c,直接关闭了tinycap程序,没有后续的写文件头操作。
所以,我们通过adb连接到手机执行ctrl+c是不能发送SIGINT的信号的,这样导致不能正常录音。
我采取的操作是,开两个窗口一个,一个录音,一个发SIGINT
发送SIGINT,kill -2 或者kill -SIGINT都可以。tinycap收到SIGINT后,打出log:Captured 1318912 frames