AudioFormat音频格式

一、在Android和PC之间传递和接收音频数据,首先要保证音频数据的格式要一致,java中提供AudioFormat类构造音频格式,以下是作者所用的构造函数:

public AudioFormat(float sampleRate,
                   int sampleSizeInBits,
                   int channels,
                   boolean signed,
                   boolean bigEndian)
构造具有线性 PCM 编码和给定参数的  AudioFormat。将帧大小设置为包含每个声道一个样本所需的字节数,将帧速率设置为样本速率。

参数:
sampleRate - 每秒的样本数
sampleSizeInBits - 每个样本中的位数
channels - 声道数(单声道 1 个,立体声 2 个)
signed - 指示数据是有符号的,还是无符号的
bigEndian - 指示是否以 big-endian 字节顺序存储单个样本中的数据( false 意味着 little-endian)。

二、在这个构造函数中,其他参数都好理解,只有bigEndian和littleEndian字节存储的顺序不懂,上网查了下,给出解释:

  来自:http://blog.csdn.net/sunshine1314/article/details/2309655

谈到字节序的问题,必然牵涉到两大CPU派系。那就是MotorolaPowerPC系列CPUIntelx86系列CPUPowerPC系列采用big endian方式存储数据,而x86系列则采用little endian方式存储数据。那么究竟什么是big endian,什么又是little endian呢?

     
其实big endian是指低地址存放最高有效字节(MSB),而little endian则是低地址存放最低有效字节(LSB)。

     用文字说明可能比较抽象,下面用图像加以说明。比如数字0x12345678在两种不同字节序CPU中的存储顺序如下所示:

Big Endian

   低地址                                            高地址
   ----------------------------------------->
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |     12     |      34    |     56      |     78    |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Little Endian

   低地址                                            高地址
   ----------------------------------------->
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |     78     |      56    |     34      |     12    |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

目前大多数操作系统,如windows、linux都是使用Little-endian存储字节,Mac,OS使用Big-endian存储字节;所有的网络协议都是使用big-endian来传输数据的,当两台采用不同字节序的主机通信时,在发送数据之前都必须经过字节序的转换成为网络字节序后再进行传输。

三、作者在Android和Windows7系统的PC之间进行语音对讲时,使用big-endian无法听到讲话内容,而使用little-endian则是成功的,具体原因还没有理解透彻,待以后慢慢学习。

AudioFormat format = new AudioFormat(8000, 16, 1, true, false); 

       
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要封装属于自己的音频格式,您需要了解音频格式的基本知识,并使用适当的库或工具进行编码和解码。下面是一个示例,演示如何封装属于自己的音频格式。 首先,您需要确定自己的音频格式的参数,如采样率、位深度、声道数等。然后,您可以使用Java中的`javax.sound.sampled`包来处理音频数据。 以下是一个简单的示例代码,用于封装属于自己的音频格式: ```java import javax.sound.sampled.*; public class CustomAudioFormat { public static void main(String[] args) { String inputFilePath = "path/to/input.wav"; String outputFilePath = "path/to/output.custom"; // 自定义音频格式的文件扩展名 try { // 获取输入音频流 AudioInputStream inputStream = AudioSystem.getAudioInputStream(new java.io.File(inputFilePath)); // 获取输入音频的格式 AudioFormat inputFormat = inputStream.getFormat(); // 创建自定义音频格式 AudioFormat customFormat = new AudioFormat( AudioFormat.Encoding.PCM_SIGNED, // 编码方式 44100, // 采样率 16, // 位深度 2, // 声道数 4, // frameSize = (位深度 / 8) * 声道数 44100, // frameRate = 采样率 true // bigEndian = true 表示使用大端字节顺序 ); // 转换为自定义音频格式 AudioInputStream customStream = AudioSystem.getAudioInputStream(customFormat, inputStream); // 写入目标文件 AudioSystem.write(customStream, AudioFileFormat.Type.OTHER, new java.io.File(outputFilePath)); System.out.println("音频格式封装成功!"); } catch (Exception e) { System.out.println("发生异常:" + e.getMessage()); e.printStackTrace(); } } } ``` 在上述示例中,我们首先定义了输入音频文件的路径`inputFilePath`和输出音频文件的路径`outputFilePath`。然后,通过`AudioSystem.getAudioInputStream()`方法获取输入音频流,并使用`getFormat()`方法获取输入音频的格式。 接下来,我们创建了一个新的音频格式`customFormat`,根据自己的需要设置自定义的音频参数。在这个示例中,我们使用了PCM_SIGNED编码方式、采样率为44100Hz、16位深度、2个声道、帧大小为4字节(16位深度/8 * 2声道)、帧率为44100Hz,并且使用大端字节顺序。 然后,使用`AudioSystem.getAudioInputStream()`方法将输入音频流转换为自定义音频格式,并使用`AudioSystem.write()`方法将自定义音频流写入输出文件。在这个示例中,我们将输出文件的格式设置为Type.OTHER,表示自定义的音频格式。 请注意,在实际应用中,您可能需要更复杂的音频编码和解码处理,以及更复杂的自定义格式规范。这只是一个简单的示例代码,用于演示封装自定义音频格式的基本思路。 希望以上信息对您有所帮助!如果有任何进一步的问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值