# Record Delivery

OvenMediaEngine을 사용하여 라이브 스트림을 녹화하고 녹화된 파일을 Object Storage로 전송하는 방법을 설명합니다.

* OvenMediaEngine 및 OvenMediaEngine Delivery를 설정하여 녹화 파일 전송을 활성화 합니다.
* OvenMediaEngine의 자동 녹화 기능을 이용하거나, 녹화 RestAPI를 이용해 녹화 전송을 시작합니다.
* 녹화 전송 상태를 모니터링 합니다.

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

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

#### **설정 파일 경로:**

* `/usr/share/ovenmediaengine/conf/Server.xml`에서 File Publisher를 활성화할 수 있습니다.

### 자동 녹화 설정 <a href="#id-1-1" id="id-1-1"></a>

스트림 송출이 시작되면 자동으로 녹화 및 전송을 시작할 수 있게 설정합니다.

#### **`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>
    ...
</Applications>
```

OvenMediaEngine이 자동으로 녹화 및 전송 작업을 수행할 수 있게 하기 위해 `FILE.StreamMap.Path`에 녹화 형식과Object Storage 정보를정의한 파일을 지정합니다.

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

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

#### **`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>aws_access_key_id='xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',aws_secret_access_key='xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',endpoint='https://object.storage.com',region='us-east-1',bucket_name='bucket_name',object_dir='my/vod/path/',delete='true'</Metadata>
  </Record>
</RecordInfo>
```

`MetaData`에 `key='value',key='value',...` 형식으로 전송 정보를 설정합니다.

전송 정보 포맷:

```
aws_access_key_id='****',aws_secret_access_key='****',endpoint='https://object.storage.com',region='us-east-1',bucket_name='record-bucket',object_dir='/my/vod/path/',delete='true'
```

* `aws_access_key_id` (required): Object Storage에 접근 가능한 access key id를 지정합니다.
* `aws_secret_access_key` (required): Object Storage에 접근 가능한 secret access key를 지정합니다.
* `endpoint` (optional): Object Storage의 접속 endpoint를 지정합니다. 빈 값일 경우 AWS S3의 endpoint를 사용합니다.
* `region` (optional): Object Storage의 지역을 지정합니다. 빈 값일 경우 AWS S3의 기본 지역을 사용합니다.
* `bucket_name` (required): 녹화 파일을 전송 할 버킷명을 입력합니다.
* `object_dir` (required): Bucket 내 녹화 파일을 전송할 경로를 지정합니다. -delete (optional) 전송을 완료 후 Server.xml 의 File Publisher의 RootPath에 생성되었던 녹화 파일 삭제 여부를 true 또는 false로 지정합니다.
* `delete` (optional)  : 전송을 완료 후 Server.xml 의 File Publisher의 RootPath에 생성되었던 녹화 파일 삭제 여부를 true 또는 false로 지정합니다.

### Rest API를 이용한 녹화 설정 <a href="#id-1-2.-rest-api" id="id-1-2.-rest-api"></a>

OvenMediaEngine의 녹화 REST API를 이용해 송출 중인 스트림을 녹화 및 전송할 수 있게 설정합니다.

{% hint style="success" %}
녹화 형식 및 Object Storage 정보는 녹화 시작 REST API를 호출하면서 설정할 수 있습니다.
{% endhint %}

#### **`Server.xml` 예시:**

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

{% hint style="info" %}
녹화 기능에 대한 상세한 내용은  <https://docs.ovenmediaengine.com/recording> 에서 확인할 수 있습니다.
{% endhint %}

## 2단계: 전송 서비스 설정 및 서비스 활성화 <a href="#id-2" id="id-2"></a>

### 전송 서비스 설정 <a href="#id-2-1" id="id-2-1"></a>

전송 서비스 설정에서 OvenMediaEngine이 녹화한 파일 경로를 설정합니다.

#### **전송 서비스 설정 파일 경로:**

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

설정 파일에서 `RECORD_INFO_FILE_BASE_DIR` 을 OvenMediaEngine의 File Publisher가 녹화 파일을 생성하는 경로로 설정합니다. (기본적으로 다른 설정은 변경할 필요가 없습니다.)

#### **`config.ini` 예시:**

```ini
[DELIVERY]
# database uri
DATABASE_URI = /usr/share/ovenmediaengine/delivery/delivery.db
# log file will saved
LOG_DIR = /var/log/ovenmediaengine/delivery/
# dump base directory
DUMP_INFO_FILE_BASE_DIR = 
# recording base directory
RECORD_INFO_FILE_BASE_DIR = /usr/share/ovenmediaengine/records
```

### 전송 서비스 활성화

전송 서비스는 기본적으로 비활성화 되어있습니다. 전송 서비스를 활성화 합니다.

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

## 3단계: 녹화 및 전송 시작 <a href="#id-3" id="id-3"></a>

### 자동 녹화 기능을 이용할 경우 <a href="#id-3-1" id="id-3-1"></a>

`app/stream` 스트림을 송출 합니다. OvenMediaEngine이 자동으로 녹화를 시작하고 설정된 Object Storage로 녹화 파일을 전송합니다.

### 녹화 REST API를 이용할 경우 <a href="#id-3-2.-rest-api" id="id-3-2.-rest-api"></a>

`app/stream` 스트림을 송출 합니다. `app/stream`에 대해 녹화 시작 REST API를 호출하면 OvenMediaEngine이 녹화를 시작하고 녹화가 완료되면 전송 서비스가 Object Storage에 녹화 파일을 전송합니다.

#### **녹화 시작 API 호출 예시:**

```json
curl --location 'http://{OME_HOST}:{OME_REST_API_PORT}/v1/vhosts/default/apps/app:startRecord' \
--header 'Authorization: Basic {OME_API_CREDENTIAL}' \
--header 'Content-Type: application/json' \
--data '{
    "id": "unique_id",
    "stream": {
        "name": "stream"
    },
    "metadata": "aws_access_key_id='xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',aws_secret_access_key='xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',endpoint='https://object.storage.com',region='us-east-1',bucket_name='bucket_name',object_dir='my/vod/path/',delete='true'"
}'
```

{% hint style="info" %}
녹화 기능 REST API는 <https://docs.ovenmediaengine.com/rest-api/v1/virtualhost/application/recording>에서 확인할 수 있습니다.
{% endhint %}

### 전송 상태 확인 <a href="#id-3-3" id="id-3-3"></a>

전송 서비스 로그를 확인하여 녹화 파일의 전송 상태를 모니터링합니다.

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

***

이상으로 OvenMediaEngine을 사용하여 라이브 스트림 녹화 및 녹화된 파일을 Object Storage로 전송하는 방법을 마칩니다.
