Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Обработка голоса кодеком на
Си под Андроид? Сделано!
Константин Цховребов
Android Team Lead
NDK — что это?
NDK — зачем?
производительность
«низкий» уровень работы
сторонние библиотеки
общее ядро для разных платформ
сокрытие реали...
NDK != МАГИЯ
Если приложение написано
криво, то NDK не поможет
Многие вещи уже реализованы
нативно: cursor, canvas и другие
Реальная задача
Compress
User AudioRecord
File
Какие кодеки есть?
MPEG-1 Layer III (MP3)
Advanced Audio Codec (AAC)
Ogg Vorbis (OGG)
Free Lossless Audio Codec (FLAC)...
Почему Opus?
CELT
SILK
OPUS
Первый релиз 6 декабря 2012
Почему Opus?
Почему Opus?
Почему Opus?
Bitrates from 6 kb/s to 510 kb/s
Sampling rates from 8 kHz (narrowband) to 48 kHz (fullband)
Frame sizes f...
Ogg
Все библиотеки OpenSource, но...
Подготовка проекта
1) Скачиваем NDK
https://developer.android.com/intl/ru/ndk/downloads/index.html
2) Скачиваем кодек Opus...
Подготовка проекта
В файл ./local.properties добавляем путь к NDK:
sdk.dir=/.../sdk
ndk.dir=/.../ndk/android-ndk-r11c
Подготовка проекта
Создаем стандартную структуру модуля с
дополнительной папкой jni
Подготовка проекта
app/build.gradle
android {
...
sources {
jni {
source {
}
}
jniLibs {
source {
srcDir 'src/main/libs'
}...
Сборка нативных исходников
В папку jni складываем
загруженные проекты
Сборка нативных исходников
В папке jni создаем файл Application.mk и указываем
платформы, под которые нужна сборка:
APP_AB...
Сборка нативных исходников
В папке jni создаем файл Android.mk и описываем
процесс сборки:
#указываем корневую директорию
...
Сборка нативных исходников
#С флаги для сборки кода
LOCAL_CFLAGS := -w -std=gnu99 -DANDROID_NDK ...
#С++ флаги для сборки ...
Сборка нативных исходников
#пути ко всем заголовочным *.h файлам
LOCAL_C_INCLUDES := 
./opus/include 
./opus/silk 
./opus/...
Сборка нативных исходников
#поиск исходников по папкам
OPUS_SRC_FILES := $(wildcard $(LOCAL_PATH)/opus/*/*.c)
OPUS_SRC_FIL...
Сборка нативных исходников
Вызываем в папке jni команду
.../android-­ndk-­r11с/ndk­-build
и если все пройдет без ошибок, т...
JNI (Java Native Interface)
Преимущества JNI
Аналоги:
Netscape Java Runtime Interface
Microsoft’s Raw Native Interface and COM/Java Interface
Двоичн...
Как работать с JNI
1) Java интерфейс
с методами, отмеченными словом native
с подгрузкой нативной .SO библиотеки
2) Реали...
Как работать с JNI
com.example.Sample.java
public native int getLength(String str);
SampleNativeImpl.c
JNI_EXPORT jint Jav...
Настройка JNI
package com.terrakok.opusfile;
import java.nio.ByteBuffer;
public class OpusHelper {
public native int start...
Настройка JNI
Создаем .../app/src/main/jni/audio.c, в котором важно следующее:
#include <jni.h>
#include <ogg/ogg.h>
#incl...
Финальная сборка
Осталось добавить файл audio.c в сборочный конфиг Android.mk
LOCAL_SRC_FILES += ./audio.c
И повторно вызв...
Где посмотреть?
https://bitbucket.org/terrakok/androidopustools
Хорошие новости
Android Studio 2.2
Improved C++ Support:
edit, build, and debug
use ndk-build or Cmake
and more
Еще хорошие новости
Спасибо!
Цховребов Константин
Telegram: @terrakok
Upcoming SlideShare
Loading in …5
×

Обработка голоса кодеком на Си под Андроид. Сделано / Константин Цховребов (MobileUp)

263 views

Published on

Opus, Ogg, NDK и другие подводные камни.

1) Зачем иногда необходимо использовать нативный код в Android разработке;
2) когда не нужно этого делать;
3) что для этого необходимо настроить в проекте;
4) кодек для сжатия аудио Opus (чем хорош, кто использует);
5) контейнер Ogg (преимущества перед другими);
6) практический пример записи голоса, сжатия кодеком opus и упаковка в Ogg контейнер.

Published in: Engineering
  • Be the first to comment

  • Be the first to like this

Обработка голоса кодеком на Си под Андроид. Сделано / Константин Цховребов (MobileUp)

  1. 1. Обработка голоса кодеком на Си под Андроид? Сделано! Константин Цховребов Android Team Lead
  2. 2. NDK — что это?
  3. 3. NDK — зачем? производительность «низкий» уровень работы сторонние библиотеки общее ядро для разных платформ сокрытие реализации
  4. 4. NDK != МАГИЯ Если приложение написано криво, то NDK не поможет Многие вещи уже реализованы нативно: cursor, canvas и другие
  5. 5. Реальная задача Compress User AudioRecord File
  6. 6. Какие кодеки есть? MPEG-1 Layer III (MP3) Advanced Audio Codec (AAC) Ogg Vorbis (OGG) Free Lossless Audio Codec (FLAC) GSM-FR Adaptive multi rate (AMR) G.723.1 G.729 Internet Low Bitrate Codec (iLBC)
  7. 7. Почему Opus? CELT SILK OPUS Первый релиз 6 декабря 2012
  8. 8. Почему Opus?
  9. 9. Почему Opus?
  10. 10. Почему Opus? Bitrates from 6 kb/s to 510 kb/s Sampling rates from 8 kHz (narrowband) to 48 kHz (fullband) Frame sizes from 2.5 ms to 60 ms Support for both constant bitrate (CBR) and variable bitrate (VBR) Support for speech and music Support for mono and stereo Support for up to 255 channels (multistream frames) Dynamically adjustable bitrate, audio bandwidth, and frame size Good loss robustness and packet loss concealment (PLC) Floating point and fixed-point implementation
  11. 11. Ogg
  12. 12. Все библиотеки OpenSource, но...
  13. 13. Подготовка проекта 1) Скачиваем NDK https://developer.android.com/intl/ru/ndk/downloads/index.html 2) Скачиваем кодек Opus и доп. инструментарий OpusFile http://www.opus-codec.org/downloads/ 3) Скачиваем инструмент для упаковки в Ogg https://xiph.org/downloads/ 4) Создаем стандартную новую папку для проекта
  14. 14. Подготовка проекта В файл ./local.properties добавляем путь к NDK: sdk.dir=/.../sdk ndk.dir=/.../ndk/android-ndk-r11c
  15. 15. Подготовка проекта Создаем стандартную структуру модуля с дополнительной папкой jni
  16. 16. Подготовка проекта app/build.gradle android { ... sources { jni { source { } } jniLibs { source { srcDir 'src/main/libs' } } } ... }
  17. 17. Сборка нативных исходников В папку jni складываем загруженные проекты
  18. 18. Сборка нативных исходников В папке jni создаем файл Application.mk и указываем платформы, под которые нужна сборка: APP_ABI := armeabi­v7a x86 (Либо all)
  19. 19. Сборка нативных исходников В папке jni создаем файл Android.mk и описываем процесс сборки: #указываем корневую директорию LOCAL_PATH := $(call my-dir) #очищаем внутренние переменные include $(CLEAR_VARS) #имя модуля LOCAL_MODULE := opusfile
  20. 20. Сборка нативных исходников #С флаги для сборки кода LOCAL_CFLAGS := -w -std=gnu99 -DANDROID_NDK ... #С++ флаги для сборки кода LOCAL_CPPFLAGS := -DBSD=1 -ffast-math -O2 -funroll-loops #подключение вывода в стандартный лог андроида LOCAL_LDLIBS := -llog #разный режим сборки в зависимости от платформы ifeq ($(TARGET_ARCH_ABI),armeabi) LOCAL_ARM_MODE := thumb else LOCAL_ARM_MODE := arm endif
  21. 21. Сборка нативных исходников #пути ко всем заголовочным *.h файлам LOCAL_C_INCLUDES := ./opus/include ./opus/silk ./opus/silk/fixed ./opus/celt ./opus ./opus/src ./opusfile/src ./opusfile/include ./ogg/include
  22. 22. Сборка нативных исходников #поиск исходников по папкам OPUS_SRC_FILES := $(wildcard $(LOCAL_PATH)/opus/*/*.c) OPUS_SRC_FILES += $(wildcard $(LOCAL_PATH)/opus/celt/*/*.c) OPUS_SRC_FILES += $(wildcard $(LOCAL_PATH)/opus/silk/fixed/*.c) OPUSFILE_SRC_FILES := $(wildcard $(LOCAL_PATH)/opusfile/src/*.c) OGG_SRC_FILES := $(wildcard $(LOCAL_PATH)/ogg/src/*.c) #пути ко всем найденным *.c файлам LOCAL_SRC_FILES := $(OPUS_SRC_FILES) LOCAL_SRC_FILES += $(OPUSFILE_SRC_FILES) LOCAL_SRC_FILES += $(OGG_SRC_FILES) #сборка .so библиотеки include $(BUILD_SHARED_LIBRARY)
  23. 23. Сборка нативных исходников Вызываем в папке jni команду .../android-­ndk-­r11с/ndk­-build и если все пройдет без ошибок, то в папке main появятся библиотеки
  24. 24. JNI (Java Native Interface)
  25. 25. Преимущества JNI Аналоги: Netscape Java Runtime Interface Microsoft’s Raw Native Interface and COM/Java Interface Двоичная (бинарная) совместимость
  26. 26. Как работать с JNI 1) Java интерфейс с методами, отмеченными словом native с подгрузкой нативной .SO библиотеки 2) Реализация методов в .С файле с зависимостью <jni.h> с хитрым именованием методов
  27. 27. Как работать с JNI com.example.Sample.java public native int getLength(String str); SampleNativeImpl.c JNI_EXPORT jint Java_com_example_Sample_getLength( JNIEnv *env, jobject jobj, jstring str) {...} *env – указатель на интерфейс; jоbj – ссылка на объект, в котором описан нативный метод; str – передаваемый аргумент;
  28. 28. Настройка JNI package com.terrakok.opusfile; import java.nio.ByteBuffer; public class OpusHelper { public native int startRecord(String path); public native int writeFrame(ByteBuffer frame, int len); public native void stopRecord(); public native int openOpusFile(String path); public native int seekOpusFile(float position); public native int isOpusFile(String path); public native void closeOpusFile(); public native void readOpusFile(ByteBuffer buffer, int capacity, int[] args); public native long getTotalPcmDuration(); static { System.loadLibrary("opusfile"); } }
  29. 29. Настройка JNI Создаем .../app/src/main/jni/audio.c, в котором важно следующее: #include <jni.h> #include <ogg/ogg.h> #include <opus.h> #include <opusfile.h> JNIEXPORT int Java_com_terrakok_opusfile_OpusHelper_startRecord(JNIEnv *env, jclass class, jstring path) {...}
  30. 30. Финальная сборка Осталось добавить файл audio.c в сборочный конфиг Android.mk LOCAL_SRC_FILES += ./audio.c И повторно вызвать ndk-build Теперь, вызывая методы класса OpusHelper, мы будем работать с нативным кодом!
  31. 31. Где посмотреть? https://bitbucket.org/terrakok/androidopustools
  32. 32. Хорошие новости Android Studio 2.2 Improved C++ Support: edit, build, and debug use ndk-build or Cmake and more
  33. 33. Еще хорошие новости
  34. 34. Спасибо! Цховребов Константин Telegram: @terrakok

×