python服务端:接收UDP数据并播放
import socket
import threading
import pyaudio
q=pyaudio.PyAudio() # 实例化对象
wavechunk=7104
stream1 =q.open(format=pyaudio.paInt16,
channels=2,
rate=44100,
output=True,
frames_per_buffer=wavechunk) #播放
def recvived(address, port):
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
udp_socket.bind((address, port))
print("正在监听:"+address + ":" + str(port))
while True:
data,clientaddr= udp_socket.recvfrom(wavechunk)
print(str(clientaddr)+"已连接")
stream1.write(data)
# udp_socket.close()
if __name__ == '__main__':
port = 8888
address = socket.gethostbyname(socket.gethostname())
t = threading.Thread(target=recvived, args=(address, port))
t.start()
安卓客户端:mic录音并通过UDP发送,输入服务端IP地址后,点击audio connect即可传输音频
安卓MainActivityZL:
package com.example.myapplication;
import android.Manifest;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.pm.PackageManager;
import android.media.AudioFormat;
import android.media.AudioRecord;
import android.media.MediaRecorder;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.os.StrictMode;
import android.view.View;
import android.widget.TextView;
import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.Inet4Address;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Enumeration;
import java.util.List;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.stream.Collectors;
public class MainActivityZL extends AppCompatActivity {
private static List<String> address;
private UdpTransmissionThread udpTransmissionThread;
private AudioRecorderThread audioRecorderThread;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
EdgeToEdge.enable(this);
setContentView(R.layout.activity_main);
if (android.os.Build.VERSION.SDK_INT > 9) {
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
}
//获取本机ip地址
NetworkUtils networkUtils = new NetworkUtils();
address = networkUtils.getMobileDataIPAddress();
TextView textView1 = (TextView) findViewById(R.id.ip);
textView1.setText(address.toString());
//butten点击事件,UDP client每2s传输文字
findViewById(R.id.client).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Data.setA("True");
MyThread1 mt1 = new MyThread1("窗口1");
mt1.start();
}
});
//butten点击事件,关闭
findViewById(R.id.close).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Data.setA("Flase");
try {
audioRecorderThread.stopRecording();
udpTransmissionThread.stopTransform();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
});
//butten点击事件,开启服务线程
findViewById(R.id.server).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ServerThread st1 = new ServerThread("窗口3");
st1.start();
}
});
//butten点击事件,开启Audio_client线程
findViewById(R.id.audio_client).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//权限检查