UDP传输mic音频数据(从安卓传到桌面python服务端)

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) {
                //权限检查
              
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值