[RK3288][Android6.0] Tinycap录音程序源代码浅析
来源:互联网 发布:ubuntu虚拟机无法上网 编辑:程序博客网 时间:2024/06/06 01:02
Platform: Rockchip
OS: Android 6.0
OS: Android 6.0
Kernel: 3.10.92
源代码位于:
external/tinyalsa/tinycap.c
int main(int argc, char **argv){ FILE *file; struct wav_header header; //默认使用第一个录音设备,双通道,44.1kHz采样率,16bit //period为1024帧,count一共4个。 unsigned int card = 0; unsigned int device = 0; unsigned int channels = 2; unsigned int rate = 44100; unsigned int bits = 16; unsigned int frames; unsigned int period_size = 1024; unsigned int period_count = 4; enum pcm_format format;//传进来的录音文件参数。 file = fopen(argv[1], "wb"); if (!file) { fprintf(stderr, "Unable to create file '%s'\n", argv[1]); return 1; }//命令行可以重新设置参数 argv += 2; while (*argv) { if (strcmp(*argv, "-d") == 0) { argv++; if (*argv) device = atoi(*argv); ...... }//wav格式头文件结构填充 header.riff_id = ID_RIFF; header.riff_sz = 0; header.riff_fmt = ID_WAVE; header.fmt_id = ID_FMT; header.fmt_sz = 16; header.audio_format = FORMAT_PCM; header.num_channels = channels; header.sample_rate = rate;...... /* leave enough room for header */ fseek(file, sizeof(struct wav_header), SEEK_SET);...... frames = capture_sample(file, card, device, header.num_channels, header.sample_rate, format, period_size, period_count);...... //最后把wav header写进去。 fwrite(&header, sizeof(struct wav_header), 1, file); fclose(file); return 0;}capture_sample():
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){ struct pcm_config config;......//转换成config config.channels = channels; config.rate = rate; config.period_size = period_size; config.period_count = period_count; config.format = format; config.start_threshold = 0; config.stop_threshold = 0; config.silence_threshold = 0;//标准tinyalsa打开接口 pcm = pcm_open(card, device, PCM_IN, &config); if (!pcm || !pcm_is_ready(pcm)) { fprintf(stderr, "Unable to open PCM device (%s)\n", pcm_get_error(pcm)); return 0; }//记录的时候是frame,计算的时候要用size. size = pcm_frames_to_bytes(pcm, pcm_get_buffer_size(pcm)); buffer = malloc(size);......//它是整个size一次读取。 while (capturing && !pcm_read(pcm, buffer, size)) {//写入文件 if (fwrite(buffer, 1, size, file) != size) { fprintf(stderr,"Error capturing sample\n"); break; }//总共读取字节数 bytes_read += size; }......//返回总共读取到的帧数 return pcm_bytes_to_frames(pcm, bytes_read);}
整个流程相对比较简单,核心部分主要是在pcm_open()以及pcm_read()有兴趣可研究下。
不过要注意的是peroid_size和peroid_count有范围,不是任何数值都可以,而frame rate是固定的,是44.1kHz.
阅读全文
1 0
- [RK3288][Android6.0] Tinycap录音程序源代码浅析
- [RK3288][Android6.0] 调试笔记 --- 实时录音会有呲呲噪音问题
- [RK3288][Android6.0] Audio录音frame rate设置流程小结
- [RK3288][Android6.0] 调试笔记 --- Audio录音PCM数据抓取
- [RK3288][Android6.0] Audio中的录音重采样小结
- [RK3288][Android6.0] 调试笔记 --- 命令行录音方法
- [RK3288][Android6.0] 调试笔记 --- 录音apk无权限录音问题
- [RK3288][Android6.0] 调试笔记 --- 关闭按键音后无法录音问题
- [RK3288][Android6.0] Audio录音HAL层的初始化流程分析
- [RK3288][Android6.0] Audio录音HAL层的数据读取流程分析
- [RK3288][Android6.0] 调试笔记 --- 录音音量从HAL到APP层会变小问题
- [RK3288][Android6.0] 调试笔记 --- Audio驱动层判断录音数据是否异常
- [RK3288][Android6.0] 调试笔记 --- 修改录音采样率提示报错问题
- [RK3288][Android6.0] 调试笔记 --- RT5640录音时的Codec寄存器列表
- [RK3288][Android6.0] 调试笔记 --- X264测试程序无法使用
- [RK3288][Android6.0] AUDIO_BECOMING_NOISY作用
- [RK3288][Android6.0] 调试笔记 --- 修改默认system/bin/下可执行程序权限
- [RK3288][Android6.0] Camera驱动初始化流程
- Vue.js 系列教程 3:Vue-cli,生命周期钩子
- 基于maven的ssh框架一步一步搭建
- QT:QMessageBox的简单使用
- App功能测试的7大注意点
- validate
- [RK3288][Android6.0] Tinycap录音程序源代码浅析
- Vue.js 系列教程 4:Vuex
- ubuntu16+Hadoop2.7.3环境搭建(伪分布式)
- jquery的each()详细介绍
- Linux 用户及文件权限管理
- Java Json格式化工具
- Vue.js 系列教程 5:动画
- 串行爬虫sequentipl
- ZenFone AR高调来袭,同时支持Daydream VR和Tango