Фреймворк аудио используется для реализации аудиофункциональности, включая воспроизведение аудио, запись аудио, управление громкостью и управление устройствами.
Рисунок 1 Архитектура фреймворка аудио
Сampling
Процесс сampling — это процесс получения дискретных сигналов времени путём извлечения образцов из аналоговых сигналов в непрерывной области времени с определённым интервалом.
Частота дискретизации
Частота дискретизации — количество образцов, извлекаемых из непрерывного сигнала за секунду для создания дискретного сигнала. Она измеряется в Гц. Обычно диапазон человеческого слуха составляет от 20 Гц до 20 кГц. Некоторыми распространенными частотами дискретизации являются 8 кГц, 11,025 кГц, 22,050 кГц, 16 кГц, 37,8 кГц, 44,1 кГц, 48 кГц, 96 кГц и 192 кГц.
Канал
Каналы относятся к различным пространственным позициям, где независимые аудиосигналы записываются или воспроизводятся. Количество каналов равно количеству аудиопотоков, используемых при записи аудио, или количеству динамиков, используемых для воспроизведения аудио.
АудиофреймАудиоданные представлены в виде потока. Для удобства обработки алгоритмами и передачи данных обычно считается, что объём данных в размере от 2,5 до 60 миллисекунд является одним аудиофреймом. Этот размер называется временем выборки, и его продолжительность зависит от кодека и требований приложения.- PCM
Пульсационное кодовое модулирование (PCM) — метод цифровой передачи отобранных аналоговых сигналов. Он преобразует непрерывные временные аналоговые сигналы в дискретные временные цифровые образцы.
Структура директорий репозитория следующая:
/foundation/мультимедиа/аудио_стандарт # Код сервиса аудиофреймворка
├── frameworks # Код фреймворков
│ ├── native # Внутренняя реализация внутреннего нативного API
│ └── js # Реализация внешнего JS API
│ └── napi # Реализация внешнего нативного API
├── interfaces # Код API
│ ├── inner_api # Внутренние API
│ └── kits # Внешние API
├── sa_profile # Конфигурационный профиль службы
├── services # Код сервисов
├── LICENSE # Лицензионный файл
└── bundle.json # Файл сборки
Вы можете использовать предоставляемые в текущем репозитории API для преобразования данных аудио в слышимые аналоговые сигналы, проигрывания аудио с помощью выходных устройств и управления задачами воспроизведения. Ниже приведено описание того, как использовать класс AudioRenderer для реализации функции проигрывания аудио:1. Вызовите метод Create() с требуемым типом потока для создания экземпляра класса AudioRenderer.
```cpp
AudioStreamType streamType = STREAM_MUSIC; // Пример типа потока.
std::unique_ptr<AudioRenderer> audioRenderer = AudioRenderer::Create(streamType);
```
(Необязательно) Вызовите статические методы GetSupportedFormats(), GetSupportedChannels(), GetSupportedEncodingTypes() и GetSupportedSamplingRates() для получения поддерживаемых значений параметров.
Подготовьте устройство и вызовите метод SetParams() для установки параметров.
AudioRendererParams rendererParams;
rendererParams.sampleFormat = SAMPLE_S16LE;
rendererParams.sampleRate = SAMPLE_RATE_44100;
rendererParams.channelCount = STEREO;
rendererParams.encodingType = ENCODING_PCM;
audioRenderer->SetParams(rendererParams);
(Необязательно) Вызовите метод GetParams(rendererParams) для получения установленных параметров.
Вызовите метод Start() для запуска задачи воспроизведения аудио.
Вызовите метод GetBufferSize() для получения размера буфера для записи.
audioRenderer->GetBufferSize(&bufferLen);
Вызовите метод Write() для чтения данных аудио из источника (например, файла аудио) и передачи его в поток байтов. Вы можете повторно вызывать этот метод для записи данных рендера.
bytesToWrite = fread(buffer, 1, bufferLen, wavFile);
while ((bytesWritten < bytesToWrite) && ((bytesToWrite - bytesWritten) > minBytes)) {
bytesWritten += audioRenderer->Write(buffer + bytesWritten, bytesToWrite - bytesWritten);
if (bytesWritten < 0)
break;
}
Вызовите метод Drain() для очистки потоков для воспроизведения.9. Вызовите метод Stop() для прекращения воспроизведения.
После завершения задачи воспроизведения вызовите метод Release() для освобождения ресурсов.
Приведённые выше шаги описывают базовый сценарий разработки для воспроизведения аудио.
Вы можете использовать предоставляемые в текущем репозитории API для записи аудио через входное устройство, преобразования аудио в аудиоданные и управления задачами записи. Ниже приведено описание того, как использовать класс AudioCapturer для реализации функции аудиозаписи:
Вызовите Create() с требуемым типом потока для создания экземпляра класса AudioCapturer.
AudioStreamType streamType = STREAM_MUSIC;
std::unique_ptr<AudioCapturer> audioCapturer = AudioCapturer::Create(streamType);
(Необязательно) Вызовите статические методы GetSupportedFormats(), GetSupportedChannels(), GetSupportedEncodingTypes() и GetSupportedSamplingRates() для получения поддерживаемых значений параметров.
Подготовьте устройство и вызовите SetParams() для установки параметров. ``` AudioCapturerParams capturerParams; capturerParams.sampleFormat = SAMPLE_S16LE; capturerParams.sampleRate = SAMPLE_RATE_44100; capturerParams.channelCount = STEREO; capturerParams.encodingType = ENCODING_PCM;
audioCapturer->SetParams(capturerParams);
(Необязательно) Вызовите GetParams(capturerParams) для получения установленных параметров.
Вызовите Start() для запуска задачи записи аудио.
Вызовите GetBufferSize() для получения размера буфера для записи.
audioCapturer->GetBufferSize(bufferLen);
Вызовите bytesRead() для чтения захваченных данных аудио и конвертации их в поток байтов. Приложение будет повторно вызывать этот метод для чтения данных до тех пор, пока запись не будет остановлена вручную.
// установите isBlocking = true/false для блокирующего/неблокирующего чтения
bytesRead = audioCapturer->Read(*buffer, bufferLen, isBlocking);
while (numBuffersToCapture) {
bytesRead = audioCapturer->Read(*buffer, bufferLen, isBlockingRead);
if (bytesRead < 0) {
break;
} else if (bytesRead > 0) {
fwrite(buffer, size, bytesRead, recFile); // пример показывает запись записанных данных в файл
numBuffersToCapture--;
}
}
(Необязательно) Вызовите Flush() для очистки буфера потока записи.
Вызовите Stop() для прекращения записи.
После завершения задачи записи вызовите Release() для освобождения ресурсов.Для подробностей см. audio_capturer.h и audio_info.h.
Вы можете использовать API, предоставляемые в audio_system_manager.h, чтобы контролировать уровень звука и устройства.1. Вызовите GetInstance(), чтобы получить экземпляр AudioSystemManager.
AudioSystemManager *audioSystemMgr = AudioSystemManager::GetInstance();
Вызовите GetMaxVolume() и GetMinVolume(), чтобы получить максимальную и минимальную допустимую громкость для аудиопотока.
AudioVolumeType streamType = AudioVolumeType::STREAM_MUSIC;
int32_t maxVol = audioSystemMgr->GetMaxVolume(streamType);
int32_t minVol = audioSystemMgr->GetMinVolume(streamType);
Вызовите SetVolume() и GetVolume(), чтобы установить и получить текущую громкость аудиопотока соответственно.
int32_t result = audioSystemMgr->SetVolume(streamType, 10);
int32_t vol = audioSystemMgr->GetVolume(streamType);
Вызовите SetMute() и IsStreamMute(), чтобы установить и получить состояние глушения аудиопотока соответственно.
int32_t result = audioSystemMgr->SetMute(streamType, true);
bool isMute = audioSystemMgr->IsStreamMute(streamType);
Вызовите SetRingerMode() и GetRingerMode(), чтобы установить и получить режим звонка соответственно. Поддерживаемые режимы звонка являются перечисленными значениями AudioRingerMode, определёнными в audio_info.h.
int32_t result = audioSystemMgr->SetRingerMode(RINGER_MODE_SILENT);
AudioRingerMode ringMode = audioSystemMgr->GetRingerMode();
Вызовите SetMicrophoneMute() и IsMicrophoneMute(), чтобы установить и получить состояние глушения микрофона соответственно.
int32_t result = audioSystemMgr->SetMicrophoneMute(true);
bool isMicMute = audioSystemMgr->IsMicrophoneMute();
```#### Контроль устройств
Вызовите GetDevices, deviceType_, и deviceRole_, чтобы получить информацию о устройствах входа и выхода аудио. Для подробностей см. перечисленные значения DeviceFlag, DeviceType, и DeviceRole, определённые в audio_info.h.
DeviceFlag deviceFlag = OUTPUT_DEVICE_FLAG;
std::vector<std::shared_ptr<AudioDeviceDescriptor>> audioDeviceDescriptions
= audioSystemMgr->GetDevices(deviceFlag);
std::shared_ptr<AudioDeviceDescriptor> audioDeviceDescription = audioDeviceDescriptions[0];
cout << audioDeviceDescription->deviceType_;
cout << audioDeviceDescription->deviceRole_;
AudioDeviceType deviceType = AudioDeviceType::SPEAKER;
int32_t result = audioSystemMgr->SetDeviceActive(deviceType, true);
bool isActive = audioSystemMgr->IsDeviceActive(deviceType);
const audioController = audio.getAudioController();
```javascript
export default {
onCreate() {
audioManager.on('volumeChange', (volumeChange) => {
console.info('volumeType = ' + volumeChange.volumeType);
console.info('volume = ' + volumeChange.volume);
console.info('updateUi = ' + volumeChange.updateUi);
});
}
};
### Аудио сцена
11. Вызовите **SetAudioScene()** и **getAudioScene()**, чтобы установить и получить аудиосцену соответственно.
```cpp
int32_t result = audioSystemMgr->SetAudioScene(AUDIO_SCENE_PHONE_CALL);
AudioScene audioScene = audioSystemMgr->GetAudioScene();
```
Для получения подробной информации о поддерживаемых аудиосценах см. перечисленные значения **AudioScene** в [**audio_info.h**](https://gitee.com/openharmony/multimedia_audio_framework/blob/master/interfaces/inner_api/native/audiocommon/include/audio_info.h).
### Управление потоками аудио
Вы можете использовать API, предоставляемые в [**audio_stream_manager.h**](https://gitee.com/openharmony/multimedia_audio_framework/blob/master/interfaces/inner_api/native/audiomanager/include/audio_stream_manager.h), для реализации управления потоками.1. Вызовите **GetInstance()**, чтобы получить экземпляр **AudioSystemManager**.
```
AudioSystemManager *audioSystemMgr = AudioSystemManager::GetInstance();
```
2. Вызовите **RegisterAudioRendererEventListener()**, чтобы зарегистрировать слушатель для изменения состояния рендера. При изменении состояния рендера будет вызван обратный вызов. Вы можете переопределить метод **OnRendererStateChange()** в классе **AudioRendererStateChangeCallback**.
```
const int32_t clientPid;
class RendererStateChangeCallback : public AudioRendererStateChangeCallback {
public:
RendererStateChangeCallback() = default;
~RendererStateChangeCallback() = default;
void OnRendererStateChange(const std::vector<std::shared_ptr<AudioRendererChangeInfo>> &audioRendererChangeInfos) override {
std::cout << "OnRendererStateChange entered" << std::endl;
}
};
std::shared_ptr<AudioRendererStateChangeCallback> callback = std::make_shared<RendererStateChangeCallback>();
int32_t state = audioSystemMgr->RegisterAudioRendererEventListener(clientPid, callback);
int32_t result = audioSystemMgr->UnregisterAudioRendererEventListener(clientPid);
```
3. Вызовите **RegisterAudioCapturerEventListener()**, чтобы зарегистрировать слушатель для изменений состояния захвата аудио. При изменении состояния захвата будет вызван обратный вызов. Вы можете переопределить метод **OnCapturerStateChange()** в классе **AudioCapturerStateChangeCallback**.
```cpp
const int32_t clientPid;
class CapturerStateChangeCallback : public AudioCapturerStateChangeCallback {
public:
CapturerStateChangeCallback() = default;
~CapturerStateChangeCallback() = default;
void OnCapturerStateChange(const std::vector<std::shared_ptr<AudioCapturerChangeInfo>>& audioCapturerChangeInfos) override {
std::cout << "OnCapturerStateChange entered" << std::endl;
}
};
```std::shared_ptr<AudioCapturerStateChangeCallback> callback = std::make_shared<CapturerStateChangeCallback>();
int32_t state = audioStreamMgr->RegisterAudioCapturerEventListener(clientPid, callback);
int32_t result = audioStreamMgr->UnregisterAudioCapturerEventListener(clientPid);4. Вызовите **GetCurrentRendererChangeInfos()**, чтобы получить информацию обо всех запущенных рендерах, включая UID клиента, идентификатор сессии, информацию о рендере, состояние рендера и детали выходного устройства.
```cpp
std::vector<std::shared_ptr<AudioRendererChangeInfo>> audioRendererChangeInfos;
int32_t currentRendererChangeInfo = audioStreamMgr->GetCurrentRendererChangeInfos(audioRendererChangeInfos);
std::vector<std::shared_ptr<AudioCapturerChangeInfo>> audioCapturerChangeInfos;
int32_t currentCapturerChangeInfo = audioStreamMgr->GetCurrentCapturerChangeInfos(audioCapturerChangeInfos);
Дополнительные сведения см. в разделах audioRendererChangeInfos и audioCapturerChangeInfos в audio_info.h.
Вызовите IsAudioRendererLowLatencySupported(), чтобы проверить, поддерживается ли низкая задержка.
const AudioStreamInfo &audioStreamInfo;
bool isLatencySupport = audioStreamMgr->IsAudioRendererLowLatencySupported(audioStreamInfo);
```#### Использование API JavaScript
Приложения на JavaScript могут вызывать аудиоуправляемые API для управления громкостью и устройствами. Для подробностей см. js-apis-audio.md.
Вы можете использовать API, предоставляемые в audio_bluetooth_manager.h, чтобы реализовать вызовы через синхронные соединения с ориентацией на канал (SCO).1. Вызовите OnScoStateChanged(), чтобы прослушивать изменения состояния SCO-канала.
const BluetoothRemoteDevice &device; int state; void OnScoStateChanged(const BluetoothRemoteDevice &device, int state);
Следующий список содержит типы устройств, поддерживаемых аудиофреймворком.
USB Type-C Наушники
Цифровые наушники, содержащие собственный цифро-аналоговый конвертер (ЦАП) и усилитель, который работает как часть наушников.
Кабельные наушники
Аналоговые наушники, не содержащие ЦАП. Они могут иметь 3,5 мм разъем или USB-C разъем без ЦАП.
Bluetooth Наушники
Bluetooth Аудио Распределение режим (A2DP) наушники для беспроводной передачи звука.
Внутренний динамик и микрофон
Устройство с встроенным динамиком и микрофоном, используемым соответственно как основные устройства для воспроизведения и записи.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )