Quiero capturar y transmitir audio usando JMF 2.1.1e en formato RTP. Escribí un transmisor simple, puedo transmitir y recibir el audio. Pero cuando vi en Wireshark, vi los paquetes como UDP. ¿Alguien puede señalarme el problema, por favor?¿Por qué es UDP, no RTP en Wireshark cuando hago stream usando jmf?
Y aquí está mi función responsable de la captura y transmisión de audio.
public void captureAudio(){
// Get the device list for ULAW
Vector devices = captureDevices();
CaptureDeviceInfo captureDeviceInfo = null;
if (devices.size() > 0) {
//get the first device from the list and cast it as CaptureDeviceInfo
captureDeviceInfo = (CaptureDeviceInfo) devices.firstElement();
}
else {
// exit if we could not find the relevant capturedevice.
System.out.println("No such device found");
System.exit(-1);
}
Processor processor = null;
try {
//Create a Processor for the specified media.
processor = Manager.createProcessor(captureDeviceInfo.getLocator());
} catch (IOException ex) {
System.err.println(ex);
} catch (NoProcessorException ex) {
System.err.println(ex);
}
//Prepares the Processor to be programmed.
//puts the Processor into the Configuring state.
processor.configure();
//Wait till the Processor configured.
while (processor.getState() != Processor.Configured){
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//Sets the output content-type for this Processor
processor.setContentDescriptor(CONTENT_DESCRIPTOR);
/**
ContentDescriptor CONTENT_DESCRIPTOR
= new ContentDescriptor(ContentDescriptor.RAW_RTP);
*/
//Gets a TrackControl for each track in the media stream.
TrackControl track[] = processor.getTrackControls();
boolean encodingOk = false;
//searching through tracks to get a supported audio format track.
for (int i = 0; i < track.length; i++) {
if (!encodingOk && track[i] instanceof FormatControl) {
if (((FormatControl)
track[i]).setFormat(new AudioFormat(AudioFormat.ULAW_RTP, 8000, 8, 1)) == null)
{
track[i].setEnabled(false);
}
else {
encodingOk = true;
track[i].setEnabled(encodingOk);
System.out.println("enc: " + i);
}
} else {
// we could not set this track to ULAW, so disable it
track[i].setEnabled(false);
}
}
//If we could set this track to ULAW we proceed
if (encodingOk){
processor.realize();
while (processor.getState() != Processor.Realized){
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
DataSource dataSource = null;
try {
dataSource = processor.getDataOutput();
} catch (NotRealizedError e) {
e.printStackTrace();
}
try {
String url= "rtp://192.168.1.99:49150/audio/1";
MediaLocator m = new MediaLocator(url);
DataSink d = Manager.createDataSink(dataSource, m);
d.open();
d.start();
System.out.println("transmitting...");
processor.start();
} catch (Exception e) {
e.printStackTrace();
}
}
}
Y por favor pregunte, si encuentra algo impropio o vago. Gracias de antemano. :)
Aclaración: Tengo un pedazo de código C# para RTP streaming. Y cuando capture a los datos utilizando Wireshark, puedo ver como RTP, pero el problema es cuando capture a la corriente de datos de JMF Wireshark mostrarlos como UDP. Y mi pregunta es, ¿por qué?
Conozco la diferencia entre UDP y RTP.
Creo que el problema está en CONTENT_DESCRIPTOR, es raw-rtp. – shibli049
Entiendo que su código se está ejecutando, excepto por el problema que está enfrentando en este momento. Necesitamos ver en el código fuente de JMF cómo JMF implementa la clase Processor cuando usa el CONTENT_DESCRIPTOR como lo dijo Osbcure. Quizás esta es la diferencia entre los códigos C# y Java JMF. ¿Le importa saber qué biblioteca de transmisión está utilizando para la versión de C#? – ecle
@eee: el proyecto C# está usando pjsipDll, simplemente lo traje de un amigo para probar los paquetes en wireshark, y no estoy acostumbrado a trabajar con C#. Por lo tanto, no podría darle más detalles sobre C#. – shibli049