# 通过手机app实现直播中继

{% hint style="info" %}
本文档用于RayNeo X系列眼镜开发，不同的场景案例参考，仅提供部分核心实现思路演示，非完整可交付的用户级应用。参考使用过程中，若存在功能不稳定之处，敬请见谅。案例基于RayNeo X SDK实现，请结合 [RayNeo开发手册](https://rayneo.gitbook.io/rayneo-devdoc) 食用。
{% endhint %}

## 1. 简要介绍

本案例基于RayNeo X3 Pro眼镜，提供利用眼镜端摄像头进行第一人称视角直播的应用开发参考。核心思路是通过手机端app进行中继，将眼镜端开启摄像头后的音视频流推到中继手机app中，再由手机app推流到外部rtmp地址中。简要流程如下：

1. 手机中继app创建wifi p2p节点；
2. 眼镜端app搜索并连接步骤一创建的节点；
3. 通过p2p实时将当前眼镜摄像头的音视频流推送到手机app中；
4. 手机app可配置外部直播平台rtmp地址，将从眼镜端获取的视频流推送至外部直播间；

<br>

## 2. 资源下载

* 手机中继app资源下载：

{% file src="/files/CrrGIw28tecplheL8iFg" %}

* RayNeo X3 Pro眼镜端app资源下载：

{% file src="/files/N24rCFDpSJJyaUAu2PCB" %}

<br>

## 3. 使用说明

### 3.1 手机中继app创建网络节点

1. 安卓手机端安装文档中提供的手机中继app；
2. 点击页面中的按&#x94AE;**「Create Wi-Fi Direct Group」**，创建中继网络节点；
3. 页面上方显&#x793A;**「Group created. Waiting for camera device...」**&#x5219;视为成功，若出&#x73B0;**「Failed to create group」**&#x5219;表示创建失败，可重启手机中继app或重置手机端网络后重试；

<figure><img src="/files/ALdVbxUeUtpQys7Ah7I4" alt="" width="188"><figcaption></figcaption></figure>

### 3.2 眼镜端连接并选择推流参数

1. 眼镜端安装文档中提供的眼镜端app；
2. 确认眼镜wifi开关已开启（开启即可，不需要连接网络），可以长按镜腿唤出快捷控制面板进行确认；

<figure><img src="/files/U7F0R9XTtQCMWWNdcZNU" alt="" width="307"><figcaption></figcaption></figure>

3. 在眼镜底部栏找到已安装的 **glass** 应用并开启；
4. 滑动镜腿确认焦点&#x5728;**「Discover devices」**&#x4E0A;，并单击开启节点搜索；
5. 等待按钮下方出现手机中继app开启的中继节点，一般以你的手机型号命名；

<figure><img src="/files/0Y5B22zJCr757CJYjHee" alt="" width="315"><figcaption></figcaption></figure>

6. 滑动镜腿选中对应的中继节点，单击进行连接；
7. 连接成功后，将自动进入推流参数选择界面，依次是 分辨率 - 帧率 - 音频选项；

<figure><img src="/files/SmlH6DlmNftWI2HCgfIP" alt="" width="309"><figcaption></figcaption></figure>

<figure><img src="/files/J1Znfq10nX2b2CMsxnSD" alt="" width="309"><figcaption></figcaption></figure>

<figure><img src="/files/US4C2gQs77JMYLA3dCwf" alt="" width="315"><figcaption></figcaption></figure>

8. 建议选择 1280x720（720P） + 15 FPS 进行体验；

### 3.3 眼镜端开启和关闭推流

1. 推流参数选择完毕，眼镜端页面将进入推流页面；
2. 页面中点&#x51FB;**「Start cloud streaming」**，可将眼镜端摄像头音视频流推进当前连接的手机中继app；

<figure><img src="/files/7bKs4iCokJ0Jftx35Cg9" alt="" width="317"><figcaption></figcaption></figure>

3. 在手机中继app页面中，确认预览是否成功和推流效果；

<figure><img src="/files/VdJqV1YEf8tGICjUxVju" alt="" width="188"><figcaption></figcaption></figure>

4. 眼镜端点&#x51FB;**「Stop streaming」**，可停止推流；

### 3.4 手机中继app推流外部直播

1. 眼镜端摄像头成功推流至中继app后，可通过中继app推至外部直播频道；
2. 在外部平台直播间中，获取当前频道RTMP地址；常见推流地址来源如下：
   1. **抖音**：在抖音 App 开播后，在直播设置中获取推流地址；
   2. **阿里云/腾讯云**：在控制台创建直播流，获取推流 URL；
   3. **自建**：Nginx-RTMP 等，格式如 `rtmp://服务器IP/live/流名`；
3. 在手机中继app中，页面底部填写获取到的RTMP地址，并点&#x51FB;**「Start cloud streaming」**&#x5F00;始云端推流；

<figure><img src="/files/VdJqV1YEf8tGICjUxVju" alt="" width="188"><figcaption></figcaption></figure>

4. 页面中显示云端推流状态，&#x5F53;**「Connecting to RTMP server...」**&#x53D8;&#x4E3A;**「Streaming to cloud」**&#x65F6;，则表示推流成功，按钮将变&#x4E3A;**「Stop streaming」**，推流地址禁用编辑；
5. 使用其他设备（用户）访问已创建的直播间，验证推流效果；

### 3.5 附：抖音直播获取推流地址工具

{% file src="/files/4IioNqBlTdU8e4JiZoma" %}

1. 在已安装抖音app的手机上，安装上述app；
2. 需确认你的抖音app已登录，建议可先在原生抖音app中开启一次直播间，确认前置的开播条件均已允许，再关闭直播间体验推流；
3. 打开安装的工具app，按照页面中的按钮顺序从上到下执行；
   1. 点击进行初始化；
   2. 点击抖音授权登录，首次授权或授权过期，会调起你的抖音app，使用你已登录的帐号进行授权；
   3. 确认你当前的帐号在原生app没有同时开启直播，否则工具app中会开播失败；
   4. 点击开启直播，工具app将使用你的授权信息帮助你进行开播；
   5. 开播成功，页面下方会显示直播间的rtmp地址，点击地址可直接复制；
4. 将复制的rtmp地址粘贴到中继app中，并开启云端推流，即可完成推流直播；

### 3.6 常见问题&注意事项

1. **推流顺序**：建议摄像头先推流数秒再点云端推流，便于缓存 SPS/PPS
2. **权限**：任一端拒绝必要权限可能导致发现/连接失败
3. **切后台**：中继端切后台可能释放接收，需摄像头重连（以实际 `WifiDirectServer` / Activity 生命周期为准）
4. **推流失败**：检查 RTMP 地址、网络、平台要求等

<br>

## 4. 源码参考

{% file src="/files/RHjYp0fSEh3oysEdW7KW" %}

实现说明请查看 doc/技术实现说明与操作指南.md\
\ <br>


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://rayneo.gitbook.io/rayneo-devdoc/x-xi-lie/android-kai-fa/kai-fa-ying-yong-chang-jing-shi-li/tong-guo-shou-ji-app-shi-xian-zhi-bo-zhong-ji.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
