简单来说,samplerate就是模拟信号转为数字信号时的采样频率,本身是一种采样率,所以设置系统时间对samplerate有采样率和采样速率的要求。
你先在声卡驱动面板里面的。的这个 ASIO缓冲区里面 先调整好这 大小的。需要退出那些什么播放器和机架这些的。关闭一下声卡电源。重新打开再设置好的。设置好的。SAM里面会默认这缓冲的大小的了。
音频变速播放原理分析及实现方案[关键词:音频,audio,倍速,变速,变调,soundtouch,sonic]
音频变调变速原理分析
先来一段语音处理的理论:
语音变调在变声软件中较常用。而语音变速在播放器中常用,比如倍速播放(快播、慢播)。本文重点关注变速。
相对于视频基于帧的变速原理,跳帧或者插帧。音频的变速原理并不是如此简单,因为简单的抽采样点会引起声音的不连续、噪声或爆破音,主观体验较差。
所以一下简单的音频处理策略通常是行不通的:(以x2倍速为例)
1.播放设备实现,设置播放设备播放采样率加倍,这样单位时间播放的采样点数加倍,可以实现变二倍速不变调,但声音不连续。
2.播放前PCM重采样为原采样率的一半,可以实现二倍速,但是会变调。
3.丢帧,每隔一帧丢一帧,可以实现两倍速,但是也会有刺啦刺啦的噪音,而且声音会产生断续,体验十分差。
可用方案
所以为了实现较好的主观体验,只能采用相对复杂的语音处理策略。目前较为常用的音频变速解决方案有两个:soundtouch和Sonic。
ijkplayer使用的是soundtouch,EXOPlayer使用的是Sonic。
在Android上还有一种实现方式,基于AudioTrack的变速播放,代码如下:
详细用法建议参考PlaybackParams。
Sonic和Soundtouch用法类似,都是提供封装好的库,将原音频的PCM数据通过接口函数处理为目标格式,比如二倍速,可能PCM采样点就减半。
这里以Soundtouch提供的接口为例,说明下如下使用:
参数设置类接口:
setChannels(int) 设置声道,1 = mono单声道, 2 = stereo立体声
setSampleRate(uint) 设置采样率
setRate(double) 指定播放速率,原始值为1.0,大快小慢
setTempo(double) 指定节拍,原始值为1.0,大快小慢
setRateChange(double)、setTempoChange(double) 在原速1.0基础上,按百分比做增量,取值(-50 .. +100 %)
setPitch(double) 指定音调值,原始值为1.0
setPitchOctaves(double) 在原音调基础上以八度音为单位进行调整,取值为[-1.00,+1.00]
setPitchSemiTones(int) 在原音调基础上以半音为单位进行调整,取值为[-12,+12]
PCM处理类接口:
putSamples(const SAMPLETYPE *samples, uint nSamples) 输入采样数据
receiveSamples(SAMPLETYPE *output, uint maxSamples) 输出处理后的数据,需要循环执行
flush() 冲出处理管道中的最后一组“残留”的数据,应在最后执行
从上述接口来看,类似于常规的解码器或者解复用器的调用逻辑。
小结
本文简述了音频变速变调的原理,并对目前Android平台上可用的音频变速方案做了总结,包括Soundtouch、Sonic及AudioTrack三种方案,仅供后续参考。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)