Soket Programlama İle Mikrofon Dinlemek
-
Şu udp'ye salacağınız tamponun boyutlarını biraz küçültüp hem sunucu hem de istemcide eşit yapıp deneseniz?
-
hemfikiriz hocam ama beceremedim
-
edit// DatagramSocket i global yapınca ses en azından anlaşılır oldu ama hala takılmalar var. do not continiously open and close the AudioLine dediği olayı nasıl yapabilirim ?
projenin son hali şu şekilde; stackoverflow da gelen bir cevap var ama onu da tam yapamadım
Also, do not continiously open and close the AudioLine to the speakers. Do also not continuously create DatagramSockets. Create one, and keep it.
demişler. open ve close fonksiyonlarını döngü içinde değil de nasıl kullanmam lazım öyleyse? ve DatagramSocket i bir kere yarat onun üstünden yap demiş ama yaratırken try-catch kullanmam gerekiyor try-catch kullanarak global değişken yaratılabiliyor mu ?
server:
package soketprogramla;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.Mixer;
import javax.sound.sampled.Port;
import javax.sound.sampled.TargetDataLine;
public class MicPlayer {
{
try
{
DatagramSocket sock = new DatagramSocket() ;
}
catch( Exception e )
{
e.printStackTrace() ;
System.out.println(" Unable to send soundpacket using UDP " ) ;
}
}
private static final String IP_TO_STREAM_TO = "192.168.1.6" ;
private static final int PORT_TO_STREAM_TO = 8888 ;
/** Creates a new instance of MicPlayer */
public MicPlayer() {
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
Mixer.Info minfo[] = AudioSystem.getMixerInfo() ;
for( int i = 0 ; i < minfo.length ; i++ )
{
System.out.println( minfo[i] ) ;
}
if (AudioSystem.isLineSupported(Port.Info.MICROPHONE)) {
try {
DataLine.Info dataLineInfo = new DataLine.Info(
TargetDataLine.class , getAudioFormat() ) ;
final TargetDataLine targetDataLine = (TargetDataLine)AudioSystem.getLine( dataLineInfo ) ;
targetDataLine.open( getAudioFormat() );
targetDataLine.start();
byte tempBuffer[] = new byte[8192] ;
int cnt = 0 ;
while( true )
{
targetDataLine.read( tempBuffer , 0 , tempBuffer.length );
sendThruUDP( tempBuffer ) ;
}
}
catch(Exception e )
{
System.out.println(" not correct " ) ;
System.exit(0) ;
}
}
}
public static AudioFormat getAudioFormat(){
float sampleRate = 8000.0F;
//8000,11025,16000,22050,44100
int sampleSizeInBits = 16;
//8,16
int channels = 1;
//1,2
boolean signed = true;
//true,false
boolean bigEndian = false;
//true,false
return new AudioFormat( sampleRate, sampleSizeInBits, channels, signed, bigEndian );
}
public static void sendThruUDP( byte soundpacket[] )
{
try
{
DatagramSocket sock = new DatagramSocket() ;
sock.send( new DatagramPacket( soundpacket , soundpacket.length , InetAddress.getByName( IP_TO_STREAM_TO ) , PORT_TO_STREAM_TO ) ) ;
sock.close() ;
}
catch( Exception e )
{
e.printStackTrace() ;
System.out.println(" Unable to send soundpacket using UDP " ) ;
}
}
}
-----------------------------
client:
package soketprogramla;
import java.io.DataInputStream;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.SourceDataLine;
public class RadioReceiver extends Thread {
private static final String IP_TO_STREAM_TO = "localhost" ;
private static final int PORT_TO_STREAM_TO = 8888 ;
/** Creates a new instance of RadioReceiver */
public RadioReceiver() {
}
public void run()
{
byte b[] = null ;
while( true )
{
b = receiveThruUDP() ;
toSpeaker( b ) ;
}
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
RadioReceiver r = new RadioReceiver() ;
r.start() ;
}
public static byte[] receiveThruUDP()
{
try
{
DatagramSocket sock = new DatagramSocket(PORT_TO_STREAM_TO) ;
byte soundpacket[] = new byte[8192] ;
DatagramPacket datagram = new DatagramPacket( soundpacket , soundpacket.length , InetAddress.getByName( IP_TO_STREAM_TO ) , PORT_TO_STREAM_TO ) ;
sock.receive( datagram ) ;
sock.close() ; return datagram.getData() ; // soundpacket ;
}
catch( Exception e )
{
System.out.println(" Unable to send soundpacket using UDP " ) ;
return null ;
}
}
public static void toSpeaker( byte soundbytes[] )
{
try{
DataLine.Info dataLineInfo = new DataLine.Info( SourceDataLine.class , getAudioFormat() ) ;
SourceDataLine sourceDataLine = (SourceDataLine)AudioSystem.getLine( dataLineInfo );
sourceDataLine.open( getAudioFormat() ) ;
sourceDataLine.start();
int cnt = 0;
sourceDataLine.write( soundbytes , 0, soundbytes.length );
sourceDataLine.drain() ;
sourceDataLine.close() ;
}
catch(Exception e )
{
System.out.println("not working in speakers " ) ;
}
}
public static AudioFormat getAudioFormat()
{
float sampleRate = 8000.0F;
//8000,11025,16000,22050,44100
int sampleSizeInBits = 16;
//8,16
int channels = 1;
//1,2
boolean signed = true;
//true,false
boolean bigEndian = false;
//true,false
return new AudioFormat( sampleRate, sampleSizeInBits, channels, signed, bigEndian );
}
}
manyaki tarafından 02/Oca/14 22:04 tarihinde düzenlenmiştir -
belki sorun mikrofondadır ? başka mikrofonla dene istersen
-
yok hocam mikde sorun yok
-
Genki bunu yazdı
bence dosya aktarımda udp olmaz tcp olur
sesli iletişim ise udp ile yapılmalıdır,yoksa aşırı trafik üretimi ve hantallık olur gibime geliyor
+1
zaten sesli iletişimde veri kısa bir süreliğine bozuk gitse bile problem olmaz ufa dalgalanmalar yaşanır farkedilmez bile çoğu zaman. ama dosya aktarımında veya bozuk veya eksik gittiğinde çok büyük ihtimalle dosya bozulacağından açılamaz.
-
sample rate düşük ses ondan öyle geliyor. 44100 yap düzelir. örneklemeden sonra da ses yükselsin istiyorsan çıkış değerlerini 20-70 arası bir değerle çarp. bi de mono alıyosun sesi tek kanal. streo al iş görsün bari. 1 i 2 yapman lazım hocam.
-
C den anlıyorsan bunu dene http://www.andreadrian.de/babyphone/ daha önce kullanmıştım.
-
Soket programlama, node.js yada bu tarz uygulamalar hakkında sağlam bir kaynak var mı? Bana baya bir karışık geldi bu node.js ama çözdüğüm bir kaç olayda işimi oldukça kolaylaştırdı. Bu yüzden iyi derecede öğrenmem lazım düşüncesindeyim.