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 (F...
Почему 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 size...
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
Email: terrakok@mobileup.ru
Upcoming SlideShare
Loading in …5
×

of

Обработка голоса кодеком Си под Андройд? Сделано! Slide 1 Обработка голоса кодеком Си под Андройд? Сделано! Slide 2 Обработка голоса кодеком Си под Андройд? Сделано! Slide 3 Обработка голоса кодеком Си под Андройд? Сделано! Slide 4 Обработка голоса кодеком Си под Андройд? Сделано! Slide 5 Обработка голоса кодеком Си под Андройд? Сделано! Slide 6 Обработка голоса кодеком Си под Андройд? Сделано! Slide 7 Обработка голоса кодеком Си под Андройд? Сделано! Slide 8 Обработка голоса кодеком Си под Андройд? Сделано! Slide 9 Обработка голоса кодеком Си под Андройд? Сделано! Slide 10 Обработка голоса кодеком Си под Андройд? Сделано! Slide 11 Обработка голоса кодеком Си под Андройд? Сделано! Slide 12 Обработка голоса кодеком Си под Андройд? Сделано! Slide 13 Обработка голоса кодеком Си под Андройд? Сделано! Slide 14 Обработка голоса кодеком Си под Андройд? Сделано! Slide 15 Обработка голоса кодеком Си под Андройд? Сделано! Slide 16 Обработка голоса кодеком Си под Андройд? Сделано! Slide 17 Обработка голоса кодеком Си под Андройд? Сделано! Slide 18 Обработка голоса кодеком Си под Андройд? Сделано! Slide 19 Обработка голоса кодеком Си под Андройд? Сделано! Slide 20 Обработка голоса кодеком Си под Андройд? Сделано! Slide 21 Обработка голоса кодеком Си под Андройд? Сделано! Slide 22 Обработка голоса кодеком Си под Андройд? Сделано! Slide 23 Обработка голоса кодеком Си под Андройд? Сделано! Slide 24 Обработка голоса кодеком Си под Андройд? Сделано! Slide 25 Обработка голоса кодеком Си под Андройд? Сделано! Slide 26 Обработка голоса кодеком Си под Андройд? Сделано! Slide 27 Обработка голоса кодеком Си под Андройд? Сделано! Slide 28 Обработка голоса кодеком Си под Андройд? Сделано! Slide 29 Обработка голоса кодеком Си под Андройд? Сделано! Slide 30 Обработка голоса кодеком Си под Андройд? Сделано! Slide 31 Обработка голоса кодеком Си под Андройд? Сделано! Slide 32 Обработка голоса кодеком Си под Андройд? Сделано! Slide 33 Обработка голоса кодеком Си под Андройд? Сделано! Slide 34
Upcoming SlideShare
Навигация в Android без боли и слез
Next
Download to read offline and view in fullscreen.

0 Likes

Share

Download to read offline

Обработка голоса кодеком Си под Андройд? Сделано!

Download to read offline

Доклад Константина Цховребова, ведущего Android-разработчика MobileUp, на AppsConf 2016.

Related Books

Free with a 30 day trial from Scribd

See all

Related Audiobooks

Free with a 30 day trial from Scribd

See all
  • Be the first to like this

Обработка голоса кодеком Си под Андройд? Сделано!

  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 Email: terrakok@mobileup.ru

Доклад Константина Цховребова, ведущего Android-разработчика MobileUp, на AppsConf 2016.

Views

Total views

140

On Slideshare

0

From embeds

0

Number of embeds

3

Actions

Downloads

1

Shares

0

Comments

0

Likes

0

×