Successfully reported this slideshow.
Your SlideShare is downloading. ×

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

Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Upcoming SlideShare
Python + Raspberry Pi GPIO
Python + Raspberry Pi GPIO
Loading in …3
×

Check these out next

1 of 34 Ad

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

Download to read offline

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

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

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

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

Advertisement
Advertisement

More Related Content

Slideshows for you (19)

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

Advertisement

More from Ontico (20)

Recently uploaded (20)

Advertisement

Обработка голоса кодеком на Си под Андроид. Сделано / Константин Цховребов (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

Editor's Notes

  • Титульник. Название доклада. ФИО. Компания
  • Кратко. NDK — что это?
    В основном используется SDK, который позволяет писать код на Java, но бывают ситуации когда необходимо выполнить что-то написанное на Си или Си++. Для этих целей Google представила NDK, решающий эту задачу.
  • Зачем?
    -увеличение производительности
    -низкий уровень работы с устройством
    -сторонние библиотеки (кодеки, sqlite, шифрование и тд)
    -общее ядро для разных платформ
  • Когда не нужно:
    -NDK не магия. Производительность не вырастет, если кривая архитектура.
    -Многие вещи уже реализованы нативно (рисование на канвасе, некоторые структуры данных, cursor и другие) и свои нативные решения скорее всего не помогут
  • Нельзя просто так взять и …
    Кокретная задача... почему она может возникнуть (запись голоса в хорошем качестве с минимальными задержками)…
    Нужно записать голос и, сжав его OPUS, упаковать в OGG и сохранить в файл.
  • MPEG-1 Layer III (MP3) — проприетарный кодек аудиозаписей (музыка, аудиокниги и т. п.) для компьютерной техники и цифровых проигрывателей
    Advanced Audio Codec (AAC) — второй по распространенности проприетарный кодек, позиционируется как альтернатива MP3. Наибольшее распространение в связке с видеокодеком H.264 (AVC) получил в онлайн-видео (напр., флэш-видео на YouTube)
    Ogg Vorbis (OGG) — свободный кодек, широко используется в компьютерных играх и в файлообменных сетях для передачи музыки
    Free Lossless Audio Codec (FLAC) — свободный кодек, использующий сжатие без потерь. Альтернативные, менее распространённые lossless-кодеки: WavPack (WV), Monkey’s Audio (APE) и др.
    GSM-FR — первый цифровой стандарт кодирования речи, использованный в телефонах GSM
    Adaptive multi rate (AMR) — запись человеческого голоса в мобильных телефонах и других мобильных устройствах
    G.723.1 — один из базовых кодеков для приложений IP-телефонии
    G.729 — патентованный узкополосный кодек, который применяется для цифрового представления речи
    Internet Low Bitrate Codec (iLBC) — популярный свободный кодек для IP-телефонии (в частности, для Skype и Google Talk)
  • Популярные кодеки и области применения. Вики
    Немного о xiph.org
    Что за OPUS? Пара слайдов с общей информацией
    Преимущества перед Vorbis, iLBC и остальными
    Пара слайдов с http://opus-codec.org/comparison/
  • Ogg — что это?
    Данные с вики
  • Ogg — что это?
    Данные с вики
  • Ogg — что это?
    Данные с вики
  • К делу!
    Сборка исходных кодов в .so под разные архитектуры
    Слайдов пять с описанием процесса.
  • Теперь надо связать java код с нативным.
    Пара слов про JNI
  • Теперь надо связать java код с нативным.
    Пара слов про JNI
  • Теперь надо связать java код с нативным.
    Пара слов про JNI
  • Теперь надо связать java код с нативным.
    Пара слов про JNI
  • Теперь надо связать java код с нативным.
    Пара слов про JNI
  • Теперь надо связать java код с нативным.
    Пара слов про JNI
  • Теперь надо связать java код с нативным.
    Пара слов про JNI
  • Теперь надо связать java код с нативным.
    Пара слов про JNI
  • Теперь надо связать java код с нативным.
    Пара слов про JNI
  • Теперь надо связать java код с нативным.
    Пара слов про JNI
  • Теперь надо связать java код с нативным.
    Пара слов про JNI
  • Теперь надо связать java код с нативным.
    Пара слов про JNI
  • Теперь надо связать java код с нативным.
    Пара слов про JNI
  • Теперь надо связать java код с нативным.
    Пара слов про JNI
  • Теперь надо связать java код с нативным.
    Пара слов про JNI
  • Теперь надо связать java код с нативным.
    Пара слов про JNI

×