public virtual void EncodeToSpeex(java.io.RandomInputStream srcStream, java.io.RandomOutputStream destStream) { java.io.DataInputStream dis = new java.io.DataInputStream(srcStream); org.xiph.speex.OggSpeexWriter writer = new org.xiph.speex.OggSpeexWriter(mode, sampleRate, channels, nframes, vbr); writer.open(destStream); writer.writeHeader("Encoded with: " + VERSION); try { int len = int.Parse(srcStream.InnerStream.Length.ToString()); while (len > 0) { len -= (PacketSize); dis.readFully(TempBuffer, 0, PacketSize); Speex_Encoder.processData(TempBuffer, 0, PacketSize); int encsize = Speex_Encoder.getProcessedData(TempBuffer, 0); if (encsize > 0) { writer.writePacket(TempBuffer, 0, encsize); } } } catch (java.io.EOFException){} finally { writer.close(); dis.close(); } }
// ---| public virtual void encode(java.io.File srcPath, java.io.File destPath) { byte[] temp = new byte[2560]; // stereo UWB requires one to read 2560b int HEADERSIZE = 8; string RIFF = "RIFF"; string WAVE = "WAVE"; string FORMAT = "fmt "; string DATA = "data"; int WAVE_FORMAT_PCM = unchecked((int)(0x0001)); // Display info if (printlevel <= INFO) { version(); } if (printlevel <= DEBUG) { System.Console.WriteLine(string.Empty); } if (printlevel <= DEBUG) { System.Console.WriteLine("Input File: " + srcPath); } // Open the input stream java.io.DataInputStream dis = new java.io.DataInputStream(new java.io.FileInputStream (srcPath)); // Prepare input stream if (srcFormat == FILE_FORMAT_WAVE) { // read the WAVE header dis.readFully(temp, 0, HEADERSIZE + 4); // make sure its a WAVE header if (!RIFF.Equals(cspeex.StringUtil.getStringForBytes(temp, 0, 4)) && !WAVE.Equals(cspeex.StringUtil.getStringForBytes (temp, 8, 4))) { System.Console.Error.WriteLine("Not a WAVE file"); return; } // Read other header chunks dis.readFully(temp, 0, HEADERSIZE); string chunk = cspeex.StringUtil.getStringForBytes(temp, 0, 4); int size = readInt(temp, 4); while (!chunk.Equals(DATA)) { dis.readFully(temp, 0, size); if (chunk.Equals(FORMAT)) { if (readShort(temp, 0) != WAVE_FORMAT_PCM) { System.Console.Error.WriteLine("Not a PCM file"); return; } channels = readShort(temp, 2); sampleRate = readInt(temp, 4); if (readShort(temp, 14) != 16) { System.Console.Error.WriteLine("Not a 16 bit file " + readShort(temp, 18)); return; } // Display audio info if (printlevel <= DEBUG) { System.Console.WriteLine("File Format: PCM wave"); System.Console.WriteLine("Sample Rate: " + sampleRate); System.Console.WriteLine("Channels: " + channels); } } dis.readFully(temp, 0, HEADERSIZE); chunk = cspeex.StringUtil.getStringForBytes(temp, 0, 4); size = readInt(temp, 4); } if (printlevel <= DEBUG) { System.Console.WriteLine("Data size: " + size); } } else { if (sampleRate < 0) { switch (mode) { case 0: { sampleRate = 8000; break; } case 1: { sampleRate = 16000; break; } case 2: { sampleRate = 32000; break; } default: { sampleRate = 8000; break; } } } // Display audio info if (printlevel <= DEBUG) { System.Console.WriteLine("File format: Raw audio"); System.Console.WriteLine("Sample rate: " + sampleRate); System.Console.WriteLine("Channels: " + channels); System.Console.WriteLine("Data size: " + srcPath.length()); } } // Set the mode if it has not yet been determined if (mode < 0) { if (sampleRate < 100) { // Sample Rate has probably been given in kHz sampleRate *= 1000; } if (sampleRate < 12000) { mode = 0; } else { // Narrowband if (sampleRate < 24000) { mode = 1; } else { // Wideband mode = 2; } } } // Ultra-wideband // Construct a new encoder org.xiph.speex.SpeexEncoder speexEncoder = new org.xiph.speex.SpeexEncoder(); speexEncoder.init(mode, quality, sampleRate, channels); if (complexity > 0) { speexEncoder.getEncoder().setComplexity(complexity); } if (bitrate > 0) { speexEncoder.getEncoder().setBitRate(bitrate); } if (vbr) { speexEncoder.getEncoder().setVbr(vbr); if (vbr_quality > 0) { speexEncoder.getEncoder().setVbrQuality(vbr_quality); } } if (vad) { speexEncoder.getEncoder().setVad(vad); } if (dtx) { speexEncoder.getEncoder().setDtx(dtx); } // Display info if (printlevel <= DEBUG) { System.Console.WriteLine(string.Empty); System.Console.WriteLine("Output File: " + destPath); System.Console.WriteLine("File format: Ogg Speex"); System.Console.WriteLine("Encoder mode: " + (mode == 0 ? "Narrowband" : (mode== 1 ? "Wideband" : "UltraWideband"))); System.Console.WriteLine("Quality: " + (vbr ? vbr_quality : quality)); System.Console.WriteLine("Complexity: " + complexity); System.Console.WriteLine("Frames per packet: " + nframes); System.Console.WriteLine("Varible bitrate: " + vbr); System.Console.WriteLine("Voice activity detection: " + vad); System.Console.WriteLine("Discontinouous Transmission: " + dtx); } // Open the file writer org.xiph.speex.AudioFileWriter writer; if (destFormat == FILE_FORMAT_OGG) { writer = new org.xiph.speex.OggSpeexWriter(mode, sampleRate, channels, nframes, vbr ); } else { if (destFormat == FILE_FORMAT_WAVE) { nframes = org.xiph.speex.PcmWaveWriter.WAVE_FRAME_SIZES[mode - 1][channels - 1][quality ]; writer = new org.xiph.speex.PcmWaveWriter(mode, quality, sampleRate, channels, nframes , vbr); } else { writer = new org.xiph.speex.RawWriter(); } } writer.open(destPath); writer.writeHeader("Encoded with: " + VERSION); int pcmPacketSize = 2 * channels * speexEncoder.getFrameSize(); try { // read until we get to EOF while (true) { dis.readFully(temp, 0, nframes * pcmPacketSize); for (int i = 0; i < nframes; i++) { speexEncoder.processData(temp, i * pcmPacketSize, pcmPacketSize); } int encsize = speexEncoder.getProcessedData(temp, 0); if (encsize > 0) { writer.writePacket(temp, 0, encsize); } } } catch (java.io.EOFException) { } writer.close(); dis.close(); }