# Upload Recordings to Bunny Stream

OvenMediaEngine Enterprise이 녹화한 라이브 영상을 Bunny Stream에 업로드 하여, 전 세계 사용자에게 제공하는 방법을 설명합니다.

{% hint style="info" %}
Bunny Stream은 글로벌 CDN 기업 bunny.net에서 제공하는 비디오 스트리밍 서비스입니다. 영상 업로드부터 인코딩, 보안, 글로벌 전송, 플레이어까지 비디오 서비스에 필요한 모든 인프라를 하나의 통합 플랫폼에서 제공합니다.
{% endhint %}

## 전제 조건

녹화 파일 전송을 위해 Bunny Stream의 `Video Library ID`와 `API Key`가 필요합니다.

Bunny Stream의 Video library를 생성하면 bunny.net의  대시보드에서 `Video Library ID` 와 해당 Video library의 `API Key`를 확인 할 수 있습니다.

&#x20;`Video Library ID`와 `API Key` 에 대해서는bunny.net이 제공하는 가이드를 확인바랍니다.

* Quick Start: <https://docs.bunny.net/stream/quickstart>
* Authentication: <https://docs.bunny.net/stream/authentication>

## 1단계: OvenMediaEngine에서 녹화 기능 설정

OvenMediaEngine의 File Publisher 기능을 활성화하여 스트림 녹화 기능을 사용할 수 있습니다.

녹화 제어는 다음 두 가지 방법으로 가능합니다.

* 스트림 시작 시 자동 녹화
* REST API를 이용한 수동 녹화 제어

#### 설정 파일 경로

* `/usr/share/ovenmediaengine/conf/Server.xml`

### 자동 녹화 설정

이 섹션에서는 스트림이 시작될 때 녹화를 자동으로 시작하고, 스트림이 종료될 때 녹화를 자동으로 중지하도록 OvenMediaEngine을 설정하는 방법을 설명합니다.

#### 설정 파일 예시

{% code title="Server.xml" %}

```xml
<Applications>
  <Application>
    <Name>app</Name>
    ...
    <Publishers>
      <FILE>
        <RootPath>/usr/share/ovenmediaengine/records</RootPath>
        <StreamMap>
          <Enable>true</Enable>
          <Path>./record_map.xml</Path>
        </StreamMap>
      </FILE>
    </Publishers>
    ...
  </Application>
</Applications>
```

{% endcode %}

OvenMediaEngine이 자동으로 녹화를 수행하고 Bunny Stream으로 전송하도록 하려면, `FILE.StreamMap.Path` 에 지정한 XML 파일에 녹화 파일 형식과 Bunny Stream 정보를 설정합니다.

#### Server.xml에 지정한 record\_map.xml 파일을 생성

* Path:  `/usr/share/ovenmediaengine/conf/record_map.xml`

{% code title="record\_map.xml" %}

```xml
<RecordInfo>
  <Record>
    <Enable>true</Enable>
    <StreamName>stream</StreamName>
    <FilePath>${VirtualHost}/${Application}/${Stream}-${StartTime:YYYYMMDDhhmmss}_${EndTime:YYYYMMDDhhmmss}.mp4</FilePath>
    <InfoPath>${VirtualHost}/${Application}/${Stream}-${StartTime:YYYYMMDDhhmmss}_${EndTime:YYYYMMDDhhmmss}.xml</InfoPath>
    <Metadata>service='bunny_stream', api_key='xxxxxxxx-xxxx-xxxx-xxxxxxxxxxxx-xxxx-xxxx', library_id='123456'</Metadata>
  </Record>
</RecordInfo>
```

{% endcode %}

이 예제에서는 `app/stream` 스트림이 시작되면 `FilePath`와 `InfoPath`에 지정된 경로에 녹화 파일과 녹화 정보 파일이 자동으로 생성됩니다. `Metadata` 필드에는 Bunny Stream으로 녹화 파일을 업로드하는 데 필요한 정보를 `key='value',key='value', ...` 형식으로 설정합니다.

#### Bunny Stream 업로드를 위한 Metadata 형식

`service='bunny_stream', api_endpoint='https://video.bunnycdn.com', tus_endpoint='https://video.bunnycdn.com/tusupload', api_key='xxxxxxxx-xxxx-xxxx-xxxxxxxxxxxx-xxxx-xxxx', library_id='123456', collection_id='xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx', title='video title', delete='false'`&#x20;

* **`service`** (<mark style="color:red;">required</mark>): Bunny Stream에 업로드를 하기 때문에 bunny\_stream으로 지정합니다.
* &#x200B;**`api_key`** (<mark style="color:red;">required</mark>): Bunny Stream의 API key를 입력합니다.
* &#x200B;**`library_id`** (<mark style="color:red;">required</mark>): Bunny Stream의 라이브러리 ID를 입력합니다. 녹화 영상은 해당 라이브러리에 업로드 됩니다.
* &#x200B;**`api_endpoint`** (optional): Bunny Stream의 API Endpoint 주소를 입력합니다. 미 입력시 기본값인 `https://video.bunnycdn.com` 를사용합니다.
* **`tus_endpoint`** (optional): Bunny Stream의 TUS Endpoint 주소를 입력합니다. 미 입력시 기본값인 `https://video.bunnycdn.com/tusupload` 를사용합니다.
* **`collection_id`** (optional): Bunny Stream 라이브러리 내 특정 컬렉션에 업로드를 하려면 해당 컬렉션의 ID를 입력합니다.
* **`title`** (optional): 파일명을 지정해 업로드합니다. 미 입력시 녹화 파일명으로 업로드됩니다.
* **`delete`** (optional) : 전송을 완료 후 생성되었던 녹화 파일 삭제 여부를 true 또는 false로 지정합니다.

### Rest API를 이용한 녹화 설정

이 섹션에서는 Recording REST API를 사용하여 녹화를 시작하고 중지하도록 OvenMediaEngine을 설정하는 방법을 설명합니다.

이 경우, Bunny Stream으로 녹화 파일을 업로드하는 데 필요한 Metadata는 Recording API를 호출할 때 설정합니다.

#### 설정 파일 예시

{% code title="Server.xml" %}

```xml
<Applications>
  <Application>
    <Name>app</Name>
    ...
    <Publishers>
      <FILE>
        <RootPath>/usr/share/ovenmediaengine/records</RootPath>
        <FilePath>${VirtualHost}/${Application}/${Stream}-${StartTime:YYYYMMDDhhmmss}_${EndTime:YYYYMMDDhhmmss}.mp4</FilePath>
        <InfoPath>${VirtualHost}/${Application}/${Stream}-${StartTime:YYYYMMDDhhmmss}_${EndTime:YYYYMMDDhhmmss}.xml</InfoPath>
      </FILE>
    </Publishers>
    ...
</Applications>
```

{% endcode %}

이 예제 구성에서는 지정된 매크로 형식에 따라 녹화 파일과 녹화 정보 파일을 `/usr/share/ovenmediaengine/records` 경로에 저장합니다.

{% hint style="info" %}
OvenMediaEngine의 녹화 설정에 대한 자세한 내용은 다음 문서를 참고하시기 바랍니다.\
<https://docs.ovenmediaengine.com/recording>
{% endhint %}

## 2단계: 전송 서비스 설정 및 서비스 활성화

### 전송 서비스 설정

녹화 파일이 생성되는 경로를 설정하여, OvenMediaEngine Delivery가 지정된 경로에서 새로 생성된 녹화 파일을 감지하고 Bunny Stream으로 업로드하도록 구성합니다.

#### 설정 파일 경로

* `/usr/share/ovenmediaengine/delivery/conf/config.ini`

#### 설정 파일 예시

{% code title="config.i" %}

```ini
[DELIVERY]
...
RECORD_INFO_FILE_BASE_DIR = /usr/share/ovenmediaengine/records
```

{% endcode %}

설정 파일에서 `RECORD_INFO_FILE_BASE_DIR`를 `Server.xml`에 지정된 `RootPath`와 동일한 경로로 설정합니다.

### 전송 서비스 활성화

Delivery 서비스는 기본적으로 비활성화되어 있으므로, 아래와 같이 활성화합니다.

{% code title="" %}

```shellscript
sudo systemctl start ovenmediaengine-delivery
```

{% endcode %}

## 3단계: 녹화 및 전송 시작

### 자동 녹화 기능 사용

자동 업로드가 구성되면 스트림이 시작될 때 녹화가 시작됩니다. 녹화 파일이 생성된 후 Delivery가 해당 파일을 Bunny Stream으로 업로드하며, 업로드된 파일은 Bunny Stream 라이브러리에서 확인할 수 있습니다.

다음 RTMP 주소로 스트림을 송출합니다.

* `rtmp://{OME_HOST}:{OME_RTMP_PROV_PORT}/app/stream`

### REST API로 녹화 시작

{% stepper %}
{% step %}

#### 스트림 송출

다음 RTMP 주소로 스트림을 송출합니다.

```
rtmp://{OME_HOST}:{OME_RTMP_PROV_PORT}/app/stream
```

{% endstep %}

{% step %}

#### 녹화 시작

녹화를 시작하려면 Start Recording REST API를 호출합니다. Metadata 필드 형식은 위에서 설명한 [Bunny Stream Metadata 형식](#bunny-stream-metadata)과 동일합니다.

```bash
curl -X POST 'http://{OME_HOST}:{OME_API_PORT}/v1/vhosts/default/apps/app:startRecord' \
--header 'Authorization: {CREDENTIAL}' \
--header 'Content-Type: application/json' \
--data '{
    "id": "unique_id",
    "stream": {
        "name": "stream"
    },
    "metadata": "service='bunny_stream', api_key='xxxxxxxx-xxxx-xxxx-xxxxxxxxxxxx-xxxx-xxxx', library_id='123456'"
}'
```

{% endstep %}

{% step %}

#### 녹화 종료

녹화를 종료하려면 녹화 종료 REST API를 호출합니다.

```bash
curl -X POST 'http://{OME_HOST}:{OME_API_PORT}/v1/vhosts/default/apps/app:stopRecord' \
--header 'Authorization: {CREDENTIALS}' \
--header 'Content-Type: application/json' \
--data '{
    "id": "unique_id"
}'
```

{% endstep %}
{% endstepper %}

## 업로드 상태 확인

OvenMediaEngine Delivery 로그를 통해 녹화 파일의 업로드 상태를 확인할 수 있습니다.

```bash
tail -f /var/log/ovenmediaengine/delivery/delivery-daemon.log
```
