如何将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
相关产品推荐
相关产品推荐

