继续上篇的视频采集到录制
视频采集相对来说还是算正常,如果资源够用,使用第三方库也是种解决办法
但音频采集网上资料相对也少,走了一遍,也发现存在很多坑
1. 音频采集
一般来说,采用MIC采集,采集出来的格式为PCM格式
PCM格式非常简单,长度也很好估算,方便找问题
首先是采集功能要打开,否则采集不到任何声音。这个也是坑,默认的板子一般是音频采集是关闭的。
输入 alsamixer
如果是录音功能不正常,要看下录音这个是否已经打开且选择正确的录音
还有要注意,这里改了的话,重启之后,会改回去的,因此要把设置配置成启动:
- 首先利用alsamixer进行配置,确认无误后保存
- 然后 alsactl -f /var/lib/alsa/asound.state store
- 将配置保存至 asound.state
- 然后在 /etc/init.d/rcS 添加如下
if [ -f "/var/lib/alsa/asound.state" ]; then
echo "ALSA: Restoring mixer setting......"
/usr/sbin/alsactl -f /var/lib/alsa/asound.state restore &
fi
这样才算完成
2. 降噪处理
一般采集音频都需要降噪,降噪算法很多,这里推荐rnnoise,这个基于神经网络,比较优秀,就是比较占资源,且搭建rnn环境也比较麻烦
但这里也有坑:
1. demo仅支持 48k,单通道降噪。注意是单通道,48k,如果输入44.1k也可以,但效果不好。
2. 每次调用接口,只能传入480BytePCM数据,如果一次传入其他长度,需要自己内部协调
3. 效率不高,在嵌入式环境下使用,需要评估是否适合
3. aac编码
pcm转aac,一般会用libfaac库
但要注意一次性输入长度,这个很多地方都提到(降噪输入长度=输出长度,只是降噪算法有自己的长度要求,一般来说这个一次长度跟采集PCM原始长度是不一致的)
每次输入PCM长度都是固定的,也就是说不足或存在多路,需要自己进行内存维护,否则达不到预期效果(百思不得其解),一般不会报错,只是编码出来的数据很奇怪
以下是我整理一个流程,主要是解决各个环节长度问题
下期讲下,视频与音频复合情况,也有不少坑值得记录