Thabang Kevin Khanye
2006-Jul-18 22:01 UTC
[Speex-dev] SpeexEncoder requires 320 samples to process a Frame, not 160
Hi guys I have tried compiling this attached code, I made all the buffers 320, there is no trace of a 160 buffer, but I get a " SpeexEncoder requires 320 samples to process a Frame, not 160" error. Maybe there's something I'm missing, here's my code: import java.io.IOException; import java.io.FileOutputStream; import java.io.File; import javax.sound.sampled.AudioFormat; import javax.sound.sampled.AudioSystem; import javax.sound.sampled.DataLine; import javax.sound.sampled.TargetDataLine; import javax.sound.sampled.AudioFormat.Encoding; import java.io.*; import org.xiph.speex.*; public class RecordTest { /** * @param args * @throws Exception */ private static int nbBytes = 0; private static int obBytes = 0; private static int myNum = 0; public static void main(String[] args) throws Exception { AudioFormat format; TargetDataLine line; byte[] buffer; format = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED,8000.0f, 16, 1, 2, 8000.0f, false); DataLine.Info info = new DataLine.Info(TargetDataLine.class, format); // format is an AudioFormat object FileOutputStream fos = new FileOutputStream(new File("Testing.raw")); if (!AudioSystem.isLineSupported(info)) throw new Exception("no line supported"); line = (TargetDataLine)AudioSystem.getLine(info); line.open(format); buffer = new byte[320]; byte[] mybuffer = new byte[4000000]; line.start(); System.out.println("Frame size: "+format.getFrameSize()); int numBytesRead; System.out.println("The buffer length is "+buffer.length+"\nMy packet buffers are: "+nbBytes+"\n"); System.out.println("My byffer bytes are: "+obBytes+"\nNumber of packets: "+myNum+"\nSize: "+myNum*nbBytes+"\nRecording started"); while (System.in.available() == 0) { numBytesRead = line.read(buffer, 0, 320); System.out.println("Num bytes read = "+numBytesRead+"\n"); buffer = encode(buffer); System.arraycopy(buffer, 0, mybuffer, myNum*nbBytes, nbBytes); myNum++; } line.stop(); System.out.println("Packet Size = "+nbBytes); while (System.in.available() > 0) { System.in.read(); } System.out.println("Recording stopped\n"); System.out.println("The packet buffer bytes : "+nbBytes+"\nMy buffer length is : "+buffer.length); System.out.println("My complete decoded buffer : "+mybuffer.length+"\nNumber of packets: "+myNum+"\nSize: "+myNum*nbBytes+"\nDecoding...\n\n"); mybuffer = decode(mybuffer); fos.write(mybuffer,0,myNum*320); fos.close(); System.out.println("The buffer length is "+buffer.length+"\nMy packet buffers are: "+nbBytes+"\n"); System.out.println("My byffer bytes are: "+obBytes+"\nNumber of packets: "+myNum+"\nSize: "+myNum*320+"\nDone."); System.exit(0); } /** * Encodes a wave file to speex. */ public static byte[] encode(byte[] cmbuffer) { byte[] temp = new byte[320]; int complexity = 3; int bitrate =-1; float vbr_quality = -1; boolean vbr = false; boolean vad = false; boolean dtx = false; // construct a new decoder SpeexEncoder speexEncoder = new SpeexEncoder(); speexEncoder.init(1, 8, 8000, 1); 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); } int pcmPacketSize = 320; speexEncoder.processData(cmbuffer, 0, pcmPacketSize); nbBytes = speexEncoder.getProcessedData(temp, 0); return temp; } public static byte[] decode(byte[] decbuffer) { SpeexDecoder speexDecoder = new SpeexDecoder(); int packetCount = 0; byte[] payload = new byte[65536]; int bodybytes = nbBytes; int decsize = 0; int Totsize = 0; byte[] completebuffer = new byte[4000000]; Totsize = myNum * bodybytes; speexDecoder.init(1, 8000, 1, true); while((packetCount*nbBytes) <= Totsize) { System.arraycopy(decbuffer, packetCount*bodybytes, payload, 0, bodybytes); try { speexDecoder.processData(payload,0, bodybytes); byte[] decoded = new byte[speexDecoder.getProcessedDataByteSize()]; decsize = speexDecoder.getProcessedData(decoded, 0); System.arraycopy(decoded, 0, completebuffer, packetCount*bodybytes, decsize); packetCount++; System.out.println("Decoding packet size: "+decsize+"\n"); } catch(StreamCorruptedException s) { System.out.println("Error ---> "+s.getMessage()); } } return completebuffer; } } Any help will greatly be appreciated. --------------------------------- Do you Yahoo!? Everyone is raving about the all-new Yahoo! Mail Beta. -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.xiph.org/pipermail/speex-dev/attachments/20060718/817677dc/attachment-0001.html
Jean-Marc Valin
2006-Jul-18 22:11 UTC
[Speex-dev] SpeexEncoder requires 320 samples to process a Frame, not 160
I think you'd have more luck posting to the jspeex mailing list. Jean-Marc On Tue, 2006-07-18 at 22:01 -0700, Thabang Kevin Khanye wrote:> Hi guys > > I have tried compiling this attached code, I made all the buffers 320, > there is no trace of a 160 buffer, but I get a " > SpeexEncoder requires 320 samples to process a Frame, not 160" error. > Maybe there's something I'm missing, here's my code: > > import java.io.IOException; > import java.io.FileOutputStream; > import java.io.File; > import javax.sound.sampled.AudioFormat; > import javax.sound.sampled.AudioSystem; > import javax.sound.sampled.DataLine; > import javax.sound.sampled.TargetDataLine; > import javax.sound.sampled.AudioFormat.Encoding; > > import java.io.*; > import org.xiph.speex.*; > > > public class RecordTest > { > > /** > * @param args > * @throws Exception > */ > private static int nbBytes = 0; > private static int obBytes = 0; > private static int myNum = 0; > > public static void main(String[] args) throws Exception > { > AudioFormat format; > TargetDataLine line; > byte[] buffer; > format = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED,8000.0f, 16, > 1, 2, 8000.0f, false); > DataLine.Info info = new DataLine.Info(TargetDataLine.class, format); > > // format is an AudioFormat object > FileOutputStream fos = new FileOutputStream(new File("Testing.raw")); > > if (!AudioSystem.isLineSupported(info)) > throw new Exception("no line supported"); > line = (TargetDataLine)AudioSystem.getLine(info); > line.open(format); > buffer = new byte[320]; > byte[] mybuffer = new byte[4000000]; > > line.start(); > System.out.println("Frame size: "+format.getFrameSize()); > int numBytesRead; > System.out.println("The buffer length is "+buffer.length+"\nMy packet > buffers are: "+nbBytes+"\n"); > System.out.println("My byffer bytes are: "+obBytes+"\nNumber of > packets: "+myNum+"\nSize: "+myNum*nbBytes+"\nRecording started"); > while (System.in.available() == 0) > { > numBytesRead = line.read(buffer, 0, 320); > System.out.println("Num bytes read = "+numBytesRead+"\n"); > buffer = encode(buffer); > System.arraycopy(buffer, 0, mybuffer, myNum*nbBytes, nbBytes); > myNum++; > } > line.stop(); > System.out.println("Packet Size = "+nbBytes); > while (System.in.available() > 0) > { > System.in.read(); > } > System.out.println("Recording stopped\n"); > System.out.println("The packet buffer bytes : "+nbBytes+"\nMy buffer > length is : "+buffer.length); > System.out.println("My complete decoded buffer : "+mybuffer.length > +"\nNumber of packets: "+myNum+"\nSize: "+myNum*nbBytes > +"\nDecoding...\n\n"); > > mybuffer = decode(mybuffer); > fos.write(mybuffer,0,myNum*320); > fos.close(); > System.out.println("The buffer length is "+buffer.length+"\nMy packet > buffers are: "+nbBytes+"\n"); > System.out.println("My byffer bytes are: "+obBytes+"\nNumber of > packets: "+myNum+"\nSize: "+myNum*320+"\nDone."); > System.exit(0); > } > > > /** > * Encodes a wave file to speex. > */ > public static byte[] encode(byte[] cmbuffer) > { > byte[] temp = new byte[320]; > int complexity = 3; > int bitrate =-1; > float vbr_quality = -1; > boolean vbr = false; > boolean vad = false; > boolean dtx = false; > > // construct a new decoder > SpeexEncoder speexEncoder = new SpeexEncoder(); > speexEncoder.init(1, 8, 8000, 1); > > 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); > } > > int pcmPacketSize = 320; > speexEncoder.processData(cmbuffer, 0, pcmPacketSize); > nbBytes = speexEncoder.getProcessedData(temp, 0); > return temp; > } > > public static byte[] decode(byte[] decbuffer) > { > SpeexDecoder speexDecoder = new SpeexDecoder(); > int packetCount = 0; > byte[] payload = new byte[65536]; > int bodybytes = nbBytes; > int decsize = 0; > int Totsize = 0; > byte[] completebuffer = new byte[4000000]; > > Totsize = myNum * bodybytes; > > speexDecoder.init(1, 8000, 1, true); > > while((packetCount*nbBytes) <= Totsize) > { > > System.arraycopy(decbuffer, packetCount*bodybytes, payload, 0, > bodybytes); > > try > { > speexDecoder.processData(payload,0, bodybytes); > byte[] decoded = new byte[speexDecoder.getProcessedDataByteSize()]; > decsize = speexDecoder.getProcessedData(decoded, 0); > System.arraycopy(decoded, 0, completebuffer, packetCount*bodybytes, > decsize); > packetCount++; > System.out.println("Decoding packet size: "+decsize+"\n"); > } > catch(StreamCorruptedException s) > { > System.out.println("Error ---> "+s.getMessage()); > } > } > > return completebuffer; > } > } > > Any help will greatly be appreciated. > > ______________________________________________________________________ > Do you Yahoo!? > Everyone is raving about the all-new Yahoo! Mail Beta. > _______________________________________________ > Speex-dev mailing list > Speex-dev@xiph.org > http://lists.xiph.org/mailman/listinfo/speex-dev