关于音频响度对白归一

本文深入探讨了杜比音频技术中的关键概念——对白归一(Dialnorm),解释了其如何通过元数据调整不同节目间的音量,实现音量一致性,避免用户在切换节目时频繁调整音量。同时对比了对白归一与音频响度均衡的区别。
摘要由CSDN通过智能技术生成

1、杜比音频轨在编码时,会写入称为“对白归一(Dialnorm)”的元数据参数,这个术语是对白归一化(Dialog Normalization)的英文简称。

  --摘自有道词典

2、对白电平 (Dialogue Level) 对白电平 (Dialogue Level)又称对白归一(dialogue normalization 或者 dialnorm )也许是最重要的 元数据参数。对白电平的设置代表了节目的平均对白响度。 当AC-3码流通过消费者的杜比数字(Dolby Digital)解码器时,对白电平(Dialogue Level)参数的设定会使 得解码器的音频输出“归一化”为统一的音量。这样做的优点在于在切换不同类型的节目时保持音量的一 致而不会产生较大的起伏。 正确的对白电平的设置可以使得节目制作者正确选定的动态范围控制(Dynamic Range Control)参数 ;不论是对于广播电视节目发射,还是对于消费者的DVD碟片,正确的对白电平的设置都是非常重要的。 对于电视发射来说,标准的对白电平设定可以让电视观众不必象以前那样在更换电视频道的时候或是在节 目中插播广告的时候不停地调整音量。对所有的内容都是用同样的标准,可以是消费者在切换节目(包括 频道的切换和同一频道不同节目的切换)的时候可以一直保持一个统一的舒适的听音电平,而不用管节目 的载体是广播电视信号,DVD或者是其它媒体。 注意:对于那些没有对白的节目,例如纯音乐节目,同样要求仔细地设定对白电平参数, 在为这类节目设定参数的时候,应与其它节目的电平进行比较,以使得观众在更换电视频 道或者切换节目的时候可以不用频繁地调整音量。

      The Scale 刻度 对白电平设定中的刻度范围从-1dB到-31dB,步进值为1dB。也许和你最初理解的有所不同:设定-31dB的 时候,在消费者的解码器得到的结果是电平不作调整,而设定为-1dB的时候,反而是电平调整最大。 为什么呢: 消费类杜比数字(Dolby Digital)的解码器将平均的还音响度(时间加权平均值 LeqA)标准化为-31dBFS (低于0dB满刻度数字输出31dB),其方法是使用基于对白电平参数设定值进行电平调整。当对白电平参 数设定为-31的信号馈送至解码器时,这个信号已经和标准的输电平达到匹配,因此不用再做调整。但是 对于一个响度比较大的节目来说,就需要调整其输出电平与-31dB的标准输出匹配。当对白电平设定为-21 的时候,解码器会对输入信号进行10dB的调整,同样,当对白电平设定为-11dB的时候,调整量为 20dB,依此类推。 简单的推算方法如下所示: 31 + (dialogue level value 对白电平值) = Shift applied 实际调整量 例如: 31 + (-21) = 10 dB 请记住最重要的一点:对白电平设定的是你为你的听众提供的一项非常重要的服务。对于你的听众来说, 正确的对白电平设定意味着: • 和其它节目一致的还音响度 • 你所选定并设置的DRC Profile(动态范围控制类型)能够按照你的设想工作。

---摘自网络检索杜比文档,感觉解释的还是不是很清晰。

 

3、“对白归一(Dialnorm)”就是通过元数据告诉解码器,将不同类型,实际不同平均响度的节目都按设定的对白电平来解码播放。

换句话说,对白归一是只修改元数据,让解码器来播放时调整,相当于实现了自动帮人拿遥控器调整音量的功能。

对白归一和音频响度均衡的区别在于,对白归一实际上并不修改节目音频的实际响度,只是在播放时根据元数据自动调整,而响度均衡会修改音频的实际响度,将不同节目实际响度值统一至设定值,在播放时无需再调整。

在Java中实现音频文件的响度归一化,通常涉及到处理音频流并调整其幅度值,使其在整个音轨上保持一致的响度。这个过程通常包含以下几个步骤: 1. **加载音频文件**:使用Java的AudioInputStream或类似库(如JAVE、JFugue等)读取音频数据。 2. **获取采样率和通道数**:了解音频的采样频率和声道数,这对于后续处理非常重要。 3. **计算平均响度**:遍历音频数据,对每个样本点取对数(因为人耳对响度的变化敏感于音频强度的对数),然后求平均,得到当前的平均响度。 4. **标准化**:对于每个样本,减去平均响度,并乘以一个固定的阈值(例如,可以设置为0分贝),使得结果音频的平均响度达到预设的标准。 5. **保存或播放归一化音频**:将处理后的音频数据写回一个新的AudioInputStream,或者通过AudioSystem工具播放。 以下是一个简单的示例代码片段,但这只是一个简化的版本,实际应用中需要处理线程安全和错误处理等问题: ```java import javax.sound.sampled.AudioInputStream; import javax.sound.sampled.AudioSystem; public class AudioNormalization { private static final double MAX_DB_GAIN = 0; // Set target maximum dB gain public static void normalize(AudioInputStream audio) throws Exception { int sampleSizeInBytes = audio.getFormat().getSampleSizeInBits() / 8; byte[] buffer = new byte[sampleSizeInBytes]; // Get the total number of frames and their average db level int frameCount = (int) audio.framesToMillisecond(audio.getFrameLength()); float avgDb = calculateAverageDb(audio); // Normalize each frame to the desired max dB while (audio.read(buffer, 0, buffer.length) != -1) { for (byte b : buffer) { double amplitude = Float.intBitsToFloat(BitConverter.getInt(b)) * 0.0078125f; // Convert to float double normalizedAmplitude = Math.max(0, amplitude - avgDb) * AudioUtil.dbToLinear(MAX_DB_GAIN); float normByte = Float.floatToIntBits(normalizedAmplitude); buffer[BitConverter.byteOffset(normByte, 0)] = normByte; } // Write back the normalized audio audio.write(buffer, 0, buffer.length); } audio.close(); } private static float calculateAverageDb(AudioInputStream audio) throws Exception { // ... implement a method to calculate average db over the stream } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值