WPF приложение для одновременной записи системного звука и звука с микрофона в один файл (WAV или MP3).
Проект построен на принципах Clean Architecture, DDD и SOLID:
src/
├── SystemRecord.Domain/ # Доменный слой - сущности, value objects, интерфейсы
│ ├── Entities/ # Сущности (RecordingSession)
│ ├── ValueObjects/ # Value objects (AudioFormat, RecordingConfiguration)
│ └── Interfaces/ # Порты (IAudioCapture, IAudioWriter, IAudioMixer)
│
├── SystemRecord.Application/ # Прикладной слой - use cases
│ ├── UseCases/ # Use cases (StartRecording, StopRecording)
│ └── Services/ # Интерфейсы сервисов
│
├── SystemRecord.Infrastructure/ # Инфраструктурный слой - адаптеры
│ ├── Audio/ # Реализация работы с аудио через NAudio
│ └── Services/ # Реализация сервисов
│
└── SystemRecord.Presentation/ # Слой представления - WPF UI
- Запись системного звука (через WASAPI Loopback)
- Запись звука с микрофона
- Микширование обоих источников в реальном времени
- Поддержка форматов:
- WAV (без сжатия, высокое качество)
- MP3 (сжатие для экономии места)
- Автоматическое сохранение:
- Записи сохраняются в папку
Desktop\recordings - Имена файлов генерируются автоматически по дате и времени
- Записи сохраняются в папку
- Профессиональная синхронизация:
- Устранены щелчки и рассинхронизация
- Плавная запись даже при разной частоте дискретизации устройств
- .NET 9.0 или выше
- Windows (для WASAPI)
cd src/SystemRecord.Presentation
dotnet run- Запустите приложение.
- Выберите источники звука (System Audio / Microphone).
- (Опционально) Отметьте "Save as MP3", если хотите получить MP3 файл.
- Нажмите "Start Recording".
- Нажмите "Stop Recording" для завершения.
Запись будет автоматически сохранена в папку recordings на рабочем столе.
- NAudio - работа с аудио устройствами
- WASAPI Loopback - захват системного звука
- WaveInEvent - захват звука с микрофона
- MediaFoundationEncoder - кодирование в MP3
- WPF - пользовательский интерфейс
- Microsoft.Extensions.DependencyInjection - внедрение зависимостей
Приложение использует продвинутую систему синхронизации:
- Захват: Аудио захватывается асинхронно в буферы (
BufferedWaveProvider). - Синхронизация: Специальный алгоритм ("Data Driven Clock") следит за наполнением буферов и читает данные только тогда, когда они реально доступны (порог 100мс). Это предотвращает "гонку" и вставку тишины.
- Микширование: Потоки ресемплируются и микшируются в единый поток.
- MP3 Кодирование:
- При выборе MP3 запись сначала идет во временный WAV файл (для надежности и исключения артефактов).
- После остановки записи файл мгновенно конвертируется в MP3.
- Hexagonal Architecture (Ports & Adapters) - изоляция бизнес-логики от инфраструктуры
- SOLID принципы - каждый класс имеет одну ответственность
- DDD - доменная модель с явными сущностями и value objects
- Dependency Injection - все зависимости внедряются через конструкторы