東引甌越

不断学习, 与时俱进.

嗨,我是孙亚洲(@sunyazhou13),一名来自北国冰城的iOS开发者,也搞过一些mac.现居帝都北京.开发数年有余,没有为往圣续绝学深感惭愧,今2017年开始写博客.望诸位同仁多多指教.


音频声像Pan值电平左右声道平衡

前言

最近在开发多媒体音视频相关业务,期间遇到的问题这里全做记录下来,下面是同事提供的一个例子我整理出来,以备后续开发遇到此类问题有个备案.

开篇

最近开发音频涉及到左右声道调节,基于左右声道的音量实现 声音环绕效果.
下面是 UI 演示.

这里其实修改的类似 AVAudioPlayer里面的pan值修改

我在以前的文章也有一篇提到过这个pan 值

可能大家不理解为啥 这个 API 起名叫pan

在声学领域这个东西有专门的名字叫 声像.

这篇文章介绍了一些我们对声学知识的简单介绍,虽然不知道作者是谁,但是作者应该是非常专业的声学开发者.

其实按照我们平常的理解应该是这样去实现这个 pan 值的修改

左声道音量给右声道声音的补偿 或者右侧声道给左侧声道的补偿,通过滑块的 value 来决定两边谁加多少减多少,但是大家的思路是对的,但是做法是不正确的,因为 两边的音量放在中间必须是1.0,也就是说 range 在 -1 ~ 1之间. 如果按照这个滑动方式回导致滑动过大.

带着这个问题我的同事找到了一个公式 来计算 这个值

  • pan就是我们的滑块的value
  • Vl 代表左侧音量
  • Vr 代表右侧音量

根据这个公式我们有如下 代码

#import <math.h>
typedef NS_ENUM(NSUInteger, KSYMCChannelType) {
KSYMCChannelTypeLeft = 0,
KSYMCChannelTypeRight = 1
};
@interface KSYMultiCanvasHelper : NSObject
+ (CGFloat)calculateVolume:(KSYMCChannelType)type
panValue:(CGFloat)pan
volume:(CGFloat)volume;
@end
@implementation KSYMultiCanvasHelper
+ (CGFloat)calculateVolume:(KSYMCChannelType)type
panValue:(CGFloat)pan
volume:(CGFloat)volume{
if (type == KSYMCChannelTypeLeft) {
CGFloat leftVolumn = sqrt(2) * cos((1 + pan)*M_PI_4) *volume;
return leftVolumn;
} else if (type == KSYMCChannelTypeRight) {
CGFloat rightVolumn = sqrt(2) * sin((1 + pan)*M_PI_4) *volume;
return rightVolumn;
}
return 0;
}
@end

这里的计算还是比较准确的.

经过测试 左侧 音量 为 0 时 右侧音量应该是 1.41左右

总结

经过上述测试音频的 pan 值修改 如果自行开发还是比较好搞得,只是鄙人对音频的知识积累的太少了.这篇文章看起来虽然没什么技术含量,全当知识的点滴积累吧. 至于为啥 是 M_PI_4还请专研一下文章的扩展链接,因为要把一个线性的操作转换成一个圆型方便数学的计算,以及 声像声向的区别.

全文完

最近的文章

Markdown中插入音频文件

前言喜欢在博客文章打开的时候 播放一首背景音乐, 但Markdown本身是不支持插入音频视频,带着这个疑问开始这篇文章. markdown插入音乐markdown其实就是 一种html的转换语法,其实内部也同时支持直接写html标签, 如果不了解各种标签请点击w3cschool查看各种 API 的用 …

于  iOS开发 继续阅读
更早的文章

UICollectionViewCell添加KVO

前言都一个多月没更新博客了,这一段时间太忙了. 这篇带来的分享内容是如何正确的给一个UICollectionViewCell添加KVO监听. 开篇由于目前在开发短视频相关的SDK,面向的多数都是小白开发者,为了能让小白以最低的成本看懂 SDK 的代码以及用法,这就要求我们以小白最容易理解的方式开发 …

于  iOS开发, macOS开发 继续阅读