1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/openharmony-multimedia_audio_framework

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
README_zh.md 29 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
Отправлено 04.03.2025 06:23 ffff53a

Аудио компонент

Обзор

Компонент аудио используется для реализации функций, связанных с аудио, включая проигрывание, запись, управление громкостью и управление устройствами.

Рисунок 1 Структура компонента аудио

Основные понятия

  • Оцифровка

Оцифровка — это процесс преобразования непрерывного аналогового сигнала во времени в дискретный цифровой сигнал путём выборки значений сигнала в определённые моменты времени.

  • Частота дискретизацииЧастота дискретизации — количество выборок, сделанных за секунду из непрерывного сигнала, чтобы получить дискретный сигнал. Единица измерения — герцы (Hz). Обычно человек может слышать звуки частотой от примерно 20 Гц до 20 кГц. Частоты дискретизации, используемые для аудио, обычно включают 8 кГц, 11,025 кГц, 22,05 кГц, 16 кГц, 37,8 кГц, 44,1 кГц, 48 кГц, 96 кГц и 192 кГц.- Каналы

Количество каналов указывает на количество независимых аудиосигналов, собираемых или воспроизводимых в различных местах пространства при записи или воспроизведении звука соответственно.

  • Аудиофрейм

Аудио данные являются потоковыми, поэтому они не имеют явной структуры "фрейма". В реальных приложениях для удобства обработки алгоритмами или передачи данных обычно соглашаются брать объем данных от 2,5 миллисекунды до 60 миллисекунд как один аудиофрейм. Этот временной промежуток называется "время выборки", его продолжительность не имеет строгих стандартов и зависит от кодека и конкретного применения.

  • PCM

PCM (Pulse Code Modulation) — метод оцифровки аналоговых сигналов, который конвертирует непрерывный аналоговый сигнал во времени в дискретный цифровой сигнал.

Оглавление

Структура каталога основана на следующей схеме:``` /foundation/multimedia/audio_standard # Аудио компонент бизнес-логики ├── frameworks # Фреймворк код │ ├── native # Внутренние интерфейсы реализации │ └── js # Внешние интерфейсы реализации │ └── napi # Реализация внешних интерфейсов NAPI ├── interfaces # Интерфейс код │ ├── inner_api # Внутренние интерфейсы │ └── kits # Внешние интерфейсы ├── sa_profile # Конфигурационные файлы сервиса ├── services # Сервис код ├── LICENSE # Лицензионный файл └── bundle.json # Компиляционный файл


### Проигрывание аудио <a name="section1147510562812"></a>

Вы можете использовать предоставленные в этом репозитории интерфейсы для преобразования данных аудио в аналоговый сигнал аудио, проигрывания аудио сигнала через выходное устройство и управления задачами воспроизведения аудио. Ниже приведены шаги по использованию **AudioRenderer** для создания функциональности воспроизведения аудио:

1. Используйте интерфейс **Create** и необходимый тип потока для получения экземпляра **AudioRenderer**.

    ```
    AudioStreamType streamType = STREAM_MUSIC; // Пример типа потока
    std::unique_ptr<AudioRenderer> audioRenderer = AudioRenderer::Create(streamType);
    ```

2. (Необязательно) статический интерфейс **GetSupportedFormats**(), **GetSupportedChannels**(), **GetSupportedEncodingTypes**(), **GetSupportedSamplingRates**() могут быть использованы для получения поддерживаемых параметров.
3. Подготовьте устройство, вызвав метод **SetParams** экземпляра.

    ```
    AudioRendererParams rendererParams;
    rendererParams.sampleFormat = SAMPLE_S16LE;
    rendererParams.sampleRate = SAMPLE_RATE_44100;
    rendererParams.channelCount = STEREO;
    rendererParams.encodingType = ENCODING_PCM;
    ```    audioRenderer->SetParams(rendererParams);
    ```4. (Необязательно) Используйте `audioRenderer->GetParams(rendererParams)` для проверки `SetParams`.
5. (Необязательно) Используйте интерфейсы `SetAudioEffectMode` и `GetAudioEffectMode` для установки и получения текущего режима аудиоэффекта.

AudioEffectMode effectMode = EFFECT_DEFAULT;
int32_t result = audioRenderer->SetAudioEffectMode(effectMode);
AudioEffectMode mode = audioRenderer->GetAudioEffectMode();

6. Вызовите функцию `audioRenderer->Start()` для запуска задачи воспроизведения.
7. Используйте интерфейс `GetBufferSize`, чтобы получить размер буфера для записи.```markdown
8. Чтение аудио данных для воспроизведения из источника (например, аудиофайла) и передача их в байтовый поток. Повторное вызов функции Write для записи данных в поток.```c++
bytesToWrite = fread(buffer, 1, bufferLen, wavFile);
while ((bytesWritten < bytesToWrite) && ((bytesToWrite - bytesWritten) > minBytes)) {
 bytesWritten += audioRenderer->Write(buffer + bytesWritten, bytesToWrite - bytesWritten);
 if (bytesWritten < 0)
     break;
}
  1. Вызов метода audioRenderer->Drain() для очистки выходного потока.
  2. Вызов метода audioRenderer->Stop() для завершения воспроизведения.
  3. После завершения задачи воспроизведения вызвать метод audioRenderer->Release() для освобождения ресурсов.

Выше приведены примеры базового использования аудиоплеера.

  1. Используйте методы audioRenderer->SetVolume(float) и audioRenderer->GetVolume() для установки и получения текущего уровня громкости аудиопотока, диапазон значений от gst.VolumeRangeStart до gst.VolumeRangeEnd.

Примеры базового использования аудиоплеера выше. Дополнительные сведения см. в документах audio_renderer.h и audio_info.h.

Аудиозапись

Используйте предоставленные здесь интерфейсы для создания приложений, которые могут выполнять запись звука с помощью входных устройств, преобразование голоса в аудио данные и управление процессами записи. Ниже приведены шаги для реализации функциональности записи аудио с использованием AudioCapturer:

  1. Получите экземпляр AudioCapturer, используя Create интерфейс и требуемый тип потока.```c++ AudioStreamType streamType = STREAM_MUSIC; std::unique_ptr audioCapturer = AudioCapturer::Create(streamType);

2. (Необязательно) Используйте статический интерфейс `GetSupportedFormats()`, `GetSupportedChannels()`, `GetSupportedEncodingTypes()`, `GetSupportedSamplingRates()` для получения списка поддерживаемых параметров.
3. Подготовьте устройство, вызывая метод `SetParams` экземпляра.

```c++
AudioCapturerParams capturerParams;
capturerParams.sampleFormat = SAMPLE_S16LE;
capturerParams.sampleRate = SAMPLE_RATE_44100;
capturerParams.channelCount = STEREO;
capturerParams.encodingType = ENCODING_PCM;
  1. (Необязательно) Используйте audioCapturer->GetParams(capturerParams) для проверки SetParams().

  2. Вызовите функцию AudioCapturer->Start() у экземпляра AudioCapturer для запуска записи аудио.

  3. Используйте интерфейс GetBufferSize для получения размера буфера, который будет записываться.

    audioCapturer->GetBufferSize(&bufferLen);
  4. Читайте записанное аудио и преобразуйте его в поток байтов. Повторно вызывайте функцию чтения до тех пор, пока не будет активно прекращено.

    // установите isBlocking как true/false для блокирующего/неблокирующего чтения
    int bytesRead = audioCapturer->Read(buffer, bufferLen, isBlocking);
    while (numBuffersToCapture) {
        bytesRead = audioCapturer->Read(buffer, bufferLen, isBlocking);
        if (bytesRead <= 0) {
            break;
        } else if (bytesRead > 0) {
            fwrite(buffer, sizeof(char), bytesRead, recFile); // пример показывает запись зафиксированного аудио в файл
            numBuffersToCapture--;
        }
    }
  5. (Необязательно) Вызовите audioCapturer->Flush() для очистки буферов записи аудио.9. Вызовите функцию audioCapturer->Stop() у экземпляра AudioCapturer для завершения записи аудио.

  6. После завершения задачи записи аудио вызовите функцию audioCapturer->Release() для освобождения ресурсов.

Представлен базовый пример использования аудиозаписи. Дополнительные API можно найти в audio_capturer.h и audio_info.h.

Управление аудио

Используйте интерфейсы, содержащиеся в файле audio_system_manager.h, чтобы контролировать громкость и устройства.

  1. Используйте интерфейс GetInstance для получения экземпляра AudioSystemManager.
    AudioSystemManager* audioSystemMgr = AudioSystemManager::GetInstance();

Контроль громкости

  1. Используйте интерфейсы GetMaxVolume и GetMinVolume для запроса максимальной и минимальной громкости, поддерживаемых аудиопотоками, и установки громкости в этом диапазоне.

    AudioVolumeType streamType = AudioVolumeType::STREAM_MUSIC;
    int32_t maxVol = audioSystemMgr->GetMaxVolume(streamType);
    int32_t minVol = audioSystemMgr->GetMinVolume(streamType);
  2. Используйте интерфейсы SetVolume и GetVolume для установки и получения текущего уровня громкости для конкретного аудиопотока.

    int32_t result = audioSystemMgr->SetVolume(streamType, 10);
    int32_t vol = audioSystemMgr->GetVolume(streamType);
    ```4. Используйте интерфейсы **SetMute** и **IsStreamMute** для установки и получения состояния глухого режима для конкретного аудиопотока.

    int32_t result = audioSystemMgr->SetMute(streamType, true); bool isMute = audioSystemMgr->IsStreamMute(streamType);

  3. Используйте интерфейсы SetRingerMode и GetRingerMode для установки и получения режима звонка. Для получения поддерживаемых режимов звонка используйте перечисление AudioRingerMode, определённое в файле audio_info.h.

    int32_t result = audioSystemMgr->SetRingerMode(RINGER_MODE_SILENT);
    AudioRingerMode ringMode = audioSystemMgr->GetRingerMode();
  4. Используйте интерфейсы SetMicrophoneMute и IsMicrophoneMute для установки и получения состояния глухого режима микрофона.

    int32_t result = audioSystemMgr->SetMicrophoneMute(true);
    bool isMicMute = audioSystemMgr->IsMicrophoneMute();

Управление устройствами 7. Используйте интерфейсы GetDevices, deviceType_ и deviceRole_ для получения информации об устройствах входа и выхода аудио. Для получения значений используйте перечисления DeviceFlag, DeviceType и DeviceRole, определённые в файле audio_info.h.

8. Используйте интерфейсы **SetDeviceActive** и **IsDeviceActive** для активации/деактивации аудиоустройств и получения состояния активности устройства.
   ```cpp
   DeviceType deviceType = DeviceType::DEVICE_TYPE_SPEAKER;
   int32_t result = audioSystemMgr->SetDeviceActive(deviceType, true);
   bool isDevActive = audioSystemMgr->IsDeviceActive(deviceType);
   ```9. Предоставлены дополнительные интерфейсы, такие как **IsStreamActive**, **SetAudioParameter** и **GetAudioParameter**, подробнее см. в [**audio_system_manager.h**](https://gitee.com/openharmony/multimedia_audio_framework/blob/master/interfaces/inner_api/native/audiomanager/include/audio_system_manager.h).

10. Приложение может использовать метод **AudioManagerNapi::On** для регистрации изменения системного уровня громкости. В этом случае, если приложение слушает события изменения уровня громкости системы, то оно будет уведомлено следующими параметрами:
    - `volumeType`: тип измененного уровня громкости системы
    - `volume`: текущий уровень громкости
    - `updateUi`: требуется ли отображение деталей изменения (если уровень громкости увеличен/уменьшен, установите флаг `updateUi` в значение `true`, в противном случае установите его в значение `false`)
    ```javascript
    const audioManager = audio.getAudioManager();
    ```
    ````
    export default {
      onCreate() {
        audioManager.on('volumeChange', (volumeChange) => {
          console.info('volumeType = ' + volumeChange.volumeType);
          console.info('volume = ' + volumeChange.volume);
          console.info('updateUi = ' + volumeChange.updateUi);
        });
      }
    };
    ```

### Управление аудио сценами <a name="section645572311287_003"></a>
11. Используйте методы **SetAudioScene** и **getAudioScene**, чтобы изменять и проверять аудиополитики.
    ```    
    int32_t result = audioSystemMgr->SetAudioScene(AUDIO_SCENE_PHONE_CALL);
    AudioScene audioScene = audioSystemMgr->GetAudioScene();
    ```
Для получения информации о поддерживаемых аудиосценах обратитесь к разделу [**AudioScene**](https://gitee.com/openharmony/multimedia_audio_framework/blob/master/interfaces/inner_api/native/audiocommon/include/audio_info.h).### Управление аудиофрагментами <a name="section645572311287_004"></a>
Используйте интерфейсы, предоставляемые в файле [**audio_stream_manager.h**](https://gitee.com/openharmony/multimedia_audio_framework/blob/master/interfaces/inner_api/native/audiomanager/include/audio_stream_manager.h), для управления потоками.

1. Получите экземпляр **AudioStreamManager** с помощью метода **GetInstance**.
    ```
    AudioStreamManager *audioStreamMgr = AudioStreamManager::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 {
            cout << "OnRendererStateChange entered" << endl;
        }
    };

    std::shared_ptr<AudioRendererStateChangeCallback> callback = std::make_shared<RendererStateChangeCallback>();
    int32_t state = audioStreamMgr->RegisterAudioRendererEventListener(clientPid, callback);
    int32_t result = audioStreamMgr->UnregisterAudioRendererEventListener(clientPid);
    ```

3. Используйте **RegisterAudioCapturerEventListener** для регистрации слушателя событий изменения состояния захватчика. Обратный вызов изменения состояния захватчика будет вызван при изменении состояния потока захвата. Этот обратный вызов можно реализовать путём переопределения метода **OnCapturerStateChange** в классе **AudioCapturerStateChangeCallback**.
    ```cpp
    const int32_t clientPid;```markdown
## Класс `CapturerStateChangeCallback`

```cpp
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;
    }
};
```

```cpp
std::shared_ptr<AudioCapturerStateChangeCallback> callback = std::make_shared<CapturerStateChangeCallback>();
int32_t state = audioStreamMgr->RegisterAudioCapturerEventListener(clientPid, callback);
int32_t result = audioStreamMgr->UnregisterAudioCapturerEventListener(clientPid);
```

### Получение информации о текущих потоках рендеринга

Используйте метод **`GetCurrentRendererChangeInfos`** для получения информации обо всех текущих активных потоках рендеринга, включая `clientuid`, `sessionid`, `renderinfo`, `renderstate` и детали устройства вывода.

```cpp
std::vector<std::shared_ptr<AudioRendererChangeInfo>> audioRendererChangeInfos;
int32_t currentRendererChangeInfo = audioStreamMgr->GetCurrentRendererChangeInfos(audioRendererChangeInfos);
```

### Получение информации о текущих потоках захвата

Используйте метод **`GetCurrentCapturerChangeInfos`** для получения информации обо всех текущих активных потоках захвата, включая `clientuid`, `sessionid`, `capturerInfo`, `capturerState` и детали устройства входа.

```cpp
std::vector<std::shared_ptr<AudioCapturerChangeInfo>> audioCapturerChangeInfos;
int32_t currentCapturerChangeInfo = audioStreamMgr->GetCurrentCapturerChangeInfos(audioCapturerChangeInfos);
```

Для более подробной информации о структуре данных смотрите файл [**`audio_info.h`**](https://gitee.com/openharmony/multimedia_audio_framework/blob/master/interfaces/inner_api/native/audiocommon/include/audio_info.h).

### Проверка поддержки низкого запаздывания

Проверьте поддержку низкого запаздывания с помощью метода **`IsAudioRendererLowLatencySupported`**.

```cpp
const AudioStreamInfo &audioStreamInfo;
bool isLatencySupport = audioStreamMgr->IsAudioRendererLowLatencySupported(audioStreamInfo);
```
```7. Используйте интерфейс **GetEffectInfoArray**, чтобы получить информацию о поддерживаемых эффектах звука для указанного [**StreamUsage**](https://gitee.com/openharmony/multimedia_audio_framework/blob/master/interfaces/inner_api/native/audiocommon/include/audio_info.h).
    ``` 
    AudioSceneEffectInfo audioSceneEffectInfo;
    int32_t status = audioStreamMgr->GetEffectInfoArray(audioSceneEffectInfo, streamUsage);
    ```
Дополнительную информацию о поддерживаемых режимах эффектов звука можно найти в разделе **AudioEffectMode** файла [**audio_effect.h**](https://gitee.com/openharmony/multimedia_audio_framework/blob/master/interfaces/inner_api/native/audiocommon/include/audio_effect.h).

#### Использование JavaScript: <a name="section645572311287_005"></a>
JavaScript-приложения могут использовать системные аудиоинтерфейсы управления для регулировки громкости и работы с устройствами. \
Для получения информации о JavaScript-интерфейсах управления громкостью и устройствами обратитесь к [**js-apis-audio.md**](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/apis-audio-kit/js-apis-audio.md#audiomanager).

### Блютуз SCO-соединение <a name="section645572311287_007"></a>
Используйте предоставленные интерфейсы [**audio_bluetooth_manager.h**](https://gitee.com/openharmony/multimedia_audio_framework/blob/master/frameworks/native/bluetoothclient/audio_bluetooth_manager.h) для реализации соединения SCO (Synchronous Connection-Oriented Link) через Bluetooth.

1. Для отслеживания изменений состояния SCO используйте метод **OnScoStateChanged**.
```  
const BluetoothRemoteDevice &device;  
int state;  
void OnScoStateChanged(const BluetoothRemoteDevice &device, int state);  
```

2. (необязательно) Статический метод **RegisterBluetoothScoAgListener**() и **UnregisterBluetoothScoAgListener**() используются для регистрации прослушивателя Bluetooth SCO.## Поддерживаемые устройства <a name="section645572311287_008"></a>
Следующий список содержит типы устройств, поддерживаемых подсистемой аудио.

1. **USB Type-C наушники**  
   Цифровые наушники, включающие DAC (цифро-аналоговый преобразователь) и усилители как часть наушников.
   
2. **Проводные наушники**  
   Аналоговые наушники, внутри которых нет DAC. Они могут иметь  Yöstem 3,5 мм разъем или USB Type-C разъем без DAC.
   
3. **Наушники Bluetooth**  
   Наушники Bluetooth A2DP (Advanced Audio Distribution Profile) для беспроводной передачи звука.
   
4. **Внутренний динамик и микрофон**  
   Поддерживаются внутренние динамик и микрофон, которые будут использоваться соответственно как основные устройства воспроизведения и записи.

## Связанные репозитории <a name="section340mcpsimp"></a>

[multimedia\_audio\_framework](https://gitee.com/openharmony/multimedia_audio_framework)

---

Исправлено:

- Удалены лишние пробелы после некоторых слов.
- Корректно оформлены списки и пункты.
- Исправлены ошибки в орфографии и пунктуации.

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/openharmony-multimedia_audio_framework.git
git@api.gitlife.ru:oschina-mirror/openharmony-multimedia_audio_framework.git
oschina-mirror
openharmony-multimedia_audio_framework
openharmony-multimedia_audio_framework
master