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
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. Подготовка проекта
В файл ./local.properties добавляем путь к NDK:
sdk.dir=/.../sdk
ndk.dir=/.../ndk/android-ndk-r11c
18. Сборка нативных исходников
В папке jni создаем файл Application.mk и указываем
платформы, под которые нужна сборка:
APP_ABI := armeabiv7a x86
(Либо all)
19. Сборка нативных исходников
В папке jni создаем файл Android.mk и описываем
процесс сборки:
#указываем корневую директорию
LOCAL_PATH := $(call my-dir)
#очищаем внутренние переменные
include $(CLEAR_VARS)
#имя модуля
LOCAL_MODULE := opusfile
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
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. Сборка нативных исходников
Вызываем в папке jni команду
.../android-ndk-r11с/ndk-build
и если все пройдет без ошибок, то в папке main появятся библиотеки
26. Как работать с JNI
1) Java интерфейс
с методами, отмеченными словом native
с подгрузкой нативной .SO библиотеки
2) Реализация методов в .С файле
с зависимостью <jni.h>
с хитрым именованием методов
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. Настройка 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. Настройка 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. Финальная сборка
Осталось добавить файл audio.c в сборочный конфиг Android.mk
LOCAL_SRC_FILES += ./audio.c
И повторно вызвать ndk-build
Теперь, вызывая методы класса OpusHelper, мы будем работать с
нативным кодом!
Кратко. 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