예제 #1
0
 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();
     }
 }
예제 #2
0
        // ---|
        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();
        }