이 글을 쓰는 이유
컨텐츠를 만들고, 컨텐츠 소비자와 소통하고자 하는 1인 미디어의 시대가 열렸다. 취미 활동으로 자신의 예술적 감각을 뽐내기도 하고, 때로는 직업으로써 1인 미디어를 운영하기도 한다. 이때 반드시 인코딩과정을 거쳐야 하는데, 인코딩의 리소스 사용량이 결코 적지 않아 컴퓨터 시스템에 부담이 된다. 그 중에서도 게임 방송이나 컴퓨터 관련 강좌를 녹화할 때에는 리소스 사용량이 너무 커서 양질의 컨텐츠를 제작하는데에 어려움이 있다. 녹화하려는 게임의 플레이에 방해가 되거나 작업이 늦어지고, 방송이 끊기는 등의 상황은 컨텐츠 소비자에게 집중력을 떨어트리기 십상이다.
녹화가 리소스를 많이 사용하는 이유는 동영상을 어떻게 저장해야 할지 고르는데 있어서 연산이 굉장히 많이 필요하기 때문이다. 이를 인코딩이라고 하는데, 인코딩 툴이나 인코딩 툴의 옵션에 따라 품질이나 리소스 사용량에 차이가 크다. 동영상은 매 프레임을 사진처럼 저장하지 않는다. 키 프레임이라는 사진과 같은 프레임이 있고, 그 사이는 각 픽셀들의 움직임을 분석하여 저장한다. 같은 인코더를 사용한다면 이 움직임의 분석 방법에 따라 리소스 사용량이 변한다. 물론, 그 움직임의 분석 방법에 따라 결과물의 품질 차이도 크다.
그러므로 인코딩툴을 변경하거나 옵션을 적절히 조절하여 컨텐츠의 품질과 영상의 집중력 사이에서 적절한 조절이 필요하다.
앞서 인코딩의 변수로 제시했던 인코딩 툴은 사실상 하나밖에 없다. 무료이면서도 리소스 점유율 대비 품질이 좋은 코덱은 FFmpeg뿐이다. 그러므로 다른 변수들을 고려할 필요가 있다. 품질을 조절하면 리소스 사용량을 조절할 수 있다. 아니면 아예 새로운 접근으로 인코딩을 다른 프로세서로 처리하는 방법이 있다.
이번 주제에서는 그 방법을 소개해보려고 한다.
CPU 인코딩
가장 기본적이고, 전통적인 형태의 인코딩 방법이다. 6코어, 8코어 CPU가 보편화 되면서 가장 큰 혜택을 받는 부분이 동영상 인코딩이다. 인코딩은 병렬 연산이기 때문에 코어 수에 크게 영향을 받는다. 일반적으로 코어 수가 두 배가 되면 평균 약 1.6배의 성능 향상이 생기는 것으로 계산하는데, 인코딩은 코어 수가 두 배가 되면 1.8배 이상으로 2배에 근접한 성능이 나온다. 멀티코어 퍼포먼스의 평균치를 총대메고 끌어올리는 연산이 동영상 처리인 것이다. 그러니 요즘의 컴퓨터라면 CPU만으로도 인코딩 하는데에 큰 부담이 되지는 않는다.
CPU 인코딩은 대체로 편차가 적다는 장점이 있다. 그래픽처리(*게임)를 할때 CPU는 대체로 연산량이 비슷하지만, GPU는 연산량이 큰 폭으로 변한다. 화면에 보이지 않는 것들은 모두 자르고, 멀리 있는 개체들은 밉맵 기법으로 처리량을 줄인다. 모든 개체가 화면 안에 있고, 점점 가까워진다면 CPU 대비 GPU요구량이 크게 증가한다. 하지만 인코딩 과정 자체에서 장면이 복잡해질수록 CPU 리소스 요구량이 많아지기 때문에 인코딩까지 고려하면 꼭 그렇지만은 않다.
GPU 인코딩
앞서 말한 것과 같이 동영상 인코딩은 병렬 소수연산의 연속이기 때문에 GPU인코딩이 더 효율적이다. 메인스트림급 GPU는 소숫점 연산 유닛이 천 개에 달한다. 하이엔드급 GPU는 소숫점 연산 유닛이 4000개를 넘는다. 때문에 병렬 연산에 좋고, 인코딩에 효율적이다. 소수 연산 전용인만큼 같은 처리를 하더라도 점유율과 전력소비가 더 낮다.
단점은 GPU를 사용하는 프로그램에 있어서는 편차가 더 커질 수 있다는 것이다. CPU와 GPU를 포함한 프로세서들은 연산을 하기 전에 명령어를 디코딩하는데, GPU는 이 과정에 필요한 장치가 적기 때문이다. 일반적으로 CPU는 2개의 디코더에 1개의 정수연산유닛과 소수연산 유닛이 연결되고, GPU는 1개의 디코더에 64개의 소수연산유닛이 연결되기 때문이다. 즉, 동영상 인코딩만 한다면 GPU처리가 유리하지만 동영상 인코딩과 게임 등의 그래픽 처리를 한다면 디코더가 많은 CPU인코딩이 유리하다.
2-PC 인코딩
위 두가지 방법은 녹화 대상이 되는 프로그램이 CPU를 많이 사용하는지 GPU를 많이 사용하는지에 따라 인코딩 설정을 변경하는게 좋다. 아예 다른 컴퓨터로 인코딩을 하면 어떤 작업을 하든 인코딩이 영향을 끼치지 않는다. 디스플레이 출력은 초당 40Gbps에 달하는 데이터를 전송한다. 이 영상을 다른 컴퓨터로 전송하고자 한다면 40Gbps를 지원하는 인터페이스(포트)가 필요하다. 하지만 그런 인터페이스는 디스플레이 포트 뿐이다. 디스플레이 출력을 다시 다른 컴퓨터에 입력시켜주는 캡처 보드는 10만원을 넘어간다. 1080p영상을 지원하는 캡처카드는 30만원이 넘어간다.
그럼에도 2-PC 인코딩을 소개하는 이유가 있다. 바로 NDI에서 제공하는 프로그램을 사용하는 것이다. 원래는 그래픽 작업에 있어서 협업을 위한 툴로 개발되었지만 obs에서 지원하면서 NDI 자사 홈페이지에도 obs를 이용하는 방법을 제시하고 있다. NDI의 최대 장점은 캡처 보드가 없어도 리소스 사용 거의 없이 2-PC 인코딩이 가능하다는 것이다. OBS는 실행하는것만으로도 GPU리소스를 어느정도 사용하는데, NDI자체 툴을 이용하면 1%이내의 리소스 사용으로 2-PC인코딩이 가능해진다. 이전에도 말했지만, 인코딩은 데이터를 줄이기 위한 방법을 고르는 것 때문에 연산이 늘어나는 것이다. 반대로 NDI는 영상의 데이터를 줄이긴 하지만 연산이 그렇게 많지는 않고, 데이터 크기가 많이 줄지 않는다. NDI는 영상을 네트워크를 통해 전송한다. 영상의 데이터가 크기 때문에 두 컴퓨터가 1Gbps의 속도를 지원해야 한다. 게임 영상을 일반적으로 6000kbps 수준으로 녹화하는데 반해 NDI는 500Mbps(500000kbps)수준으로 녹화한다.
예고
이 강좌에서는 녹화 및 방송에 있어서 오픈소스 소프트웨어인 OBS만을 이용할 것이다.
OBS는 FFmpeg 코덱을 사용한다. 또한 CPU 인코딩과 GPU 인코딩을 번갈아가며 사용하거나 영상에 오버레이를 넣고, 마이크를 사용하는 데 있어서는 OBS가 이용하기 편하기 때문이다.
1인미디어 시대, 게임방송, 나도 해볼까? part.1
1인미디어 시대, 게임방송, 나도 해볼까? part.2: OBS 설정
1인미디어 시대, 게임방송, 나도 해볼까? part.3: CPU 인코딩 설정
1인미디어 시대, 게임방송, 나도 해볼까? part.4 : 비교와 결론