`
jacky-zhang
  • 浏览: 315908 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

wave混音的实现(1)

    博客分类:
  • j2me
阅读更多
先看关于wav文件的头信息

下面是封装好的一个辅助类。用于生成头部信息。
package example.audiotest;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
/**
 * 
 * @author cninjazh
 * WavHeader辅助类。用于生成头部信息。
 * WAV标准,头部应该是44字节
 */
public class WaveHeader {
	public final char fileID[] = { 'R', 'I', 'F', 'F' };
	public int fileLength;
	public char wavTag[] = { 'W', 'A', 'V', 'E' };
	public char fmtHdrID[] = { 'f', 'm', 't', ' ' };
	public int fmtHdrLeth;
	public short formatTag;
	public short channels;
	public int samplesPerSec;
	public int avgBytesPerSec;
	public short blockAlign;
	public short bitsPerSample;
	public char dataHdrID[] = { 'd', 'a', 't', 'a' };
	public int dataHdrLeth;
	/*
	 * pre-define wave header for 256kbps, 16bit, 16kHz, 1(mono), pcm
	 * 填入参数,比特率等等。这里用的是16位单声道 16000Hz
	 * fileLength = 内容的大小(dataSize) + 头部字段的大小(不包括前面4字节的标识符RIFF以及fileLength本身的4字节)
	 * avgBytesPerSec = 8bit/16bit、11kHz/16kHz的WAV流进行传输(最大流量为16*16=256kbps=32KB/s)
	 */
	public WaveHeader(int dataSize) {
		fileLength = dataSize + (44 - 8);
		fmtHdrLeth = 16;
		bitsPerSample = 16;
		channels = 1;
		formatTag = 0x0001;
		samplesPerSec = 16000;
		blockAlign = (short) (channels * bitsPerSample / 8);
		avgBytesPerSec = blockAlign * samplesPerSec;
		dataHdrLeth = dataSize;
	}
	
	public WaveHeader(int dataSize, short bitsPerSample, int samplesPerSec) {
		fileLength = dataSize + (44 - 8);
		fmtHdrLeth = 16;
		this.bitsPerSample = bitsPerSample;
		channels = 1;
		formatTag = 0x0001;
		this.samplesPerSec = samplesPerSec;
		blockAlign = (short) (channels * bitsPerSample / 8);
		avgBytesPerSec = blockAlign * samplesPerSec;
		dataHdrLeth = dataSize;
	}
	
	public byte[] getHeader() throws IOException {
		ByteArrayOutputStream bos = new ByteArrayOutputStream();
		/*
		 * ①RIFF WAVE Chunk
  			==================================
 			 | |所占字节数| 具体内容 |
  			==================================
 			 | ID | 4 Bytes | 'RIFF' |
 			----------------------------------
 			 | Size | 4 Bytes | |
  			----------------------------------
 			 | Type | 4 Bytes | 'WAVE' |
 			----------------------------------
		 */
		WriteChar(bos, fileID);//以RIFF作为标识
		WriteInt(bos, fileLength);//size,该size的大小是整个WAVE文件大小减去8个字节
		WriteChar(bos, wavTag);//Type字段,为"WAVE"表示是Wav文件
		/*
		 * ②Format Chunk
  			====================================================================
  			| | 字节数 | 具体内容 |
  			====================================================================
 			| ID | 4 Bytes | 'fmt ' |
  			--------------------------------------------------------------------
  			| Size | 4 Bytes | 数值为16或18,18则最后又附加信息 |
 			 -------------------------------------------------------------------- ----
 		 	| FormatTag | 2 Bytes | 编码方式,一般为0x0001 | |
  			-------------------------------------------------------------------- |
  			| Channels | 2 Bytes | 声道数目,1--单声道;2--双声道 | |
  			-------------------------------------------------------------------- |
  			| SamplesPerSec | 4 Bytes | 采样频率 | |
  			-------------------------------------------------------------------- |
  			| AvgBytesPerSec| 4 Bytes | 每秒所需字节数 | |===> WAVE_FORMAT
  			-------------------------------------------------------------------- |
  			| BlockAlign | 2 Bytes | 数据块对齐单位(每个采样需要的字节数) | |
  			-------------------------------------------------------------------- |
  			| BitsPerSample | 2 Bytes | 每个采样需要的bit数 | |
  			-------------------------------------------------------------------- |
  			| | 2 Bytes | 附加信息(可选,通过Size来判断有无) | |
  			-------------------------------------------------------------------- ----
		 */
		WriteChar(bos, fmtHdrID);//以"fmt "作为标识
		WriteInt(bos, fmtHdrLeth);//一般长度为16个字节,如果是18个字节则有附加信息,写在最后两个字节上
		WriteShort(bos, formatTag);
		WriteShort(bos, channels);
		WriteInt(bos, samplesPerSec);
		WriteInt(bos, avgBytesPerSec);
		WriteShort(bos, blockAlign);
		WriteShort(bos, bitsPerSample);
		
		WriteChar(bos, dataHdrID);
		WriteInt(bos, dataHdrLeth);
		bos.flush();
		byte[] r = bos.toByteArray();
		bos.close();
		return r;
	}

	private void WriteShort(ByteArrayOutputStream bos, int s)
			throws IOException {
		byte[] mybyte = new byte[2];
		mybyte[1] = (byte) ((s << 16) >> 24);
		mybyte[0] = (byte) ((s << 24) >> 24);
		bos.write(mybyte);
	}

	private void WriteInt(ByteArrayOutputStream bos, int n) throws IOException {
		byte[] buf = new byte[4];
		buf[3] = (byte) (n >> 24);
		buf[2] = (byte) ((n << 8) >> 24);
		buf[1] = (byte) ((n << 16) >> 24);
		buf[0] = (byte) ((n << 24) >> 24);
		bos.write(buf);
	}

	private void WriteChar(ByteArrayOutputStream bos, char[] id) {
		for (int i = 0; i < id.length; i++) {
			char c = id[i];
			bos.write(c);
		}
	}
}

  • 大小: 76 KB
分享到:
评论

相关推荐

    wave混音的实现(2)

    这篇名为“wave混音的实现(2)”的博客文章可能是关于如何在编程中处理Wave格式的音频文件,进行混音操作的系列教程的第二部分。Wave(或WAV)是一种常见的无损音频文件格式,广泛用于专业音频编辑和制作。 混音,...

    可同时8个wave文件混音(338KB)...

    标题中的“可同时8个wave文件混音”指的是一个多媒体编程项目,它允许用户混合最多八个不同的WAV音频文件。WAV格式是Microsoft开发的一种无损音频文件格式,广泛用于存储高质量的声音数据。这个程序可能是为了音乐...

    可同时8个Wave文件混音(338KB)...

    1. WAVEMIX.BAS:这是VB的源代码文件,其中包含了实现混音功能的算法和逻辑。开发者可以通过阅读这个文件来了解如何控制和操作音频流。 2. File_id.diz:通常是一个简短的描述文件,包含程序的作者、版本和简要说明...

    可同时8个wave文件混音(338KB)

    标题中的“可同时8个wave文件混音(338KB)”表明这是一个关于音频处理的程序,能够同时对8个WAV格式的音频文件进行混音操作。WAV是无损音频格式,常用于专业音乐制作和编辑。这个程序可能是一个小巧的工具,其大小仅...

    声卡不支持混音样实现内录功能归纳.pdf

    5. 使用Audio Repeater程序将Wave in选择为Line1虚拟音频设备,将Wave out选择为实际的声卡设备。 6. 点击Start,并打开录音机和你需要录制的音频文件进行录音。 使用Virtual Audio Cable可以实现混音内录的效果,...

    声卡不支持混音照样实现内录功能.pdf

    "声卡不支持混音照样实现内录功能" 本文主要讲述了如何在不支持混音的声卡上实现内录功能。声卡厂商由于RIAA(Recording Industry Association of America,美国唱片工业联合会)的压力,对音频模块的功能做了限制...

    wave底层接口的实现

    除了基本的输入输出功能,wave底层接口还支持其他高级特性,如音频数据的混音、缓冲管理、同步和错误处理等。例如,开发者可以使用waveInPrepareHeader和waveInUnprepareHeader函数来准备和释放缓冲区,确保数据正确...

    C#麦克风混音录制,保存MP3格式在本地

    waveIn.WaveFormat = new WaveFormat(44100, 16, 1); // 设置录音采样率,位深度和声道数 ``` 为了实现混音功能,我们需要将多个音频流合并到一个流中。这可能涉及到多个麦克风输入或者其他音频源,如系统播放的...

    多媒体会议中新型快速实时混音算法

    针对这些问题,本文介绍了一种新的快速实时混音算法——非均匀波形收缩混音算法(Asymmetrical Wave-Shrinking, AWS),旨在提高混音质量的同时减少计算复杂度。 #### 现有混音算法存在的问题 现有的混音算法主要...

    实例32 控制混音效果

    1. **MMSYS API**:这是Windows操作系统内置的一套多媒体处理接口,其中的waveOut和waveIn函数可以用于音频播放和录制。对于混音,我们可以使用waveOutWrite函数来控制各个音频源的播放,通过调整缓冲区中的数据,...

    一个非常完全的waveOut程序,包括了一个waveOut类和使用类的范例

    1. `mMixer.bas`:这可能是一个Basic语言编写的模块,用于混合音频信号或者控制音频设备的混音器设置。 2. `CMixer.cls`:这是可能定义了类的类库文件,可能包含了对waveOut API的封装,以及对音频设备的操作和管理...

    混音器编程CMixer

    在这个项目中,我们将深入探讨混音器编程的核心概念以及CMixer如何实现这些功能。 混音器(Mixer)是一个软件或硬件设备,它能够混合多个音频源,调整每个源的音量、平衡、声道等参数,并将它们输出为单一的音频流...

    WaveOut接口.rar

    1. `waveOutOpen`:这个函数用于打开一个WaveOut设备。你需要指定一个设备ID,以及回调函数的指针,以便在音频播放过程中接收设备事件。此函数会返回一个句柄,后续的操作都将基于这个句柄进行。 2. `...

    音频插件(Wave3_0)效果各种简介(教程+下载)

    C1 Effect是C1 Compressor和C1 Gate功能的集成,还增加了侧链滤波器和独特的"Key Mode",可以实现复杂的音频处理,如嘶声消除和节奏强化。而C1-comp与C1类似,提供了预设方案,简化了用户的操作流程。 Waves的C4多...

    VC 声音WAVE 处理

    通过理解和掌握上述知识点,开发者可以使用VC++有效地处理WAVE声音文件,实现各种音频应用,如录音、混音、音频分析等。实际编程中,还需要根据具体项目需求选择合适的API和策略,灵活运用这些技术。

    cooledit wave全套插件

    6. **多轨混音**:在Cool Edit中,Wave插件还能支持多轨音频的混音操作,方便用户同时处理多个音频轨道,实现复杂的音频合成。 7. **自动化控制**:插件可能还包含自动化参数设置,允许用户根据时间线自定义音频...

    WAVE6000.rar

    同时,它的多轨混音功能让用户可以同时处理多个音轨,实现复杂的音乐编排和效果叠加。此外,软件内含大量的预设效果器,如均衡器、压缩器、混响、延迟等,以及可自定义的VST插件支持,让音色的塑造拥有无限可能。 ...

    paly wave file vs2010

    在本文中,我们将深入探讨如何在Visual Studio 2010...对于更复杂的需求,如音效处理、实时混音或跨平台支持,可以考虑使用专门的音频库。确保正确地将压缩包中的代码集成到你的项目中,以便有效地实现音频播放功能。

    WaveOut播放音频流示例

    在`WaveOutDemo`项目中,你可能会看到类似这样的代码实现,通过NAudio库创建一个WinForms窗体,添加按钮控件来控制音频的播放、暂停和停止。通过这个简单的示例,你可以了解到如何在WinForms应用中利用`WaveOut`播放...

    Mp3 encoder(based lame), Audio(mp3, wave) mixed

    1. **Wave文件格式**:Wave(或称WAV)是Microsoft开发的一种无损音频格式,存储的是原始PCM(脉冲编码调制)数据,通常具有较大的文件体积。这种格式能够保持音频的质量,但不适合在互联网上分享或存储大量音乐。 ...

Global site tag (gtag.js) - Google Analytics