按照网上说的教程来用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