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

wave混音的实现(2)

    博客分类:
  • j2me
阅读更多
关于混音算法,参考的是http://jacky-zhang.iteye.com/blog/766053,下面是具体的实现逻辑
package example.audio;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;

import javax.microedition.io.Connector;
import javax.microedition.io.HttpConnection;
import javax.microedition.io.file.FileConnection;
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Form;
import javax.microedition.media.Manager;
import javax.microedition.media.MediaException;
import javax.microedition.media.Player;
import javax.microedition.media.PlayerListener;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;

public class Mixing2 extends MIDlet implements CommandListener{
	private Command play1 = new Command("Play one", Command.OK, 0);
	private Command play2 = new Command("Play two", Command.OK, 1);
	private Command play3 = new Command("Play three", Command.OK, 6);
	private Command stop1 = new Command("Stop one", Command.CANCEL, 2);
	private Command stop2 = new Command("stop two", Command.CANCEL, 3);
	private Command stop3 = new Command("stop three", Command.CANCEL, 7);
	private Command playMix = new Command("play mix", Command.OK, 4);
	private Command stopRecord = new Command("stop record", Command.OK, 5);
	private Player player1;
	private Player player2;
	private Player player3;
	private Player player4;
	private String[] urls = {"/128kbps/intwap-5.wav","/128kbps/intwap-6.wav","/128kbps/intwap-7.wav"};
	private Form form = new Form("Test mixing");
	private byte[][] data = new byte[3][];
	private int[][] times = new int[3][];
	private long startTime = 0;
	private long size;
	private int idx1 = 0;
	private int idx2 = 0;
	private int idx3 = 0;
	private static final int FIRST = 1;
	private static final int SECOND = 2;
	private static final int THIRD = 3;
	private boolean start = false;
	
	public Mixing2() {}

	protected void destroyApp(boolean arg0) throws MIDletStateChangeException {	}

	protected void pauseApp() {	}

	protected void startApp() throws MIDletStateChangeException {
		form.addCommand(play1);
		form.addCommand(stop1);
		form.addCommand(play2);
		form.addCommand(stop2);
		form.addCommand(play3);
		form.addCommand(stop3);
		form.addCommand(playMix);
		form.addCommand(stopRecord);
		form.setCommandListener(this);
		Display.getDisplay(this).setCurrent(form);
	}
	
	public void commandAction(Command arg0, Displayable arg1) {
		if (arg0 == play1) {
			form.append("play one");
			if(startTime == 0) startTime = System.currentTimeMillis();
			new Thread(){
				public void run() {
					try {
						stopPlayer1();
						(player1 = initPlayer(FIRST)).start();
					} catch (MediaException e) {
						e.printStackTrace();
					}					
				}
			}.start();
			System.out.println("player1.start.time: "+System.currentTimeMillis());
		}
		else if (arg0 == stop1) {
			stopPlayer1();
		}
		else if (arg0 == play2) {
			form.append("play two");
			if(startTime == 0) startTime = System.currentTimeMillis();
			new Thread(){
				public void run() {
					try {
						stopPlayer2();
						(player2 = initPlayer(SECOND)).start();
					} catch (MediaException e) {
						e.printStackTrace();
					}					
				}
			}.start();
		}
		else if (arg0 == stop2) {
			stopPlayer2();
		}
		else if (arg0 == play3) {
			form.append("play three");
			if(startTime == 0) startTime = System.currentTimeMillis();
			new Thread(){
				public void run() {
					try {
						stopPlayer3();
						(player3 = initPlayer(THIRD)).start();
					} catch (MediaException e) {
						e.printStackTrace();
					}					
				}
			}.start();
		}
		else if (arg0 == stop3) {
			stopPlayer3();
		}
		else if (arg0 == playMix) {
			new Thread(){
				public void run() {
					try {
						ByteArrayOutputStream bos = new ByteArrayOutputStream();
						byte[] data = mixing();
						System.out.println("combine.................data "+data.length);
						try {
							bos.write(new WaveHeader(data.length, (short)16, 8000).getHeader());
							bos.write(data);
						} catch (IOException e) {
							e.printStackTrace();
						}
						System.out.println("ready....stop....player........ ");
						stopPlayer4();
						System.out.println("ready....mix....player........ ");
						player4 = Manager.createPlayer(new ByteArrayInputStream(bos.toByteArray()), "audio/x-wav");
						player4.prefetch();
						player4.realize();
						player4.start();
					} catch (IOException e) {
						e.printStackTrace();
					} catch (MediaException e) {
						e.printStackTrace();
					}
					System.out.println("playing.........mix.......data ");
					for(int i=0;i<times.length;i++){
						times[i] = null;
					}
					startTime = 0;
					idx1 = idx2 = idx3 = 0;
				};
			}.start();
		}
		else if (arg0 == stopRecord) {
			stopPlayer1();
			stopPlayer2();
			stopPlayer3();
			System.gc();
		}
	}
	
	private void saveToDisk(){
//		FileConnection file = (FileConnection)Connector.open("file://localhost/" + );
	}
	
	private byte[] mixing(){
		size = (System.currentTimeMillis() - startTime) * 16;
		long start = System.currentTimeMillis();
		byte[] mixData = new byte[(int) size];
		byte[][] mixPices = new byte[times.length][];
		System.out.println("111111111111: "+size);
		for(int i=0; i< times.length;i++){
			if(times[i]==null) continue;
			mixPices[i] = new byte[(int) size];
			int length = data[i].length-44;
			for(int j =0; j<times[i].length;j++){
				if(times[i][j]==0)break;
				System.out.println("player"+i+".time: "+times[i][j]);
				if((j+1)%2==0)System.out.println((times[i][j]-times[i][j-1]));
				if((j+1)%2==0) {
					int max = times[i][j]-times[i][j-1];
					for (int k = 44; k < max; k++){
						if(k >= length) break;
						mixPices[i][(int) times[i][j-1]+k-44] = data[i][k];
					}
				}
			}
		}
		System.out.println("999999999999: "+(System.currentTimeMillis() - start));
		double f = 1.0f;
		int MAX = 127, MIN = -127;
		double STEPSIZE;
		for(int m=0;m<mixData.length;m++){
			mixData[m] = 0;
			double temp = 0;
			for(int n =0;n<mixPices.length;n++){
				if(mixPices[n]==null) continue;
				temp += mixPices[n][m];
			}
			if(temp==0) continue;
			temp = temp * f;
			if(temp>MAX){
				double f0 = 127.0f/temp;
				f = f0;
				temp = MAX;
			}
			else if(temp < MIN){
				double f0 = -127.0f/temp;
				f = f0;
				temp = (byte) MIN;
			}
			if(f<1) {
				STEPSIZE = ((1.0f-f)/16);
				f += STEPSIZE;
			}
			mixData[m] = (byte) temp;
		}
		for(int n =0;n<mixPices.length;n++){
			mixPices[n] = null;
		}
		mixPices = null;
		System.out.println("mix cost time: "+(System.currentTimeMillis()-start));
		return mixData;
	}
	
	private Player initPlayer(int p){
		byte[] temp = null;
		PlayerListener plistener = null;
		if( p == FIRST) {
			if (data[0]==null) {
				data[0] = getWaveData(urls[0]);
			}
			temp = data[0];
			plistener = p1;
		}
		else if(p==SECOND) {
			if(data[1]==null){
				data[1] = getWaveData(urls[1]);
			}
			temp = data[1];
			plistener = p2;
		}
		else if(p==THIRD) {
			if(data[2]==null){
				data[2] = getWaveData(urls[2]);
			}
			temp = data[2];
			plistener = p3;
		}
		Player player = null;
		try {
			InputStream is = new ByteArrayInputStream(temp);
			player = Manager.createPlayer(is, "audio/x-wav");
			player.prefetch();
			player.realize();
			player.addPlayerListener(plistener);
//			player.setLoopCount(-1);
		} catch (MediaException e) {
			e.printStackTrace();
		}catch (IOException e) {
			e.printStackTrace();
		}
		return player;
	}
	
	private void stopPlayer1(){
		if(player1!=null && player1.getState() != Player.CLOSED){
			form.append("stop one");
			try {
				player1.stop();
				player1.close();
				player1 = null;
//				System.gc();
			} catch (MediaException e) {
				e.printStackTrace();
			}			
		}
	}
	
	private void stopPlayer2(){
		if(player2!=null && player2.getState() != Player.CLOSED){
			form.append("stop two");
			try {
				player2.stop();
				player2.close();
				player2 = null;
//				System.gc();
			} catch (MediaException e) {
				e.printStackTrace();
			}			
		}
	}
	
	private void stopPlayer3(){
		if(player3!=null && player3.getState() != Player.CLOSED){
			form.append("stop three");
			try {
				player3.stop();
				player3.close();
				player3 = null;
//				System.gc();
			} catch (MediaException e) {
				e.printStackTrace();
			}			
		}
	}
	private void stopPlayer4(){
		if(player4!=null && player4.getState() != Player.CLOSED){
			form.append("stop mix");
			try {
				player4.stop();
				player4.close();
				player4 = null;
//				System.gc();
			} catch (MediaException e) {
				e.printStackTrace();
			}			
		}
	}
	
	PlayerListener p1 = new PlayerListener(){

		public void playerUpdate(Player arg0, String arg1, Object arg2) {
			if(arg1.equals(PlayerListener.END_OF_MEDIA)){
				System.out.println("end of media");
//				System.out.println(System.currentTimeMillis());
				times[0][idx1] = (int) ((System.currentTimeMillis() - startTime) * 16);
				idx1++;
				System.out.println("  player1.cost.time: "+arg0.getMediaTime());
			}
			else if(arg1.equals(PlayerListener.STOPPED)){
				System.out.println("stopped");
				times[0][idx1] = (int) ((System.currentTimeMillis() - startTime) * 16);
				idx1++;
//				System.out.println(System.currentTimeMillis());
			}
			else if(arg1.equals(PlayerListener.STARTED)){
				System.out.println("started");
				if(times[0] == null) times[0] = new int[100];
				times[0][idx1] = (int) ((System.currentTimeMillis() - startTime) * 16);
				idx1++;
				System.out.println(System.currentTimeMillis());
			}
		}
		
	};
	
	PlayerListener p2 = new PlayerListener(){

		public void playerUpdate(Player arg0, String arg1, Object arg2) {
			if(arg1.equals(PlayerListener.STARTED)){
				System.out.println("started");
				if(times[1] == null) times[1] = new int[100];
				times[1][idx2] = (int) ((System.currentTimeMillis() - startTime) * 16);
				idx2++;
//				System.out.println(System.currentTimeMillis());
			}
			else if(arg1.equals(PlayerListener.STOPPED)){
				System.out.println("stopped");
				times[1][idx2] = (int) ((System.currentTimeMillis() - startTime) * 16);
				idx2++;
//				System.out.println(System.currentTimeMillis());
			}
			else if(arg1.equals(PlayerListener.END_OF_MEDIA)){
				System.out.println(player2.getState());
				times[1][idx2] = (int) ((System.currentTimeMillis() - startTime) * 16);
				idx2++;
			}
		}
		
	};

	PlayerListener p3 = new PlayerListener(){

		public void playerUpdate(Player arg0, String arg1, Object arg2) {
			if(arg1.equals(PlayerListener.STARTED)){
				System.out.println("started");
				if(times[2] == null) times[2] = new int[100];
				times[2][idx3] = (int) ((System.currentTimeMillis() - startTime) * 16);
				idx3++;
//				System.out.println(System.currentTimeMillis());
			}
			else if(arg1.equals(PlayerListener.STOPPED)){
				System.out.println("stopped");
				times[2][idx3] = (int) ((System.currentTimeMillis() - startTime) * 16);
				idx3++;
//				System.out.println(System.currentTimeMillis());
			}
			else if(arg1.equals(PlayerListener.END_OF_MEDIA)){
				System.out.println(player3.getState());
				times[2][idx3] = (int) ((System.currentTimeMillis() - startTime) * 16);
				idx3++;
			}
		}
		
	};
	private byte[] getWaveData(String url){
		ByteArrayOutputStream bos = new ByteArrayOutputStream();
		InputStream is = getClass().getResourceAsStream(url);
//		int m = 0;
		byte[] d = new byte[2048];
		while(true){
			try {
				int t = is.read(d);
//				m = is.read();
				if(t==-1) break;
				bos.write(d);
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		byte[] data = bos.toByteArray();
		System.out.println(data.length);
		try {
			is.close();
			bos.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return data;
	}

}
分享到:
评论

相关推荐

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

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

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

    标题中的“可同时8个Wave文件混音”指的是一个VB(Visual Basic)编程项目,它具有混合多个Wave音频文件的能力。Wave文件是音频文件的一种常见格式,通常用于存储高质量的声音数据。这个程序允许用户将8个不同的Wave...

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

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

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

    声卡不支持混音样实现内录功能归纳 在本文中,我们将讨论声卡不支持混音样实现内录功能的原因和解决方法。声卡厂商迫于RIAA的压力,对音频模块的功能进行了限制,无法直接实现混音和内录的功能。针对此问题,我们...

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

    知识点2:实现内录的方法 要想在不支持混音的声卡上实现内录,比较切实可行的方法有两个。第一种方法是直接使用一根两端都是公头的音频线将笔记本的MIC和耳机接口连接,实现内录。但是这种方法有其局限性,无法从...

    wave底层接口的实现

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

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

    在本文中,我们将深入探讨如何使用C#编程语言在Windows Forms环境下实现麦克风混音录制并保存为MP3格式的本地文件。C#是Microsoft开发的一种面向对象的编程语言,广泛应用于桌面应用开发,包括多媒体应用程序。...

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

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

    实例32 控制混音效果

    本实例“控制混音效果”专注于讲解如何在VC++环境中实现混音功能,这对于初学者,尤其是进行课程设计的菜鸟来说,是非常实用的学习资源。 混音是将多个音频信号合并成一个单一输出的过程,它涉及到音量调整、声相...

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

    2. `CMixer.cls`:这是可能定义了类的类库文件,可能包含了对waveOut API的封装,以及对音频设备的操作和管理。 3. `fmain.frm` 和 `fmain.frx`:这通常是VB(Visual Basic)应用程序的主窗体文件和资源文件,用于...

    混音器编程CMixer

    2. **音量控制**:音量控制是混音器的基本功能。CMixer允许用户独立地调整每个音频源的音量,这涉及到数字信号处理中的增益控制。增益控制可以改变信号的幅度,从而改变音量,同时还需要考虑到防止音频失真。 3. **...

    WaveOut接口.rar

    2. `waveOutPrepareHeader`:在开始播放前,需要先准备Wave格式的数据块。这个函数将Wave数据包与设备关联起来,确保数据可以正确传输到声卡。 3. `waveOutWrite`:此函数用于将准备好的Wave数据发送到声卡进行播放...

    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

    - `Wav2Mp3.cpp`: 实现了Wave文件到MP3的转换逻辑。 - `lame_enc.def`: 定义了DLL(动态链接库)导出的函数。 - `lame_enc.dll`: LAME编码器的动态库文件,供应用程序调用。 - `lame_enc.doc`: 可能包含了LAME...

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

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

Global site tag (gtag.js) - Google Analytics