Skip to content
Chaerim edited this page Aug 25, 2024 · 22 revisions

image

1. Kafka Producer

1.1 Video Stream

Streamlink를 사용하여 유튜브 라이브 영상으로부터 바이너리를 추출하고, 128KB 단위로 읽어서 카프카 브로커의 비디오 토픽으로 전송한다.

1.2 Live Chatting API

유튜브 API를 사용하여 라이브 영상의 채팅 목록을 실시간으로 수집한다. 이때 채팅의 내용은 데이터베이스 저장하지 않으며 오로지 채팅 빈도를 계산하기 위한 타임스탬프만 카프카 브로커의 채팅 토픽으로 전송한다.

2. Kafka Broker

프로듀서로부터 영상 바이너리 및 채팅 타임스탬프를 받아서 카프카 스트림즈, 스파크 및 InfluxDB로 보내는 역할을 한다.

3. Kafka Streams

카프카 브로커의 채팅 토픽으로 들어온 채팅들의 타임스탬프를 확인하고, 이를 슬라이딩 윈도우를 통해 집계하여 특정 구간에 채팅 트래픽이 폭증했는 지 여부를 확인한다. 만약 특정 윈도우 내에서 집계된 채팅의 수가 임계값 이상이라면 해당 윈도우 구간의 타임스탬프를 카프카 브로커의 하이라이트 토픽으로 다시 보내준다.

4. Kafka Consumer

4.1 Spark

Kafka에서 비디오 바이너리 데이터를 실시간으로 수신하여 Spark에 저장한다. Spark Streaming의 Window를 사용하여 30초 동안 모인 영상 바이너리 데이터를 mp4로 변환하고 whisper를 사용하여 영상의 스크립트를 추출한다. 추출된 텍스트는 InfluxDB에 적재된다.

4.2 Data Preprocessor

Kafka에서 비디오 바이너리 데이터를 실시간으로 수신하고, 해당 데이터를 InfluxDB에 저장하기 위해 형식을 변환한다. 이 과정의 세부적인 단계는 다음과 같다.

  1. Kafka Consumer 설정: confluent_kafka 라이브러리를 사용하여 Kafka Consumer를 설정한다. 설정된 Consumer는 특정 Topic (Video Stream)에 대해 데이터를 실시간으로 가져온다.
  2. 비디오 바이너리 데이터를 Base64로 인코딩: 수신된 비디오 바이너리 데이터를 base64로 인코딩하여 텍스트 형식으로 변환한다. 이 인코딩 과정은 InfluxDB에 텍스트 필드로 저장하기 위함이다.
  3. 타임스탬프 변환: 수신된 카프카 메시지의 타임스탬프(밀리초 단위)를 나노초 단위로 변환하여 InfluxDB에 저장한다. 영상 바이너리 데이터는 밀리초 당 2개 이상의 데이터가 들어오므로 나노초 단위의 높은 정밀도가 필요하다.

5. InfluxDB

5.1 Video Binary

Data Preprocessor에서 변환된 타임스탬프와 텍스트 형태로 변환된 비디오 바이너리 데이터는 InfluxDB에 저장한다. InfluxDB는 시계열 데이터의 저장 및 분석에 최적화된 데이터베이스로, 특히 타임스탬프를 기준으로 데이터를 조회하고 분석하는 데 뛰어난 성능을 발휘한다.

5.2 Video Script

Video Script 데이터는 비디오 바이너리 데이터와 함께 InfluxDB에 저장되는 또 다른 시계열 데이터이다. 비비디오에서 오디오를 추출하고 이를 텍스트로 변환(STT: Speech-to-Text)한 텍스트 데이터를 InfluxDB에 저장한다. 이 데이터는 비디오의 각 타임스탬프에 대응하는 텍스트 정보이다.

6. Video Range Extractor

영상 범위 추출 어플리케이션은 채팅 빈도가 높아진 시점을 명장면 타임스탬프로 식별하고, 이 기준을 바탕으로 전후 10분에 해당하는 영상 대본을 추출한다. 이후, 추출된 대본을 GPT API에 요청하여 해당 장면의 시작 및 종료 타임스탬프와 제목을 받아온다. 마지막으로, 이 정보를 활용하여 지정된 영상 구간을 추출하고, 결과를 mp4 파일로 저장한다.

6.1 GPT API

영상의 범위를 추출하기 위해 GPT API를 사용한다. GPT API는 영상의 대본을 입력받아 해당 대본의 시작 및 종료 타임스탬프와 제목을 반환한다. 이렇게 반환된 제목으로 영상의 특정 구간을 저장한다.

6.2 영상 저장

영상의 byte array를 받아 해당 영상의 특정 구간을 추출하여 먼저 ts (transport stream) 파일로 저장한다. 이후, ts 파일을 mp4 파일로 변환하여 저장한다.

6.3 S3 업로드

추출된 영상은 S3에 업로드된다. S3에 업로드된 영상은 자동으로 S3 트리거를 통해 YouTube에 업로드한다.

7. Cloud Storage

추출된 하이라이트 영상을 추후 조회, 수정 및 삭제하기 위해 유튜브에 업로드하기 전에 우선적으로 S3에 저장한다.

8. YouTube Upload

S3에 새 영상이 저장되면 이를 Lambda 트리거를 활용하여 유튜브에 자동으로 업로드한다.