Programming

MediaPackage 를 활용한 실시간 스트리밍(Feat. IP Cam, FFmpeg)

True or False 2023. 6. 8. 16:07

서론

현재 회사에서 인터넷선을 연결할 수 없는 환경에서
IP Camera 를 활용해 실시간 스트리밍, 저장, 알림(이상감지) 를 서비스를 하려고 한다.

 

그중에서 여러 대안을 찾다가 AWS Media 관련 상품들이 나름 잘 되어있어서 어떻게 Live를 만들었는지 적어볼려고 한다.

환경

1. FHD 급 IP Camera (RTSP 지원이 필요함)

2. 고정 IP 되는 LTE ROUTER(Port Forwarding 지원이 필요함)

3. 컴퓨터(4Core, 2gb 이상)

 

준비

1. IP Camera 설치 완료

2. IP Camera 와 고정 IP 를 할당받은 Lte Router 와 연결 완료(고정 IP 가 필수는 아니지만 중간에 바뀌는 경우 다시 재설정 필요)

 

시작

1. MediaPackage Create Channel

MediaPackage 를 들어가서 현재 만들고자 하는 채널의 ID와 Description 을 적어준다.
(Description 은 Option 이기는 하지만 적는 것을 추천한다.)

MediaPackage 채널 생성

채널 만드는 것을 완료했다면 아래와 같이 두개의 HLS ingest endpoint 와 빈 Origin endpoint 가 있게된다.

초기 MediaPackage 채널

2. Endpoint 생성

위의 MediaPackage 에서 Managa Endpoint를 클릭하여 새로운 endpoint를 생성한다.

기본적으로 ID 만 적어도 문제없기에 ID만 적고 진행한다.

MediaPackage Endpoint 설정

3.MediaLive Channel 생성

MediaLive 상품으로 이동하여 Create Channel 을 눌러준다.

MediaLive Channel 생성과정

먼저 진행할 것은 Input attachments 를 Add 하는 것이다.

아래의 이미지 순서대로 클릭하여서 Create Input 을 한다.

Input 생성 버튼

그러면 아래와 같은 이미지가 생성이 되어진다.

 

Input Name을 입력 후 

Input Type은 현재 rtsp => rtmp로 변환해서 보낼 것이기에 RTMP(Push)를 클릭한다.

Create Input 이미지

그리고 밑으로 내려와 input security group 을 create 로 하고 0.0.0.0/0 create input security group을 하여 생성해준다.

 

security group 설정

 

이제 Input에 방금 만들어둔 test-input 을 설정하고 Confirm 을 클릭한다.

Input 완료

Channel and Input details 를 클릭하여
현재 Channel name과 role 은 use existing role 사용, Template 은 HTTP Live Streaming(MediaPackage)를 선택한다.

그리고 Output 으로 들어가 처음에 만들었던 MediaPackage Channel ID 와 연결시켜준다.

그리고 본인이 원하는 Output 만 남기고 삭제한다.

그리고 밑에 왼쪽 주황색 버튼 Create Channel 을 클릭하여 만들어준다.

이제 이렇게 뜨게 될텐데 Current State idle 인 상태이기에 Start 를 눌러서 동영상 소스를 받을 수 있는 상태로 만들어준다.

(바로는 안되고 약간의 딜레이가 있다.)

4. FFmpeg 를 이용해서 IP Camera rstp 를 rtmp 로 변경하여 전송

먼저 MediaLive 에 있는 inputs 탭에서 본인이 만들었던 input으로 들어가 endpoint를 기억해둔다.

저기가 우리가 보내야할 장소인 곳이다.

 

그리고 본인의 컴퓨터 혹은 ec2에 ffmpeg 설치 후 아래와 같은 코드를 작성하면 된다.

ffmpeg -re -rtsp_transport tcp -i rtsp://<User이름>:<Password>@<IP addr>:<PORT><RTSP 주소> -c:a aac -c:v h264 -f flv <MediaLive Input 주소>

여기서 참고해야할 것은 2가지이다.

 

1. FFmpeg version 4 이상일 것(3의 경우 에러가 발생하는 경우를 발생)

2. RTSP 주소의 경우 IP Camera 제조사마다 다르다는 것(제조사마다 URL 형식이 다르다)

 

MediaLive Input 의 주소는 위의 이미지에서 endpoint 가 2개가 있는데 그것을 이용하면 된다.

 

5. Preview 를 통해서 확인

여기까지 문제없이 설정이 완료되었다면 MediaPackage로 이동 본인의 Channel 에서 확인이 가능하다.

확인 방법은 Origin endpoints 탭에서 Preview 를 클릭하면 아래와 같이 실시간으로 동작하고 있는 영상이 나올 것이다.

endpoint 를 보면 endpoint url 이 있는데 그것을 통해서 재생이 가능하다.

 

겪었던 문제

비용관련 문제

처음에는 QHD 급의 IP Camera 를 사용했다.

그러다보니 서버의 사양이 올라가야했고 이것은 비용의 상승으로 이루어졌다.

(ec2의 경우 core의 개수만 늘리는 게 불가 - 8코어 16기가)

하지만 FHD 급의 IP Camera 로 낮추고 테스트를 해보니 4코어 정도면 처리하는데 문제가 없었다.

 

ffmpeg 관련 문제

ffmpeg 같은 경우에는 테스트방식이

1. 1분짜리 저장이 원배속이 나오게 저장이 되는지 테스트

2. 변환과정과 전송과정이 원배속이 나오는지 테스트

이렇게 진행을 했고 실패한 경우에는 원인을 찾아서 고치는 방식으로 진행했다.

 

ubuntu 의 경우 apt 로 ffmpeg 를 설치하면 3.x 버전이 설치되어서 snap 을 통해서 4.x 버전을 설치했다.