Escorp.Atom.Media.Audio
0.0.1
dotnet add package Escorp.Atom.Media.Audio --version 0.0.1
NuGet\Install-Package Escorp.Atom.Media.Audio -Version 0.0.1
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Escorp.Atom.Media.Audio" Version="0.0.1" />
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Escorp.Atom.Media.Audio" Version="0.0.1" />
<PackageReference Include="Escorp.Atom.Media.Audio" />
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add Escorp.Atom.Media.Audio --version 0.0.1
The NuGet Team does not provide support for this client. Please contact its maintainers for support.
#r "nuget: Escorp.Atom.Media.Audio, 0.0.1"
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package Escorp.Atom.Media.Audio@0.0.1
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=Escorp.Atom.Media.Audio&version=0.0.1
#tool nuget:?package=Escorp.Atom.Media.Audio&version=0.0.1
The NuGet Team does not provide support for this client. Please contact its maintainers for support.
Atom.Media.Audio
Кроссплатформенная библиотека для создания виртуальных микрофонов и управления аудиоустройствами без root-прав.
Основные возможности
- Виртуальный микрофон — создание аудиоустройства-источника в системе через нативные API
- PipeWire — нативная интеграция на Linux
- Аудио контролы — управление громкостью и мутом через SPA props
- 10 форматов семплов — U8/S16/S32/F32/F64 interleaved + planar
- Связка с камерой — объединение микрофона и камеры через общий
DeviceId - Zero-root — не требует привилегий суперпользователя
- NativeAOT-ready — совместимо с AOT-компиляцией и тримингом
Платформы
| Платформа | Бэкенд | Статус |
|---|---|---|
| Linux | PipeWire (нативный P/Invoke) | ✅ Реализован |
| macOS | CoreAudio HAL Plugin | 🔲 Планируется |
| Windows | WASAPI | 🔲 Планируется |
Быстрый старт
Создание виртуального микрофона
using Atom.Media.Audio;
var settings = new VirtualMicrophoneSettings
{
SampleRate = 48000,
Channels = 1,
SampleFormat = AudioSampleFormat.F32,
Name = "My Virtual Microphone",
};
await using var mic = await VirtualMicrophone.CreateAsync(settings);
await mic.StartCaptureAsync();
// Запись аудиосемплов
mic.WriteSamples(pcmData);
await mic.StopCaptureAsync();
Запись из WAV-файла или потока
// Из файла — параметры WAV должны совпадать с настройками микрофона
mic.WriteSamples("/path/to/audio.wav");
// Из потока (например, из сети или памяти)
using var stream = File.OpenRead("/path/to/audio.wav");
mic.WriteSamples(stream);
// Из URL (WAV через HTTP)
using var httpClient = new HttpClient();
using var httpStream = await httpClient.GetStreamAsync("https://example.com/audio.wav");
mic.WriteSamples(httpStream);
Стриминг из медиафайла или URL
Метод StreamFromAsync декодирует аудио через демуксер+кодек и записывает в микрофон в реальном времени:
// Из файла — формат определяется по расширению
await mic.StreamFromAsync("/path/to/music.wav");
// Из потока с указанием формата
using var stream = File.OpenRead("audio.wav");
await mic.StreamFromAsync(stream, "wav");
// Из URL
await mic.StreamFromAsync(new Uri("https://example.com/audio.wav"));
// С собственным HttpClient
using var httpClient = new HttpClient();
await mic.StreamFromAsync(
new Uri("https://example.com/audio.wav"),
httpClient);
// Зацикленное воспроизведение
using var cts = new CancellationTokenSource();
await mic.StreamFromAsync("/path/to/loop.wav", loop: true, cancellationToken: cts.Token);
Примечание: формат контейнера должен иметь зарегистрированный демуксер. WAV поддерживается из коробки.
Связка с виртуальной камерой
Микрофон и камера объединяются через общий DeviceId — PipeWire увидит их как одно устройство:
using Atom.Media.Audio;
using Atom.Media.Video;
var deviceId = Guid.NewGuid().ToString();
var camSettings = new VirtualCameraSettings
{
Width = 1920,
Height = 1080,
DeviceId = deviceId,
};
var micSettings = new VirtualMicrophoneSettings
{
SampleRate = 48000,
Channels = 1,
DeviceId = deviceId,
};
await using var camera = await VirtualCamera.CreateAsync(camSettings);
await using var mic = await VirtualMicrophone.CreateAsync(micSettings);
await camera.StartCaptureAsync();
await mic.StartCaptureAsync();
// Оба устройства связаны через device.id и node.group
Произвольные свойства PipeWire
var settings = new VirtualMicrophoneSettings
{
SampleRate = 44100,
Channels = 2,
ExtraProperties = new Dictionary<string, string>
{
["node.latency"] = "256/44100",
["media.role"] = "Music",
},
};
Поддерживаемые форматы семплов
| Категория | Форматы |
|---|---|
| Interleaved | U8, S16, S32, F32, F64 |
| Planar | U8Planar, S16Planar, S32Planar, F32Planar, F64Planar |
Контролы микрофона
| Контрол | SPA Prop | Диапазон |
|---|---|---|
Volume |
0x10001 |
0.0 — 1.0+ |
Mute |
0x10002 |
0.0 (off) / 1.0 (on) |
Управление контролами
await using var mic = await VirtualMicrophone.CreateAsync(settings);
await mic.StartCaptureAsync();
// Установить громкость
mic.SetControl(MicrophoneControlType.Volume, 0.8f);
// Получить текущее значение
float volume = mic.GetControl(MicrophoneControlType.Volume);
// Диапазон значений
MicrophoneControlRange? range = mic.GetControlRange(MicrophoneControlType.Volume);
Событие изменения контрола
mic.ControlChanged += (sender, args) =>
{
Console.WriteLine($"{args.Control}: {args.Value}");
if (args.Range is { } r)
Console.WriteLine($" [{r.Min} — {r.Max}], default={r.Default}");
};
Метаданные микрофона
| Свойство | Описание | PipeWire property |
|---|---|---|
Name |
Имя устройства | node.description |
Vendor |
Производитель | device.vendor.name |
Model |
Модель | device.product.name |
SerialNumber |
Серийный номер | device.serial |
Description |
Краткое описание | node.nick |
UsbVendorId |
USB VID устройства | device.vendor.id |
UsbProductId |
USB PID устройства | device.product.id |
DeviceId |
ID для связки с камерой | device.id + node.group |
Архитектура
VirtualMicrophone (public API)
└─ IVirtualMicrophoneBackend (internal)
├─ LinuxMicrophoneBackend → PipeWire Audio/Source
├─ MacOSMicrophoneBackend → CoreAudio HAL Plugin (planned)
└─ WindowsMicrophoneBackend → WASAPI (planned)
Требования
- .NET 10.0
- Linux: PipeWire ≥ 0.3 (
libpipewire-0.3.so.0)
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.
-
net10.0
- Escorp.Atom (>= 0.10.3)
- Escorp.Atom.Media (>= 0.2.2)
NuGet packages (1)
Showing the top 1 NuGet packages that depend on Escorp.Atom.Media.Audio:
| Package | Downloads |
|---|---|
|
Escorp.Atom.Net.Browsing.WebDriver
Package Description |
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 0.0.1 | 94 | 9/14/2026 |