[Speex-dev] SpeexEncoder requires 320 samples to process a Frame,
not 160
Thabang Kevin Khanye
tkkhanye at yahoo.com
Tue Jul 18 22:01:30 PDT 2006
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
More information about the Speex-dev
mailing list