В середине этого года Google запустил долгожданныйARCore, который органично сочетает реальность и цифровые технологии, чтобы обогатить наш реальный мир. С его помощью разработчики могут быстрее и проще разрабатывать приложения дополненной реальности на платформе Android.Благодаря технологии дополненной реальности большое количество продуктов может найти новые сценарии приложений и даже открыть новую линейку продуктов.
Уже на рынке есть много продуктов на основе технологий AR, такие как приложения Ikea Ikea Place предоставляют новые онлайн-способ покупки мебели, вам нужно только поставить камеру сотовых телефонов, чтобы захотеть поставить угол мебели, затем вы Хотите выбрать на мебель, просто перетащив и вращаюсь, чтобы завершить макет, чтобы увидеть этот кусок мебели, соответствует вашему уму.
На картинке ниже представлена схема использования IKEA Place, вроде бы этот стул вполне подойдет :)
Итак, если AR будет сочетаться с другими технологиями, будут ли более интересные сценарии применения?
Аудио- и видеооблако Qiniu в реальном времени(далее именуемый Qiniu RTN) основан на широко стандартизированном стеке технологий WebRTC с полной совместимостью с платформой, поддержкой основных браузеров, таких как Chrome, Safari, Firefox и Android, iOS, Windows и т. д. Мощная сеть потоковой передачи аудио и видео в реальном времени Qiniu насчитывает более 180 центров обработки данных по всему миру с мощными функциями ускорения связи, а большое количество узлов гарантирует, что клиенты могут быть ускорены независимо от того, где они находятся в мире. Сверхнизкая задержка, составляющая в среднем 200 мс, обеспечивает наиболее фундаментальную поддержку многих клиентских сценариев со строгими требованиями к работе в реальном времени, таких как чат один на один, чаты, видеоконференции, онлайн-обучение и другие сценарии с жесткими требованиями. для интерактивности используйте Qiniu RTN.
В этой статье мы объединим официальный пример Googlehello_ar_javaИнтегрируйте технологию AR в аудио- и видеозвонки в реальном времени, которые будут применяться к новой функции «импорт внешних аудио- и видеоданных» Qiniu RTN SDK версии 1.1.0+.
Ниже приведена анимация эффекта.
Подготовка 0: интегрируйте Qiniu RTN SDK в демоверсию AR
Прежде чем мы действительно начнем программировать, нам нужно сначала создать соответствующие проекты и среды.
скачатьQiniu RTN SDKв текущий каталогQNRTC-Android
git clone git@github.com:pili-engineering/QNRTC-Android.git
Скачать Arcore в текущий каталогarcore-android-sdk
git clone git@github.com:google-ar/arcore-android-sdk.git
Скопируйте соответствующий файл Qiniu RTN SDK в проект hello_ar_java.
- положить файл
QNRTC-Android/releases/qndroid-rtc-1.2.0.jar
скопировать вarcore-android-sdk/samples/hello_ar_java/app/libs/
in (каталог libs необходимо создать самостоятельно) - Буду
QNRTC-Android/releases/
внизarmeabi、armeabi-v7a、arm64-v8a、x86
и т.д. 4 папки копируются вarcore-android-sdk/samples/hello_ar_java/app/src/main/jniLibs
В папке (каталог jniLibs нужно создать самостоятельно) - Открыть с помощью AndroidStudio
arcore-android-sdk/samples/hello_ar_java
проект, изменить несколько конфигураций- Чтобы проект ссылался на библиотеку, добавленную на двух предыдущих шагах, откройте
app/build.gradle
файл, вdependencies
Увеличиватьimplementation fileTree(include: ['*.jar'], dir: 'libs')
- Для того, чтобы вести разговор в реальном времени, вам необходимо настроить разрешения сети, открыть
AndroidManifest.xml
файл, вmanifest
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
- Чтобы проект ссылался на библиотеку, добавленную на двух предыдущих шагах, откройте
Введение в основные классы
Перед фактическим анализом кодирования и кода давайте кратко представим участие основных классов.
QNRTCManager: Базовый класс Qiniu RTN SDK, обеспечивающий возможности аудио- и видеовызовов в реальном времени с малой задержкой.
Session: Основной класс ARCore, управление состоянием системы дополненной реальности, включая сбор данных с камеры, мониторинг точечной сети, обнаружение самолетов и другие возможности.
GLSurfaceView & Renderer: класс просмотра и класс рендеринга, предоставляемые системой Android, соответственно отвечающие за отображение на экране и рендеринг.
BackgroundRenderer & ObjectRenderer & PlaneRenderer & PointCloudRenderer: Класс рендеринга, представленный в демо, отвечает за рендеринг следующих частей.
- Рендеринг фонового изображения (исходное изображение предварительного просмотра камеры)
- Рендеринг объектов и теней (модель Android и ее тень)
- Рендеринг плоскости (плоскость, обнаруженная системой дополненной реальности)
- Рендеринг облака точек (облако точек, обнаруженное системой дополненной реальности)
Подготовка 1. Создание базовой среды для аудио- и видеовызовов в реальном времени
Во-первых, вам нужно реализовать прослушиватель событий комнаты для аудио и видео в реальном времени.QNRoomEventListener
, существует множество методов, которые необходимо реализовать.Далее показаны только методы, которые необходимо использовать в этом простом примере.Полное описание интерфейса находится вздесь
public class HelloArActivity extends AppCompatActivity implements GLSurfaceView.Renderer, QNRoomEventListener {
private boolean mPublished = false; // 标识本地是否发布成功
...
@Override
public void onJoinedRoom() {
mRTCManager.publish(); // 加入房间成功后,尝试发布
}
@Override
public void onLocalPublished() {
mPublished = true; // 发布成功后,标识为 true
}
...
}
существуетonCreate
В конце метода среда аудио- и видеовызова в реальном времени инициализируется и добавляется в указанную комнату.Способ получения токена комнаты см.здесь
protected void onCreate(Bundle savedInstanceState) {
...
QNRTCSetting setting = new QNRTCSetting();
setting.setExternalVideoInputEnabled(true); // 开启外部视频导入功能
mRTCManager.setRoomEventListener(this); // 设置房间事件监听器
mRTCManager.initialize(this, setting); // 七牛 RTN SDK 初始化
mRTCManager.joinRoom(###Your Room Token###); // 通过 Room Token 加入指定房间
}
Подготовка 2. Настройка базовой среды дополненной реальности
Подготовьтесь к рисованию в дополненной реальности с помощью GLSurfaceView и Renderer
Реализовано в объявлении класса ActivityGLSurfaceView.Renderer
Интерфейс, в этой демке следующий, далее нам нужно реализовать 3 соответствующих метода, значения описаны в комментариях соответственно
public class HelloArActivity extends AppCompatActivity implements GLSurfaceView.Renderer, QNRoomEventListener {
/**
* 显示 Surface 创建完成时回调
**/
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
}
...
/**
* 显示 Surface 尺寸大小改变时回调
**/
public void onSurfaceChanged(GL10 gl, int width, int height) {
}
...
/**
* 显示 Surface 创建完成时回调
**/
public void onDrawFrame(GL10 gl) {
}
}
После реализации класса рендеринга Renderer нам нужно предоставить поверхность для отображения, чтобы Renderer мог рендерить и отображать на ней, и у GLSurfaceView есть такая возможность.
Следующий пример кода из XML-файла макета, проанализированного и удаленного Renderer GLSurfaceView
surfaceView = findViewById(R.id.surfaceview); // 从布局 xml 中解析 GLSurfaceView
...
surfaceView.setRenderer(this); // 设置 Renderer
Создать сеанс
Сеанс — это основной класс входа в систему дополненной реальности, он должен быть инициализирован и запущен перед любой операцией дополненной реальности.
protected void onResume() {
session = new Session(/* context= */ this); // AR 系统初始化
...
session.resume(); // 开始 AR 会话,尝试开启摄像头,如摄像头被占用,会抛出 CameraNotAvailableException 异常
}
Используйте OpenGL Shader для рисования улучшенной AR-графики на поверхности дисплея.
После начала сеанса дополненной реальности каждый кадр данных с камеры предоставляет следующую информацию.
- Необработанные данные предварительного просмотра камеры
- Обнаруженная плоскость массива
- Массив обнаруженных облаков точек
- событие плоского касания
мы можемonDrawFrame
В методе вышеуказанные события используются для соответствующей обработки.Например, когда встречается событие касания плоскости, модель Android помещается в соответствующее положение, а обнаруженная плоскость и облако точек отрисовываются одновременно.
// 绘制背景
private final BackgroundRenderer backgroundRenderer = new BackgroundRenderer();
// 绘制物体
private final ObjectRenderer virtualObject = new ObjectRenderer();
// 绘制物体阴影
private final ObjectRenderer virtualObjectShadow = new ObjectRenderer();
// 绘制平面
private final PlaneRenderer planeRenderer = new PlaneRenderer();
// 绘制云点
private final PointCloudRenderer pointCloudRenderer = new PointCloudRenderer();
public void onDrawFrame(GL10 gl) {
frame = session.update(); // 获取摄像头原始数据帧(阻塞方法)
// Handle one tap per frame.
handleTap(frame, camera); // 检测是否有平面点击事件,如有则在相应位置放置 Android 模型
...
// Draw background.
backgroundRenderer.draw(frame); // 将摄像头预览数据作为背景图绘制
...
// Visualize tracked points.
PointCloud pointCloud = frame.acquirePointCloud();
pointCloudRenderer.update(pointCloud);
pointCloudRenderer.draw(viewmtx, projmtx); // 绘制点云
...
// Visualize planes.
planeRenderer.drawPlanes(session.getAllTrackables(Plane.class), camera.getDisplayOrientedPose(), projmtx); // 绘制平面
...
// Update and draw the model and its shadow.
virtualObject.updateModelMatrix(anchorMatrix, scaleFactor);
virtualObjectShadow.updateModelMatrix(anchorMatrix, scaleFactor);
virtualObject.draw(viewmtx, projmtx, colorCorrectionRgba, coloredAnchor.color); // 绘制 Android 模型
virtualObjectShadow.draw(viewmtx, projmtx, colorCorrectionRgba, coloredAnchor.color); // 绘制 Android 模型的阴影
}
## Комбинация технологий: Публикуйте улучшенные изображения с дополненной реальностью в аудио- и видеооблаке в режиме реального времени.
реализованы основныеАудио и видео звонки в реальном времениа такжеУлучшенная графика с дополненной реальностьюПосле этого это теперь просто окончательная их комбинация.
Поскольку сеанс будет занимать камеру устройства после его запуска, Qiniu RTN SDK не может его собрать.В настоящее время нам нужно использовать функцию «Импорт внешних аудио- и видеоданных», предоставленную последней версией.
Перед публикацией потока нам нужно получитьУлучшенная графика с дополненной реальностьюДанные формата NV21, поскольку функция «Импорт внешних видеоданных данных» текущего SDK QINIU RTN Android поддерживает только данные формата NV21.
Следующий пример кода находится вonDrawFrame
Добавьте в конце метода чтение данных содержимого Surface из GLSurfaceView, выполните необходимое преобразование формата, а затем опубликуйте его.
public void onDrawFrame(GL10 gl) {
...
if (mPublished) { // 只在七牛 RTN 发布流成功后才导入 AR 数据
// 将 AR 增强画面 的数据从 GPU 中读取出来
GLES20.glReadPixels(0, 0, mSurfaceWidth, mSurfaceHeight, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, mBufferRGBA);
// RGBA 转为 NV21(篇幅原因,不在此展开算法)
mBufferNV21 = RGBAToNV21(mBufferRGBA, mSurfaceWidth, mSurfaceHeight);
// 通过 "外部视频数据导入" 功能将 NV21 数据形式的 AR 增强画面 发布出去
mRTCManager.inputVideoFrame(mBufferNV21, mSurfaceWidth, mSurfaceHeight, 0, frame.getTimestamp());
}
}
Суммировать
Используя функцию «Импорт внешних аудио- и видеоданных», предоставляемую Qiniu RTN SDK версии 1.1.0+, AR можно легко комбинировать с аудио- и видеосвязью в реальном времени. Вышеупомянутая программа основана на Qiniu RTN SDK и соответствующей сети RTN и может поддерживать до 20 человек для одновременных аудио- и видеозвонков с малой задержкой. Считается, что сочетание технологии AR и аудио- и видеосвязи в реальном времени принесет больше сценариев применения в ближайшем будущем.