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

OSCHINA-MIRROR/openharmony-multimedia_audio_framework

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

Аудио

Введение

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

Рисунок 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);
```
  1. (Необязательно) Вызовите статические методы GetSupportedFormats(), GetSupportedChannels(), GetSupportedEncodingTypes() и GetSupportedSamplingRates() для получения поддерживаемых значений параметров.

  2. Подготовьте устройство и вызовите метод SetParams() для установки параметров.

    AudioRendererParams rendererParams;
    rendererParams.sampleFormat = SAMPLE_S16LE;
    rendererParams.sampleRate = SAMPLE_RATE_44100;
    rendererParams.channelCount = STEREO;
    rendererParams.encodingType = ENCODING_PCM;
    
    audioRenderer->SetParams(rendererParams);
  3. (Необязательно) Вызовите метод GetParams(rendererParams) для получения установленных параметров.

  4. Вызовите метод Start() для запуска задачи воспроизведения аудио.

  5. Вызовите метод GetBufferSize() для получения размера буфера для записи.

    audioRenderer->GetBufferSize(&bufferLen);
  6. Вызовите метод Write() для чтения данных аудио из источника (например, файла аудио) и передачи его в поток байтов. Вы можете повторно вызывать этот метод для записи данных рендера.

    bytesToWrite = fread(buffer, 1, bufferLen, wavFile);
    while ((bytesWritten < bytesToWrite) && ((bytesToWrite - bytesWritten) > minBytes)) {
        bytesWritten += audioRenderer->Write(buffer + bytesWritten, bytesToWrite - bytesWritten);
        if (bytesWritten < 0)
            break;
    }
  7. Вызовите метод Drain() для очистки потоков для воспроизведения.9. Вызовите метод Stop() для прекращения воспроизведения.

  8. После завершения задачи воспроизведения вызовите метод Release() для освобождения ресурсов.

Приведённые выше шаги описывают базовый сценарий разработки для воспроизведения аудио.

  1. Вызовите методы SetVolume(float) и GetVolume() для установки и получения уровня громкости аудиопотока, который может принимать значения от 0.0 до 1.0. Для получения подробной информации см. audio_renderer.h и audio_info.h.

Аудиозапись

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

  1. Вызовите Create() с требуемым типом потока для создания экземпляра класса AudioCapturer.

    AudioStreamType streamType = STREAM_MUSIC; 
    std::unique_ptr<AudioCapturer> audioCapturer = AudioCapturer::Create(streamType); 
  2. (Необязательно) Вызовите статические методы GetSupportedFormats(), GetSupportedChannels(), GetSupportedEncodingTypes() и GetSupportedSamplingRates() для получения поддерживаемых значений параметров.

  3. Подготовьте устройство и вызовите SetParams() для установки параметров. ``` AudioCapturerParams capturerParams; capturerParams.sampleFormat = SAMPLE_S16LE; capturerParams.sampleRate = SAMPLE_RATE_44100; capturerParams.channelCount = STEREO; capturerParams.encodingType = ENCODING_PCM;

    audioCapturer->SetParams(capturerParams);

  4. (Необязательно) Вызовите GetParams(capturerParams) для получения установленных параметров.

  5. Вызовите Start() для запуска задачи записи аудио.

  6. Вызовите GetBufferSize() для получения размера буфера для записи.

    audioCapturer->GetBufferSize(bufferLen);
  7. Вызовите 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--;
        }
    }
  8. (Необязательно) Вызовите Flush() для очистки буфера потока записи.

  9. Вызовите Stop() для прекращения записи.

  10. После завершения задачи записи вызовите Release() для освобождения ресурсов.Для подробностей см. audio_capturer.h и audio_info.h.

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

Вы можете использовать API, предоставляемые в 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);
  3. Вызовите SetMute() и IsStreamMute(), чтобы установить и получить состояние глушения аудиопотока соответственно.

    int32_t result = audioSystemMgr->SetMute(streamType, true);
    bool isMute = audioSystemMgr->IsStreamMute(streamType);
  4. Вызовите SetRingerMode() и GetRingerMode(), чтобы установить и получить режим звонка соответственно. Поддерживаемые режимы звонка являются перечисленными значениями AudioRingerMode, определёнными в audio_info.h.

    int32_t result = audioSystemMgr->SetRingerMode(RINGER_MODE_SILENT);
    AudioRingerMode ringMode = audioSystemMgr->GetRingerMode();
  5. Вызовите SetMicrophoneMute() и IsMicrophoneMute(), чтобы установить и получить состояние глушения микрофона соответственно.

    int32_t result = audioSystemMgr->SetMicrophoneMute(true);
    bool isMicMute = audioSystemMgr->IsMicrophoneMute();
    ```#### Контроль устройств
  6. Вызовите 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_;
  1. Вызовите SetDeviceActive() и IsDeviceActive() для активации или деактивации аудиоустройства и получения статуса активности устройства соответственно.
AudioDeviceType deviceType = AudioDeviceType::SPEAKER;
int32_t result = audioSystemMgr->SetDeviceActive(deviceType, true);
bool isActive = audioSystemMgr->IsDeviceActive(deviceType);
  1. (Необязательно) Вызов других API, таких как IsStreamActive(), SetAudioParameter() и GetAudioParameter(), предоставленных в audio_system_manager.h, если это требуется. 10. Вызовите AudioManagerNapi::SubscribeTo для подписки на изменения системы громкости. Если произошло изменение системы громкости, используются следующие параметры для уведомления приложения: typeVolume: тип измененной системы громкости. volume: текущий уровень громкости. updateUI: показывать ли изменение на UI. (Установите updateUI на true для события увеличения или уменьшения громкости, и установите его на false для других изменений.)
    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);
  1. Вызовите GetCurrentCapturerChangeInfos(), чтобы получить информацию обо всех запущенных захватчиках, включая UID клиента, идентификатор сессии, информацию о захватчике, состояние захватчика и детали входного устройства.
std::vector<std::shared_ptr<AudioCapturerChangeInfo>> audioCapturerChangeInfos;
int32_t currentCapturerChangeInfo = audioStreamMgr->GetCurrentCapturerChangeInfos(audioCapturerChangeInfos);

Дополнительные сведения см. в разделах audioRendererChangeInfos и audioCapturerChangeInfos в audio_info.h.

  1. Вызовите IsAudioRendererLowLatencySupported(), чтобы проверить, поддерживается ли низкая задержка.

    const AudioStreamInfo &audioStreamInfo;
    bool isLatencySupport = audioStreamMgr->IsAudioRendererLowLatencySupported(audioStreamInfo);
    ```#### Использование API JavaScript

Приложения на JavaScript могут вызывать аудиоуправляемые API для управления громкостью и устройствами. Для подробностей см. js-apis-audio.md.

Bluetooth SCO Вызов

Вы можете использовать API, предоставляемые в audio_bluetooth_manager.h, чтобы реализовать вызовы через синхронные соединения с ориентацией на канал (SCO).1. Вызовите OnScoStateChanged(), чтобы прослушивать изменения состояния SCO-канала. const BluetoothRemoteDevice &device; int state; void OnScoStateChanged(const BluetoothRemoteDevice &device, int state);

  1. (Необязательно) Вызовите статический метод RegisterBluetoothScoAgListener(), чтобы зарегистрировать слушатель Bluetooth SCO, а также вызовите UnregisterBluetoothScoAgListener(), чтобы отключить слушатель при его ненужности.

Поддерживаемые устройства

Следующий список содержит типы устройств, поддерживаемых аудиофреймворком.

  1. USB Type-C Наушники

    Цифровые наушники, содержащие собственный цифро-аналоговый конвертер (ЦАП) и усилитель, который работает как часть наушников.

  2. Кабельные наушники

    Аналоговые наушники, не содержащие ЦАП. Они могут иметь 3,5 мм разъем или USB-C разъем без ЦАП.

  3. Bluetooth Наушники

    Bluetooth Аудио Распределение режим (A2DP) наушники для беспроводной передачи звука.

  4. Внутренний динамик и микрофон

    Устройство с встроенным динамиком и микрофоном, используемым соответственно как основные устройства для воспроизведения и записи.

Вовлечённые репозитории

multimedia_audio_framework

Комментарии ( 0 )

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

Введение

Описание недоступно Развернуть Свернуть
Apache-2.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