多媒体开发(5)&音频特征:声音可以调大一点吗?
基本上,现在常用的声音采样办法是pcm,而对于压缩音频的解码,得到的也pcm数据。这个pcm数据,只是一堆数值,有正有负,看这个值看不出什么花样。
声音采集,采的是什么呢?
采的是声音的强度变化,也是声音这种能量的强弱变化,这种强弱用分贝来表示,即dB。所以,pcm数据跟这个dB就一定有关系,这个关系是这样的:
dB=20∗log10(pcm)
pcm=pow(10,(dB/20.0))
模数转换ADC时常用的位深是16bit,也就是用16位来表示一个sample,这里不考虑偷懒而使用不足16位的情况。16位能表示65536个值,也就意味着有65536个dB可以表示出来,哪又怎么样?很厉害了吗?
的确是比较厉害的了。
16位的pcm数值,分正负,那正数的范围是0至32767,负数的范围是-1至-32768,随便挑几个来看看,对应的dB是多少,如下图:
由上面的运算可知,16位的pcm值,如果不分正负,最大可以表示96dB,如果分正负,也能表示到90dB。90dB是什么概念?有数据表明(我也不清楚什么数据),85dB就会伤害了你,90dB相当于摩托车启动的声音--你有开过吗?
所以,你的pcm数据需要去到90dB以上吗?想祸害谁?一般情况下,能表示到90dB就很够用了。
既然知道了pcm数值与dB的关系,就可以搞点事情了,比如把pcm转成dB后再放大一点,再保存成新的文件,是不是播放就可以大声一点了呢?
来做个实验。
import math
import math
import wave
import audioread
import contextlib
import sys
import math
import struct
def gainpcm(filepath):
try:
with audioread.audio_open(filepath) as f:
with contextlib.closing(wave.open(filepath+'.wav', 'w')) as of:
of.setnchannels(f.channels)
of.setframerate(f.samplerate)
of.setsampwidth(2)
for buf in f:
for i in range(0, len(buf)-2, 2):
s = buf[i] + buf[i+1]
pcm = struct.unpack('<h', s)[0]
apcm = abs(pcm)
if apcm==0:
apcm=1
db = 20*math.log10(apcm)
db = db * 1.2
apcm=int(math.pow(10, float(db)/20.0))
if apcm>32767:
apcm=32767
if pcm < 0:
pcm=-apcm
else:
pcm = apcm
tbuf = struct.pack('<h', pcm)
of.writeframes(tbuf)
except audioread.DecodeError:
print("File could not be decoded.")
sys.exit(1)
if __name__ == '__main__':
gainpcm('test.mp3')
这里是对代码的简单解释:
把一个mp3放过去试验,出来一个wav,发现wav文件的声音真的大了好多(好多是因为这里设置了db*1.2)。但是,另一个问题也暴露出来了,就是听起来声音失真很严重了,这是因为放大到这个程度,很多apcm都超过了32767,也就是人们说的截顶失真了,看一下原文件与放大后的文件波形图就更清楚了:
由于不能上传音频,这里就不提供直接的音频对比了。
由此可见,要想不失真,那db就不要乘那么大的数啊--另一个办法:给它限幅(压幅),或者直接使用更合适的整体技术(灵活变音量跟限幅都考虑进去了)比如agc或drc等,明显这个不是这里的内容。
好了,总结一下,本文演示了改变音量的一种最原始的办法,就是直接改pcm的值(转dB再改变,其实也可以直接改变pcm值),但这不是最好的办法,因为它会引入失真的副作用。而从pcm数据中提取出能量(dB),这个也更像是音频特征的技能。有缘再见,see you。
多媒体开发(5)&音频特征:声音可以调大一点吗?的更多相关文章
- 多媒体开发之音频编码---ffmpeg 编码aac
http://blog.csdn.net/ctroll/article/details/8169396
- graphical Layout调大一点
布局最右边的放大器按钮好难找啊
- 多媒体开发库 之 SDL 详解
SDL 简介 SDL(Simple DirectMedia Layer)是一套开放源代码的跨平台多媒体开发库,使用C语言写成.SDL提供了数种控制图像.声音.输出入的函数,让开发者只要用相同或是相似的 ...
- moviepy音视频开发:音频剪辑基类AudioClip
☞ ░ 前往老猿Python博文目录 ░ 一.背景知识介绍 1.1.声音三要素: 音调:人耳对声音高低的感觉称为音调(也叫音频).音调主要与声波的频率有关.声波的频率高,则音调也高. 音量:也就是响度 ...
- IOS开发之音频--录音
前言:本篇介绍录音. 关于录音,这里提供更为详细的讲解网址:http://www.cnblogs.com/kenshincui/p/4186022.html#audioRecord ,并且该博客有更 ...
- Kubuntu麦克风音频无声音
前段时间买了新本,装了双系统,win8和kubuntu 14.04,使用的过程感觉都不错,因为平时玩游戏看视频是用win8,但最近打算在kubuntu上听音乐时,发现音频没有声音,麦克风也没有声音,这 ...
- LiveVideoStack Meet|深圳 多媒体开发新趋势
2018年初始,音视频技术生态并不平静,Codec争夺愈加激烈,新一代标准的挑战一浪高过一浪:WebRTC的定版也为打通浏览器.移动端乃至IoT带来了机会:此外AI.区块链技术的兴起,催化着与多媒体领 ...
- 音频标签化1:audioset与训练模型 | 音频特征样本
随着机器学习的发展,很多"历史遗留"问题有了新的解决方案.这些遗留问题中,有一个是音频标签化,即如何智能地给一段音频打上标签的问题,标签包括"吉他"." ...
- iOS AVAudioPlayer播放音频时声音太小
iOS AVAudioPlayer播放音频时声音太小 //引入AVFoundation类库,设置播放模式就可以了 do { try AVAudioSession.sharedInstance().ov ...
随机推荐
- POJ2466 棋盘覆盖
一张\(n*m\)的棋盘,有\(k\)个点不能被覆盖,问其余点能不能被\(1*2\)的小矩形完全覆盖,多测 这题先输入\(m\)是什么鬼啊!!! 其实是一个比较裸的二分图判定,把\(k\)个点挖去然后 ...
- AcWing 361. 观光奶牛
01规划 设答案为 \(ans\). 二分答案,设当前二分值为 \(mid\). 设一个环 \(S\) 的边权为 \(t_1, t_2, t_3...\),点权为 \(f_1, f_2, f_3... ...
- 六、Zookeeper-开源客户端ZkClient与Curator
ZkClient 从创建会话.创建节点.读取数据.更新数据.删除节点拉介绍ZkClient 添加依赖: pom.xml <dependency> <groupId>com.10 ...
- Java 设计模式 —— 组合模式
在现实生活中,存在很多"部分-整体"的关系,例如,大学中的部门与学院.总公司中的部门与分公司.学习用品中的书与书包.生活用品中的衣服与衣柜.以及厨房中的锅碗瓢盆等.在软件开发中也是 ...
- Electron安装打包指南
当前环境Debian Linux-Deepin 安装Node 直接下载 命令下载 下载 wget https://nodejs.org/dist/v14.15.1/node-v14.15.1-linu ...
- gitlab+jenkins 持续部署自动化测试
背景:为了减少测试部署时间和减少不必要的重复工作,采用持续集成的方式进行部署,当gitlab的release (测试)分支有代码变动时,自动拉取代码部署测试环境,并进行接口回归测试 优点:部署自动化, ...
- 【英雄帖】FreeRedis 邀请您一起优化项目。
嘿!各位!自 FreeRedis 开库以来,相继出现了很多贡献者,我们正在对 FreeRedis 的各功能模块做优化,这并不意味着现版的 FreeRedis 有问题,我们只是希望在某些方面做得更好.如 ...
- Docker 笔记学习
文章目录 概述 CentOS7 Docker 安装 启动 Docker 后台服务 镜像加速 Docker常用命令 如何创建一个镜像 存储和载入镜像 上传镜像 容器的基本操作 创建容器 终止容器 如何进 ...
- Unity 2017 Scene界面与Game界面显示不同/过于灰暗的解决办法
场景界面的显示过于灰暗,严重影响工作心情. 切换到游戏界面时的颜色. 只要将场景中全部摄像机的[Allow HDR]取消勾选即可.
- 我的 2020:出书、办签售会、发展 VS Code 中文社区、成为开源先锋、全网 10 万粉丝、10 场演讲、内推 21 人、955.WLB 发扬光大
感觉写 2019 年终总结还是在不久之前.转眼间,2020 已经接近尾声了.是时候来写写 2020 年的年终总结了. 出书 今年最高兴的事情之一,就是出了全球首本 VS Code 中文书 -- < ...