Hallo,
weiss vllt. jemand Rat wie ich das haessliche knacken aus meinen Aufnahmen bekomme? Ich muss PCM aufnehmen und per RTP übertragen. Ich verwende Javasound zum Aufnehmen und habe ein beispiel gefunden daraus um eine CustomDatasource für JMF zu erstellen, damit ich JMF für die RTP-Übertragung nehmen kann. Hab schon eine Weile dran rumgespielt, aber der Groschen will nicht fallen. Bin auf dem Gebiet sehr frisch.
Ich post mal meinen Sourcecode.
Und hier in einer Klasse wo ich den VoiceTransmitter erstelle ...
Wäre sehr dankbar, wenn mir wer irgendwelche Infos zu dem Thema liefern kann ;(
weiss vllt. jemand Rat wie ich das haessliche knacken aus meinen Aufnahmen bekomme? Ich muss PCM aufnehmen und per RTP übertragen. Ich verwende Javasound zum Aufnehmen und habe ein beispiel gefunden daraus um eine CustomDatasource für JMF zu erstellen, damit ich JMF für die RTP-Übertragung nehmen kann. Hab schon eine Weile dran rumgespielt, aber der Groschen will nicht fallen. Bin auf dem Gebiet sehr frisch.
Ich post mal meinen Sourcecode.
Java:
public class LiveAudioStream implements PushBufferStream, Runnable {
protected ContentDescriptor cd = new ContentDescriptor(
ContentDescriptor.RAW);
protected int maxDataLength;
protected int vez = 0;
protected AudioInputStream data;
public AudioInputStream audioStream;
protected byte[] audioBuffer;
protected javax.media.format.AudioFormat audioFormat;
protected boolean started;
protected Thread thread;
protected float frameRate = 20f;
protected BufferTransferHandler transferHandler;
protected Control[] controls = new Control[0];
public LiveAudioStream(TargetDataLine targetDataLine) {
audioStream = new AudioInputStream(targetDataLine);
audioBuffer = new byte[targetDataLine.getBufferSize()];
audioFormat = new AudioFormat(AudioFormat.LINEAR, 8000.0F, 8, 1,
Format.NOT_SPECIFIED, AudioFormat.SIGNED, 8,
Format.NOT_SPECIFIED, Format.byteArray);
maxDataLength = targetDataLine.getBufferSize();
thread = new Thread(this);
}
/***************************************************************************
* SourceStream
***************************************************************************/
public ContentDescriptor getContentDescriptor() {
return cd;
}
public long getContentLength() {
return LENGTH_UNKNOWN;
}
public boolean endOfStream() {
return false;
}
/***************************************************************************
* PushBufferStream
***************************************************************************/
int seqNo = 0;
double freq = 1.0;
public Format getFormat() {
return audioFormat;
}
public void read(Buffer buffer) throws IOException {
synchronized (this) {
Object outdata = buffer.getData();
if (outdata == null || !(outdata.getClass() == Format.byteArray)
|| ((byte[]) outdata).length < maxDataLength) {
outdata = new byte[maxDataLength];
buffer.setData(audioBuffer);
}
audioStream.read(audioBuffer);
buffer.setFormat(audioFormat);
buffer.setTimeStamp(1000000000 / 8);
}
buffer.setSequenceNumber(seqNo);
buffer.setLength(maxDataLength);
buffer.setFlags(0);
buffer.setHeader(null);
seqNo++;
}
public void setTransferHandler(BufferTransferHandler transferHandler) {
synchronized (this) {
this.transferHandler = transferHandler;
notifyAll();
}
}
void start(boolean started) {
synchronized (this) {
this.started = started;
if (started && !thread.isAlive()) {
thread = new Thread(this);
thread.start();
}
notifyAll();
}
}
/***************************************************************************
* Runnable
***************************************************************************/
public void run() {
while (started) {
synchronized (this) {
while (transferHandler == null && started) {
try {
wait(1000);
} catch (InterruptedException ie) {
}
} // while
}
if (started && transferHandler != null) {
transferHandler.transferData(this);
try {
Thread.currentThread().sleep(10);
} catch (InterruptedException ise) {
}
}
} // while (started)
} // run
// Controls
public Object[] getControls() {
return controls;
}
public Object getControl(String controlType) {
try {
Class cls = Class.forName(controlType);
Object cs[] = getControls();
for (int i = 0; i < cs.length; i++) {
if (cls.isInstance(cs[i]))
return cs[i];
}
return null;
} catch (Exception e) { // no such controlType or such control
return null;
}
}
}
Java:
import javax.media.Time;
import javax.media.protocol.*;
import java.io.IOException;
import java.io.InputStream;
import javax.sound.sampled.AudioInputStream;
public class CustomDataSource extends PushBufferDataSource {
protected Object [] controls = new Object[0];
protected boolean started = false;
protected String contentType = "raw";
protected boolean connected = false;
protected Time duration = DURATION_UNKNOWN;
protected LiveAudioStream [] streams = null;
protected LiveAudioStream stream = null;
public CustomDataSource(LiveAudioStream ls) {
streams = new LiveAudioStream[1];
stream = streams[0]= ls;
}
public String getContentType() {
if (!connected){
System.err.println("Error: DataSource not connected");
return null;
}
return contentType;
}
public byte[] getData() {
return stream.audioBuffer;
}
public void connect() throws IOException {
if (connected)
return;
connected = true;
}
public void disconnect() {
try {
if (started)
stop();
} catch (IOException e) {}
connected = false;
}
public void start() throws IOException {
// we need to throw error if connect() has not been called
if (!connected)
throw new java.lang.Error("DataSource must be connected before it can be started");
if (started)
return;
started = true;
stream.start(true);
}
public void stop() throws IOException {
if ((!connected) || (!started))
return;
started = false;
stream.start(false);
}
public Object [] getControls() {
return controls;
}
public Object getControl(String controlType) {
try {
Class cls = Class.forName(controlType);
Object cs[] = getControls();
for (int i = 0; i < cs.length; i++) {
if (cls.isInstance(cs[i]))
return cs[i];
}
return null;
} catch (Exception e) { // no such controlType or such control
return null;
}
}
public Time getDuration() {
return duration;
}
public PushBufferStream [] getStreams() {
return streams;
}
}
Und hier in einer Klasse wo ich den VoiceTransmitter erstelle ...
Java:
private String createProcessor() {
if (locator == null) {
return "Locator is null";
}
javax.sound.sampled.AudioFormat audioFormat = new javax.sound.sampled.AudioFormat(8000.0F,
8,
1,
true,
false);
DataLine.Info dataLineInfo = new DataLine.Info( TargetDataLine.class, audioFormat);
try {
targetDataLine = (TargetDataLine)
AudioSystem.getLine(dataLineInfo);
targetDataLine.open(audioFormat);
} catch (LineUnavailableException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
targetDataLine.start();
CustomDataSource dss = null;
try {
LiveAudioStream livestream = new LiveAudioStream(targetDataLine);
dss = new CustomDataSource(livestream);
dss.connect();
dss.start();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
DataSource ds;
// try {
// ds = Manager.createDataSource(dss);
// } catch (Exception e) {
// return "Couldn't create DataSource";
// }
// Try to create a processor to handle the input media locator
try {
processor = Manager.createProcessor(dss);
} catch (NoProcessorException npe) {
return "Couldn't create processor";
} catch (IOException ioe) {
return "IOException creating processor";
}
Wäre sehr dankbar, wenn mir wer irgendwelche Infos zu dem Thema liefern kann ;(