# 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
```


---

# 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://ovenmediaengine-enterprise.gitbook.io/guide/ko-kr/features/workflow-integration-and-external-system-connectivity/upload-recordings-to-bunny-stream.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.
