You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Hololens麦克风语音输入传输至PC(Linux/Windows)

Hololens UWP 语音录制 + 跨平台PC传输完整方案

我来帮你梳理从Hololens捕获麦克风语音,再通过Windows.Networking.Sockets传输到Windows/Linux PC的具体实现思路和代码,分录制、传输两个核心部分来讲:

一、先搞定语音捕获(基础环节)

首先得确保能正确从Hololens麦克风录制音频,用Windows.Media.Capture.MediaCapture就行,推荐直接录制到内存流(不用先存本地,传输更高效):

private MediaCapture _mediaCapture;
private InMemoryRandomAccessStream _audioStream;

// 初始化音频捕获
private async Task InitializeAudioCaptureAsync()
{
    _mediaCapture = new MediaCapture();
    var captureSettings = new MediaCaptureInitializationSettings
    {
        StreamingCaptureMode = StreamingCaptureMode.Audio,
        MediaCategory = MediaCategory.Speech // 针对语音优化的配置
    };
    await _mediaCapture.InitializeAsync(captureSettings);
}

// 开始录制到内存流
private async Task StartRecordingAsync()
{
    _audioStream = new InMemoryRandomAccessStream();
    // 用WAV格式,跨平台兼容性最好
    var encodingProfile = MediaEncodingProfile.CreateWav(AudioEncodingQuality.High);
    await _mediaCapture.StartRecordToStreamAsync(encodingProfile, _audioStream);
}

// 停止录制,准备传输
private async Task StopRecordingAsync()
{
    await _mediaCapture.StopRecordAsync();
    _audioStream.Seek(0); // 把流指针重置到开头,方便后续读取
}

二、用Socket传输音频(两种场景)

你提到的传输音频文件,我分完整文件传输和实时流式传输两种场景讲,后者适合语音通话类的实时需求:

1. 传输完整音频文件(TCP Socket)

UWP用StreamSocket做客户端,PC端对应写一个Socket服务端(Windows用.NET,Linux用Python/C#都可以):

Hololens端(UWP客户端)代码

private async Task SendAudioToPC(string pcIp, int port)
{
    var socket = new StreamSocket();
    try
    {
        // 连接到PC的Socket服务
        await socket.ConnectAsync(new HostName(pcIp), port.ToString());

        // 把内存流里的音频转成字节数组
        var audioBytes = new byte[_audioStream.Size];
        await _audioStream.ReadAsync(audioBytes.AsBuffer(), (uint)_audioStream.Size, InputStreamOptions.None);

        // 先发送文件大小(让服务端知道要接收多少字节)
        var sizeBuffer = BitConverter.GetBytes(audioBytes.Length);
        await socket.OutputStream.WriteAsync(sizeBuffer.AsBuffer());

        // 发送音频数据
        await socket.OutputStream.WriteAsync(audioBytes.AsBuffer());

        Debug.WriteLine("音频文件传输完成");
    }
    catch (Exception ex)
    {
        Debug.WriteLine($"传输出错:{ex.Message}");
    }
    finally
    {
        socket.Dispose();
    }
}

PC端服务端示例(Windows/.NET)

using System.Net;
using System.Net.Sockets;
using System.IO;

var listener = new TcpListener(IPAddress.Any, 12345);
listener.Start();
Console.WriteLine("等待Hololens连接...");

var client = await listener.AcceptTcpClientAsync();
var stream = client.GetStream();

// 先接收文件大小
var sizeBuffer = new byte[4];
await stream.ReadAsync(sizeBuffer, 0, 4);
int fileSize = BitConverter.ToInt32(sizeBuffer, 0);

// 接收完整音频数据
var audioBuffer = new byte[fileSize];
int totalReceived = 0;
while (totalReceived < fileSize)
{
    int received = await stream.ReadAsync(audioBuffer, totalReceived, fileSize - totalReceived);
    totalReceived += received;
}

// 保存为WAV文件
await File.WriteAllBytesAsync("hololens_audio.wav", audioBuffer);

client.Close();
listener.Stop();
Console.WriteLine("音频接收并保存完成");

PC端服务端示例(Linux/Python)

如果你的PC是Linux,用Python写服务端更简单:

import socket

HOST = '0.0.0.0'  # 监听所有网卡
PORT = 12345

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.bind((HOST, PORT))
    s.listen()
    conn, addr = s.accept()
    with conn:
        print(f"已连接:{addr}")
        # 接收文件大小
        size_data = conn.recv(4)
        file_size = int.from_bytes(size_data, byteorder='little')
        # 接收音频数据
        audio_data = b''
        while len(audio_data) < file_size:
            # 每次接收4KB片段,避免内存溢出
            chunk = conn.recv(min(4096, file_size - len(audio_data)))
            if not chunk:
                break
            audio_data += chunk
        # 保存到本地
        with open('hololens_audio.wav', 'wb') as f:
            f.write(audio_data)
        print("音频接收完成")

2. 实时流式传输(适合语音通话)

如果不需要完整文件,而是要实时传语音,可以在录制的同时分片发送,不用等录制结束:

private bool _isStreaming = false;
private async Task StartLiveStreaming(string pcIp, int port)
{
    await InitializeAudioCaptureAsync();
    var socket = new StreamSocket();
    await socket.ConnectAsync(new HostName(pcIp), port.ToString());

    _isStreaming = true;
    _audioStream = new InMemoryRandomAccessStream();
    var encodingProfile = MediaEncodingProfile.CreateWav(AudioEncodingQuality.Medium);
    await _mediaCapture.StartRecordToStreamAsync(encodingProfile, _audioStream);

    // 每100ms读取一次流片段发送
    while (_isStreaming)
    {
        long availableBytes = _audioStream.Size - _audioStream.Position;
        if (availableBytes > 0)
        {
            var chunk = new byte[availableBytes];
            await _audioStream.ReadAsync(chunk.AsBuffer(), (uint)availableBytes, InputStreamOptions.None);
            await socket.OutputStream.WriteAsync(chunk.AsBuffer());
        }
        await Task.Delay(100);
    }

    await _mediaCapture.StopRecordAsync();
    socket.Dispose();
}

// 停止流式传输
private void StopLiveStreaming()
{
    _isStreaming = false;
}

三、必做的配置和注意事项

  • UWP权限:一定要在Package.appxmanifest里开启Microphone和Internet (Client)权限,否则麦克风和网络都用不了。
  • 网络环境:Hololens和PC必须在同一局域网,或者PC有公网IP并做好端口映射;Linux PC要记得开放对应端口(比如ufw allow 12345)。
  • 音频格式:优先用WAV,无压缩跨平台兼容性强;如果要减小传输体积,可以用Windows.Media.Transcoding转成MP3/AAC,但需要额外处理编码。
  • 错误处理:实际代码里一定要加try-catch,处理连接超时、麦克风被占用、传输中断等异常。

四、调试小技巧

  • 用Visual Studio调试Hololens时,可以查看_audioStream的Size和内容,确认录制是否正常。
  • PC端用Wireshark抓包,检查音频数据是否正确传输。
  • 先测试短音频片段,确认流程没问题后再处理大文件或实时流。

内容的提问来源于stack exchange,提问作者Rena

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:01:04