2014/07/24

[Korean] DaumPot 이외의 RTMP를 사용하는 실시간 방송 (작성중)

 국내에서 실시간 방송이 유행하기 시작한 건 afreeca와 다음 potplayer를 통해서 많은 사람들이 사용하기 시작하면서 붐이 일었습니다. 여기서는 이 서비스들이 무슨 기술을 사용하고 있으며, 현재 전용프로그램에 의한 국내서비스 외 다른 서비스의 방송방법도 알아보겠습니다.

이런 분들에게는 추천합니다.
- 영어는 잘 안될지언정 어쨌든 좁은 한국만을 떠나 전세계로 컨텐츠를 널리 알리고 싶다.
- LoL이나 Dota 2 등 세계적으로 인기를 끄는 게임을 Twitch나 Youtube로 방송하고 싶다.

--2015년 7월 7일 추가
Afreeca TV가 2015년 5월부터 RTMP 직접 송출 서비스를 실시하였습니다. 이 때문에 OS 및 전용프로그램 이외로도 방송이 가능하게 되었습니다.


1. RTMP를 사용하는 서비스들
 위키피디아를 검색하면 자세히 설명이 나옵니다만, 간단히 줄여 실시간으로 영상/음성을 네트워크를 통해 불특정 다수에게 스트리밍 데이터를 보내는 기술의 규격입니다. 규격으로  RTMP(Real Time Messaging Protocal)가 있으며, 알려진 플랫폼과 기술들을 나열하면..

2014년 7월 24일 기준
Potplayer Afreeca Youtube Twitch.tv Ustream nico生
Feedback Chat Chat Comment
3rd-party
Web-chat
3rd-party
Web-chat
3rd-party
Screen-cmt
3rd-party
Protocol RTMP RTMP RTMP RTMP RTMP RTMP
Program Custom App Custom App
Web-based
Web-based
3rd-party
Web-based
3rd-party
Custom App
Web-based
3rd-party
Custom App
Web-based
3rd-party
Maximum
frame rate
(fps)
60 40 60 60 60 120
Maximum
resolution
1280x1024 1024x768 1920x1080 1920x1080 1920x1080 512x384
640x360
Maximum bandwidth
(kbps)
4000 1000*
2000*
3000*
480p <2000
720p <4000
1080p <6000
No-limit
<5000
recommend
No-limit
<5000
recommend
2h~19h 480
19h~2h 384
Video
Codec
MPEG4
H.264
MPEG4
H.264
WebM
H.264
H.264 WebM
H.264
H.264
Audio
Codec
MP3 AAC Ogg Vorbis
MP3
HE-AAC
AAC-LC AAC-LC
HE-AAC v2
AAC-LC
HE-AAC v2**
3rdparty app
Availability
No(※) Yes
(Stream key)
Yes
(Stream key)
Yes
(Stream key)
Yes
(Stream key)
Yes
(Stream key)
※ 사전 계약된 기업고객만 가능한 것 같습니다.(정식계약 채널 등)
* 공식툴 기준 일반 1000kbps, 베스트BJ 2000k, 유료쿠폰 9만원/1주일 3000kbps
** 공식툴에서 HE-AAC 기본지원이며 외부툴로도 사용가능. (48kbps~72kbps만)

용어설명
AAC-LC : MP3에서 단점을 보완하여 발전된 코덱. 128kbps ~ 512kbps 고음질 용도
HE-AAC v1 : AAC-LC + SBR (일반적으로 72kbps ~ 96kbps 용도)
HE-AAC v2 : AAC-LC + SBR + PS (일반적으로 32kbps~72kbps 용도)
HE-AAC v1/v2에서 고음질을 선택하면 자동적으로 PS 및 SBR이 비활성화되어 AAC-LC와 동일

국내에서 많이 접할 수 있는 것 위주로 나열하였습니다.

다음에서 서비스하는 팟플레이어 방송은 720p/60fps 등으로 방송할 수 있는 화질은 국내 최고의 환경이지만, 전용프로그램만 사용가능합니다. 기업계약고객의 경우 범용 전문툴도 사용이 가능하지만, 저자인 저도 사용한 적이 없고, 오픈된 정보가 없어 여기서는 다루지 않습니다. 아마 밑에 기술된 방법에 비해 크게 다르지 않을 것으로 예상됩니다.  기업고객들은 다음팟을 이용하여 스포츠중계(축구/야구 등), 뉴스(YTN24 등), 각종 행사 등에 활용되고 있습니다.

아프리카는 나우콤에서 운영하는 서비스이며, 개인도 별풍선, 광고협찬 등을 통해 수익을 올릴 수 있으며, 기타 자잘한 컨텐츠제작자를 위한 환경이 팟플레이어보다 뛰어납니다. 하지만, 화질에 관해서는 일본의 niconico 生을 제외하면 최악의 환경이며, 고화질의 경우 베스트BJ가 되지 않는 한 매우 비싼 값의 쿠폰을 구입하여야 사용할 수 있습니다.
 2015년 5월부터 RTMP 직접 송출 서비스를 시작하여 타 OS, 타 소프트웨어로도 방송이 가능하게 되었습니다.

구글의 Youtube는 동영상 서비스로 전세계적으로 유명하며, 유료 채널구독,  최근에는 기업 및 유명 컨텐츠 제작자가 아닌 일반유저에게도 생방송서비스를 개방하였습니다. 초기부터 컨텐츠제작자의 채널에 광고수입을 올릴 수 있는 시스템을 구축하여, 전세계 수많은 시청자들에게 광고수입과 더불어 고화질의 동영상과 생방송 서비스를 가능케 해줍니다. 위의 두 국내서비스와는 다르게 생방송 중 채팅서비스가 내장되어 있지 않기에 동영상에 남기는 코멘트 외에는 twitter, IRC 등 외부 툴을 활용하는 방법밖에 없어 시청자와 피드백을 하기에는 약간 불편한 것이 사실입니다. 채팅 옵션이 기본적으로 활성화 되어있으며, 비활성화도 가능합니다. (참고링크) 해상도제한은 화질별로 다르며 (4K도 가능) 전세계의 시청자들은 국내처럼 거의 모든 인터넷환경이 100Mbps급으로 좋은 것은 아니므로 비트레이트를 2~3Mbps 수준으로 조절할 필요가 있습니다. 국내에서는 KT기준 최대 5000k 약간 넘게 송출이 가능함을 확인했었습니다. 2014년 후반 최근에는 60fps 업로드 및 실시간 스트리밍이 가능해졌습니다.

UstreamTwitch.tvyoutube와 마찬가지로 전세계적으로 유명한 실시간 방송서비스 중 하나이며, 각종 기업들이 자사 홍보, 이벤트 등에 적극 활용하는 서비스입니다. 커다란 게임이벤트의 경우 Twitch.tv에서 거의 볼 수 있을만큼 Twitch의 경우 게임 컨텐츠에 특화된 서비스입니다. 두 서비스 다 비슷비슷하며, 생방송면으로는 youtube와 거의 동일한 반면 웹기반 채널에서 채팅기능이 포함되어 있어 youtube에 비해 시청자들의 상호작용/반응 등을 보다 쉽게 확인이 가능합니다. 해상도제한은 없는 것 같아 보이지만 확인된 바로는 대역폭이 허용하는 한 1080p60도 가능하며, youtube와 마찬가지로 실제로는 720p 30f/60f 수준에 대역폭을 2~3Mbps 수준으로 조절하는 것이 좋습니다. 국내에서는 youtube와 마찬가지로 KT기준 최대 5000k 약간 넘게 송출이 가능함을 확인했었습니다.

niconico 생방송(ニコニコ生配信)은 일본에서 서비스하는 동영상 서비스 회사의 생방송 서비스이며, 유료회원만 가능합니다. 일본 특유의 문화에 맞게 시청자들의 피드백에 가장 특화된 것이 특징이며, 유저들이 작성한 수많은 각종 편리한 최적화/외부툴 등이 있습니다. 그 중에는 시청자의 코멘트를 생방송중인 사람에게  자동음성으로 읽어주는 플러그인은 다른 서비스 등에서는 여태까지 찾아볼 수 없는 기능이어서 눈에 띕니다. 단점으로는, 여타 서비스에 비해 매우 열악/최악의 해상도만 사용가능합니다. 국내에서 이런 해상도로 유료 서비스를 하려고 하면, 얼마가지 않아 유저들이 다 떠나서 망할 것이 예상됩니다만, 풍부한 휴대폰 인프라환경 및 일본 특유의 환경과 정서에 맞물려 유료임에도 불구하고 이런 환경을 조금의(?) 불만이 있어도 어쩔 수  없이 사용하는 것이 개인적으로는 흥미롭습니다. 수익원으로는 일본내 기업들의 수많은 컨텐츠와 상호제휴를 통한 무궁무진한 수익창출성,  유료회원 등을 통해 유지하는 듯 합니다.


몇 가지를 알아봤습니다만, 국내 2개 서비스를 제외한 나머지 4개의 서비스에 대해 방송하는
방법을 알아보도록 하겠습니다.


2. 전용 웹페이지기반으로 방송하기

기존 PC에 아무것도 설치할 필요없이, 사용하던 웹캠이나 캡쳐장치 또는 화면을 보는 스크린을 쉽게 캡쳐하여 바로 방송할 수 있게끔 각 서비스사별로 채널당 스튜디오 웹페이지를 제공하고 있습니다. 실제로 이 방법을 통해 주변 지인이 손쉽게 스크린캡쳐/DirectX 캡쳐기능을 사용하여 간단한 게임방송을 진행하는 모습을 볼 수 있었습니다.

시작하는 방법은 처음에 어딨는지 찾기 힘들어서 그렇지, 방법 자체는 밑의 스크린샷을 보는대로 따라가기만 하면 됩니다.

1. 우측상단의 로그인 아이콘을 클릭하면 "제작자 스튜디오" 화면으로 들어갈 수 있는 아이콘클릭
2. 좌측메뉴에서 동영상 관리자의  실시간 이벤트 -- 새 라이브 이벤트 클릭
3. 기본정보 입력과  고급설정 입력 (해상도 설정, 대역폭 설정 등)
4. 일정 만들기 후 카메라 입력 설정(directx, 스크린캡쳐, 웹캠, 캡쳐장치 등)
5. 라이브 이벤트 시작 및 링크주소 배포






3. 범용 전문프로그램으로 방송하기

수 많은 범용 툴이 있는데, 하나하나 나열하자면 끝이 없기에, 유명한 몇 개만 이 자리에서 소개하고자 합니다.

오픈소스툴인 Open Broadcaster Sosftware, Adobe사에서 제공하는 무료툴 Flash Media Live Encoder, 유료툴에서 유명하고 캡쳐보드로 유명한 Avermedia사와 제휴를 맺어 C985제품의 하드웨어 인코딩을 지원하는 XSplit, Dwango사의 niconico생방송만을 위해 XSplit기반에서 커스텀화된 무료툴 Niconico Live Encoder, 전 세계적으로 거의 모든 동영상 제공기기들은 이걸 사용하고 있다고 과언이 아닐 정도로 쓰이는 FFmpeg, 하나같이 강력하며 편하게(FFmpeg제외) 쓸 수 있는 툴입니다. 각 특징들을 밑의 표로 정리하였으니 참조바랍니다.


A. 상용/무료 범용 전문툴 종류
OBS FMLE XSplit NLE FFmpeg
Language Multi-L Multi-L Multi-L 日本語 English
Interface GUI  GUI GUI GUI Command
Price Free Free Non-free Free Free
Maximum
frame rate
60 60 60 No-limit No-limit
Maximum bandwidth No-limit No-limit No-limit No-limit No-limit
Well-known
Video Codec
H.264 MPEG4
H.264
WebM
H.264
H.264 H.264
Well-known
Audio Codec
MP3
AAC-LC
MP3
AAC-LC
HE-AAC
AAC-LC
HE-AAC
AAC-LC AAC-LC
HE-AAC
Audio-only
Streaming
X X
Image
Display
×
Text
Display
×
Media File
Streaming
× ×
Preset

**OBS만으로 niconico live는 방송이 불가능하며, 다른 툴과 조합해서 사용해야 합니다.
그리고 OBS의 AAC코덱(libfaac)의 버그로 96kbps이하는 사용이 불가능하며, 이는 극히 제한적인 비트레이트만 사용가능한 nico生에서는 부적합합니다.


B. Open Broadcaster Software를 사용한 RTMP기반 생방송

무료툴중에 사용하기 비교적 편하고 범용적으로 사용가능한 OBS로 방송하는 법을 알아보겠습니다. 우선 방송하는 모습을 보자면 밑의 사진과 같은 느낌으로 여러 소스를 활용해서 한 화면에 동시에 표시시키거나 크로마키 또는 이미지 등을 활용한 벽지디자인 기법까지 사용하여 송출도 가능합니다.

밑의 스크린샷의 직사각형의 검은 화면 전체에 포함된 3개 소스가 한 장면으로서 송출됩니다.



설정에서 각 서비스별로 서버설정, 스트림키, 인토딩설정, 장면설정 등을 프로파일로 미리 저장을 하면 각기 다른 서비스를 쓰더라도 언제든지 편리하게 스위칭하여 시작하는 것이 가능합니다.


참고기사로 보면 많이 도움됩니다. (일본어)
http://gae.cavelis.net/howto/#!encoder_obs
http://pecardy.vanu.jp/?%C0%DF%C4%EA%2FFLV%C7%DB%BF%AE#d78586ac
http://looooooooop.blog35.fc2.com/


순서도

 한번만 설정해두면, 나중에는 시작/종료만으로 간단히 할 수 있습니다. youtube, ustream, twitch 중에서 후자 2가지가 시작/종료만으로, youtube는 일정을 사전에 만들고 OBS측에서 스트림데이터를 보내고서야 방송이 시작됩니다.


1. OBS에서 설정탭의 설정.

2. 설정창에서 일반탭 화면에서 필요시 언어를 한국어로 변경, 사용할 프로파일 이름을 지어주고 저장(예: youtube)

3. 인코딩 탭
비디오 : x264 또는 quick sync, i5이상일 경우 x264 권장. NVENC는 화질/효율상 비권장.
품질기준은 계산하기 어려우므로 비트레이트 2500~4000k 및 버퍼는 비트레이트의 x2
권장 set : Default. Ultra/Super/Very fast는 시간상 거의 차이가 없어 default를 권장합니다.

오디오 : AAC stereo, 소스에 따라 44.1kHz/48kHz 선택, 품질 96k~128k 권장.

각 코덱별 비트레이트 권장
MP3 96kbps이상
AAC-LC 80kbps이상
HE-AAC 48kbps ~ 128kbps
HE-AAC v2 32kbps ~ 48kbps 이하 (음성을 22kHz로 낮추면 24kbps ~ 32kbps)

참고) 압축률대비 음질비교 : 44.1kHz MP3 128kbps = AAC-LC 64kbps = HE-AAC v2 48kbps
HE-AAC v2 는 AAC-LC + SBR + PS 3개 기능이 합쳐져 이루는 코덱입니다. AAC-LC가 우리가 일반적으로 부르는 "AAC"이며, 여기에 SBR기능이 추가되면 HE-AAC v1이라 부르며 압축효율이 향상됨에 따라 스테레오 64kbps에서도 기존 일반 MP3 코덱의 128kbps 스테레오에 준하는 음질을 보여줍니다. 여기에 극히 낮은 비트레이트까지 들을만한 음질로 압축을 하기위한 기술로  PS 기능까지 추가되면 비로소 v2라 불리며 32kbps 스테레오에서도 MP3 128kbps에 준하는 압축률/음질을 들을 수 있습니다. 그렇다면 "무조건 HE-AAC v2 192kbps수준으로 압축하면 좋지 않느냐?" 라고 생각할 수 있지만, 꼭 그렇지만도 않습니다. 같은 HE-AAC v2에서 각 코덱의 세부스펙별로 다를 수 있지만 libfdk_aac의 경우 64kbps 이상부터는 PS기능이 비활성화되고 128kbps부터는 SBR기능이 비활성화되어 AAC-LC와 동일하게 압축됩니다. 이는 높은 비트레이트에서의 인코딩/디코딩 효율을 고려한 설계로 자세한 사항은 fraunhofer사 홈페이지의 FDK-AAC코덱 기술문서에 나와 있습니다.

HE-AAC 코덱은 라이센스문제로 OBS에 기본적으로 포함이 안되어있지만, FFmpeg 커맨드라인툴을 직접 빌드하거나 기타 상용소프트에는 포함되어 있을 수 있습니다.

**OBS의 AAC코덱(libfaac)이 96k미만으로 설정해도 96k수준으로 인코딩되는 버그가 있었으니, 가급적 최신버전으로 받아서 사용하시길 권장합니다.


4. 방송설정
모드 : 실황으로 방송
방송 서비스 : 2번에서 지정한 프로파일로 지정

서버 : Primary Youtube Ingest Server
백업서버까지 쓰려면(스트림키는 동일) OBS를 두 개를 기동해서 쓰거나, FFmpeg.exe 커맨드라인에서 파이프를 사용하여 2개 서버로 동시에 송출해야 합니다. 보통 그렇게까지 할 필요는 없습니다.

재생경로/스트림 키 : 각 서비스에 로그인하여 스트림키를 받아와 복사해줍니다.
스트림키는 RTMP 서비스에서 굉장히 중요한 정보입니다. ID/PW 입력없이 이 키값만 알면 해당 서비스서버로 언제 어디서든 누구든지 스트림데이터를 보내서 멋대로 방송을 개시할 수 있으므로, 타인에게 절대 알려줘서는 안되는 값이므로 주의해 주십시요. 이 키 값은 각 서비스사의 설정 화면 등에서 확인할 수 있습니다.

자동 재접속 시도 체크
자동 재접속 시간 초과와 지연(초단위)는 기본상태로 두셔도 됩니다
네트워크 지연시 화질을 낮춤 : 필요시 체크
파일로 저장 : 3번 인코딩설정에서 지정된 수준으로 압축되는 실시간 영상을 저장
(이하 항목 생략)


----------------------------------------------------------------------------------------------------------------------------------------
- youtube 에서 스트림키 받아오는 방법

youtube의 경우, 먼저 실시간이벤트를 만들면서, "정보 및 설정" 탭에서 유형을 맞춤설정으로 일정을 만들경우
다음 화면에 뜨는 인코더 설정에서 밑의 예시와 같은 전송률 프로파일을 만들면 키값을 볼 수 있습니다.



- Ustream.tv 에서 스트림키 받아오는 방법

로그인-우측상단 아이콘 클릭 후 채널설정 - 좌측메뉴 채널설정의 자신의 ID클릭  - 원격



- Twitch.tv 에서 스트림키 받아오는 방법

로그인 - 우측상단 ID클릭 - 계기판(대시보드) - Stream Key - 암호보기


----------------------------------------------------------------------------------------------------------------------------------------




5. 비디오
사용자정의 - 해상도 설정
(해상도를 축소할 경우) 필터Lanczos 설정

초당 프레임수 : 페이지의 "RTMP를 사용하는 서비스들" 테이블 참조하여 설정


6. 오디오
데스크탑 오디오장치 : 기본 장치
마이크/보조 오디오 장치 : 필요시 설정
기타 설정은 기본으로 두는 것이 좋습니다.

7. 고급

다중쓰레드 최적화사용 반드시 체크
x264 CPU 설정 : very fast 권장
인코딩 프로파일 : high 권장, main은 구형 스마트폰까지 시청 지원가능성 있음.
키프레임 간격 : 2frame
CFR 사용 체크

x264 인코더 사용자 정의 : 필요시 ffmpeg의 각종 커맨드라인 옵션설정기능.
VBR 최고점과 버퍼량 설정 등 압축시 세세한 옵션을 직접 지정가능합니다. 자세한 사항은 ffmpeg x264관련
설정을 참조하거나 이 페이지(영어)를 참조하여 사용하실 수 있습니다. 보통은 안해도 됩니다.



8. 마이크 노이즈 게이트 : 마이크를 쓸 때 설정하면 됩니다



9. 확인/적용하여 프로파일 저장



10. OBS메인화면

장면목록 : 장면 추가, 적당한 장면이름을 만들어줍니다 (여기서는 Scene 1)

소스목록 : Scene 1에서 쓸 소스목록을 추가해줍니다. 여러가지 소스를 사용할 수 있습니다.
각 소스는 만들고 난 후 해당 소스를 더블클릭하면 소스의 세부설정이 가능합니다.

윈도우 캡쳐 :  스크린캡쳐모드입니다. 창모드 상태의 윈도우를 하나 지정하여 캡쳐합니다.
모니터 캡쳐 : 모니터를 하나를 지정하여 통째로 캡쳐합니다.
이미지 파일 : 고정된 이미지 파일을 하나 불러들여 띄워둡니다
이미지 슬라이드 쇼 : 여러 이미지파일을 시간에 따라 자동으로 돌려서 씁니다.
자막 삽입 : 자막으로 각종 정보/안내사항 등을 작성할 수 있습니다.
비디오 캡쳐장치 : 캡쳐장치/카메라 입력 설정을 합니다.
게임 캡쳐 : DirectX 어플리케이션 화면을 직접 캡쳐합니다. 화면이 제대로 캡쳐가 안되는 어플은 윈도우캡쳐로 하시면 됩니다. 윈도우 캡쳐와 마찬가지로 창모드만 지원합니다.

 이 소스들은 각 생성한 장면에 종속되므로 한 장면에 한꺼번에 여러 소스를 띄워 표시하다가 다른 장면을 표시할 때 유용합니다. 실제 TV방송 등에서 방송국과 현장중계 전환이 이런 장면 전환 기능을 쓰는 것입니다.

(추후 추가항목)
- 다중 장치 연결 (복수의 카메라를 활용한 Lineout 화면 + 손배치 등)
a. 복수의 캡쳐보드
b. 복수신호입력이 가능한 캡쳐보드 DVR 시스템캡쳐보드 소개




11. 미리보기로 각 장면과 소스 테스트 후 방송시작.

12. (youtube만 해당) 방송시작 전에 일정을 만들고, 스트리밍 시작으로 활성화

13. 해당 서비스의 채널을 띄워 방송이 잘 되고있는지 확인





C. FFmpeg 커맨드라인 생방송 (고난이도)

(내용이 방대하여 시간나는대로 추가하겠습니다)

- AVISynth 필터 적용법

- 12비트 YUV420이 아닌 16비트 YUV422 색상사용의 고화질 방송방법 (통상 YUV420사용)

- 여러 CDN(Content distribution Network)서비스에 동시에 송출하기

 "D:\tool\ffmpeg\bin\ffmpeg.exe" -rtbufsize 100MB -f dshow -i video="SA7160 PCI, Analog 01 Capture":audio="SA7160 PCI, Analog 01 WaveIn" -threads 0 -vstats -report -r 30 -s 1280x720 -sws_flags lanczos -pix_fmt yuv422p -b:v 3000k -vcodec libx264 -preset veryfast -profile:v high422 -x264opts "deblock=0,0:partitions=i8x8,i4x4,p8x8,b8x8:me=hex:subme=2:merange=16:scenecut=40:qcomp=0.6:qpmin=10:qpstep=4:bframes=2:ref=1:direct=spatial:trellis=0:b-pyramid=normal:mixed-refs=0:weightb=1:8x8dct=1:no-mbtree=1:ratetol=10:weightp=0:ipratio=1.41:pbratio=1.25:keyint=350:min-keyint=90" -async 100 -acodec libvo_aacenc -ar 44100 -ab 128k -ac 2 -f flv pipe: | ffmpeg -re -r 30 -i - -codec copy -f flv "rtmp://live-sel.twitch.tv/app/live_12345678_streamkeyoffair" -codec copy -f flv "rtmp://1.1234567.fme.ustream.tv/ustreamVideo/1234567/streamkeyoffair flashver=FME/3.0\20(compatible;\20FMSc/1.0)" -codec copy "D:\Streaming\ffmpegoutput20151022003741.mp4"  

코드의 예시
영상해상도 : 1280x720p30
영상 코덱/비트레이트  : x264 YUV422 ABR 3000kbps, buffer 6000kbps
음성 코덱/비트레이트 : AAC-LC 44100Hz 128kbps Stereo
directshow 입력 : SC-512N1-L/DVI 캡쳐보드 영상/음성
스트리밍 발신 : Ustream, Twitch 동시발신, (아프리카tv경우도 현재 추가가능)
스트리밍 저장 : D:\Streaming\날짜.mp4
Resize 방법 : Lanzcos
Deblock 필터 활성화

이 방법은 어지간해서는 사용할 일이 없을 것인데, 소개를 하고자 합니다. 예를들어 한 소스를
가지고 youtube에 방송하면서 동시에 ustream에도 방송하는 것을 말하는 것인데, 보통 youtube 에 따로, ustream에 따로 프로그램 또는 웹페이지를 띄워 송출한다고들 생각하실 겁니다. 간단히 봤을 때 누구나 그렇게 생각할 수 있고, 보통 이런 방법을 씁니다. 그런데, 이 방법은 매우 비효율적이며, H.264로 인코딩하는 것만으로도 컴퓨터의 자원을 상당히 소모하는데, 고해상도로 가면 한 곳으로만 방송을 해도 CPU가 7~80%에 육박할 정도로 힘들어 합니다.  한 곳으로만 송출도 이런데 두 번 인코딩해서 송출할 경우, 100%을 찍고 화면이 끊기게 될 것입니다.

그럼 소스는 하나인데, 인코딩 된 결과를 반복해서 인코딩하지 말고 복제해서 두 군데로
송출하면 되지않느냐..?

 맞습니다. 실시간으로 인코딩되는 1개 소스를 예를들어 3곳의 서버로 송출할 때, 1번만
인코딩 후, 메모리상에서 데이터를 3곳의 서버로 복제만 하여 나가기 때문에, CPU의 부담이
절약됩니다. 그림으로 표현하자면...


OBS 프로그램을 일일이 3개 띄워서 인코딩하는 첫번째 방법과...



FFmpeg 커맨드라인으로 한번만 인코딩 후에 3곳의 서버로 동시에 송출하는 방법입니다

---------------------------------------------------------------------------------------------------------------------
상황 : PS4 게임의 1080p30f 영상을 캡쳐보드로 받아다가 youtube, ustream, twitch로 동시에
방송를 원한다.

준비된 PC사양 :
CPU : Intel Core i3-4130 3.4GHz
RAM : DDR3 4GB
GPU : none
HDD : 2개 HDD
- DISK1 : 160GB, OS용. 데이터용 디스크는 파티션분리가 아닌 별도디스크 사용
- DISK2 : 500GB, 녹화데이터 저장용. OS용 디스크는 파티션분리가 아닌 별도디스크 사용

H.264 preset : very fast
** H.264 preset을 medium 이상 slow쪽으로 갈 수록 복잡하고 느리게 인코딩하며, CPU사용률이 크게 증가합니다. 그 외 preset이 아닌 각 세부옵션 조절로 인코딩 복잡도를 올리면 마찬가지로 CPU사용률이 밑의 결과와 상이할 수 있음을 염두해두십시요

테스트 : 임의의 프로그램을 사용하여 1개 송출시 CPU사용률을 실제 방송 전에 체크. 위의
사양으로 QSV가속 없을 시 사용률은 비트레이트(움직임)에 따라 약 40~80% 사용률.
QSV 가속 사용시 10~20% 사용률을 보였음

송출방법1 : OBS 프로그램을 3개 띄워 각각 송출
송출방법2 : FFmpeg launcher (일본어)나 FFmpeg 커맨드라인으로 동시에 송출

CPU 사용률 ( 방송품질이 원활할 경우 O, 도저히 불가능할 경우 X)
송출방법1 :
- QSV가속 없이 3개 인코딩 후 송출시 CPU 100%. 실질적인 원활한 방송불가 (X)
- QSV가속사용, 2개 CPU담당, 1개 GPU 담당 인코딩 후 송출시 CPU 100%, GPU 100% (X)
- QSV가속사용, 1개 CPU담당, 2개 GPU 담당 인코딩 후 송출시 CPU 70~90%, GPU 100% (X)
- QSV가속사용, 0개 CPU담당, 3개 GPU 담당 인코딩 후 송출시 CPU 10~20%, GPU 100% (X)

송출방법2 :
- QSV 가속없이 1회 인코딩 후 스트림복제송출시 CPU 40~80% 유지. 원활한 방송가능 (O)
- QSV 가속사용 1회 인코딩 후 스트림복제송출시 CPU 10~20% 유지. 원활한 방송가능 (O)


결론 : 송출방법1은 사실상 원활한 방송 불가능. 방법2를 통해 성공적으로 방송가능.

--------------------------------------------------------------------------------------------------------------------------

보다 사양이 높은 CPU를 사용한다면, 못할 법도 없지않아 있습니다. i7급일 경우 1080p 미만 이라면 2회 동시 인코딩까지는 커버할 수도 있을 수 있지만, 그 이하의 사양을 사용할 경우 보다 효율적인 방법을 사용하는 것이 좋습니다.

나는 예산이 넉넉하고 복잡하게 생각하기 싫다라는 분이 있다면 소켓 1150의 Core i7 따위의 중저가형 아닌 소켓 2011의 Xeon E5-1680 V2 또는 하이퍼쓰레딩 없는 Xeon E5-24xx, 하이퍼쓰레딩이 있는 Xeon E5-26xx 시리즈를 2개 꽂을 수 있는 보드와 함께 2개 CPU를 구매 하시면 아무 생각할 필요없이 원하는 모든 상황이 커버가능하며, 심지어 4K 영상도 원활하게 커버가 될 것입니다. 대신 싸게 구매해도 경차 새 것 한 대 값은 나가겠지요..





D. PC없이 RTMP client를 지원하는 Professional 장비를 사용하여 방송하는 방법

 사실 프로의 세계에서는 PC를 써서 위와 같이 복잡한 작업은 일일이 하지 않고, 전문 장비를 통해 쉬운 인터페이스를 사용합니다. 현장에서 이런 복잡한 설정할 여유도 없을 뿐더러 돌발사태가 났을 때를 대비한 백업장비 등을 활용하는 게 보통이지요. 여기서는 PC없이 standalone형태의 장비로 미리 조정된 세팅값을 기반으로 방송/녹화/중단 등을 할 수 있는 회사를 소개하자면, Viewcast, AJA, Blackmagic, Matrox, 그 외 필자도 잘 모르는 전문회사들이 많습니다. 대부분 프로 업무용인 관계로 가격도 취미용으로는 넘보기 힘든 경우가 대부분이며, 이베이 중고시장 등에서 한 두 세대 이전의 구형을 값싸게 구해서 써볼 수나 있는 경우가 태반입니다. 이 분야에 발 담그고 하는 사람들을 대상으로 하는 기사는 아니므로, 비교적(?) 싼 장비를 소개하자면, 2가지 정도가 있습니다. 각각 100만원, 70만원가량하며, 출시된 지 1년 약간 지난 제품들이라 중고로 싸게 구입하기는 현시점에서 사실상 힘들고, 신품을 구입하는 것이 좋습니다.

a. Matrox Monarch HD
b. CEREVO liveshell PRO

이 기기들은 소스를 입력하고 인터넷 케이블을 연결 또는 무선연결 후 간단한 설정을 통해 미리 세팅만 끝내면, 시작명령 하나만으로 방송시작/녹화/중단이 가능합니다. 크기도 작고 휴대형이라 굉장히 편리한 점이 특징이지요. 단지, 이 기사를 보러오는 분들 대부분은 게임 등을 방송하기 위해서임을 감안하면 이 제품들은 표준해상도 480i, 720p, 1080i, 1080p 이외의 해상도는 지원을 안하기에 부적합할 수도 있습니다. 그러한 점을 감안하여도 한번 설정 후 연결만 해다가 시작/정지만 컨트롤만 하는 편리성을 보입니다. 중고로 싸게 매물이 나온다면, 제가 꼭 구입하고 싶은 물품들 중 하나이지요.


2015년 7월 13일 추가
2015년 5월 스카이디지탈사에서 출시한 Supercast T3 HDMI USB 2.0 제품으로 저렴한 가격에 RTMP 다이렉트 방송이 가능해졌습니다. 이로서 프로 업무용 장비를 구매하지 않고도 단돈 17만원 이하에 720p60 720p30 (죄송합니다 30프레임이었습니다)까지 방송이 가능해졌습니다. 관련 리뷰는 따로 포스팅하였습니다.


4. 결론

이렇듯 국내서비스 말고도 해외의 여러 방송서비스를 사용하는 방법을 알아보았습니다. 여러분들이 컨텐츠를 가지고 있다면, 국내만이 아닌 세계를 대상으로 실시간 방송하는 것도 어떠신지요.

잘못된 점, 의문나는 점이 있으면 밑의 코멘트에 의견 등 적극 환영합니다.

8 comments:

  1. 큰 도움이 되었습니다. 고맙습니다.
    하나 궁금한 사항이 있습니다. 오디오 설정 관련부분입니다.
    아프리카 채널을 제외하곤 오디오 비트레이트가 대부분 192kbps 이하로 지원하는 것으로 알고 있습니다.
    RTMP를 사용하는 서비스들중에서 오디오 비트레이트를 256kbps 이상 지원하는 서비스는
    아프리카를 제외하곤 없는것인가요?
    고수님의 가르침을 기다리고 있겠습니다. 감사합니다.
    - 이메일: fe@soundl.ly

    ReplyDelete
    Replies
    1. 방문 감사합니다. 말씀대로 최근 다시 확인해 봤을 때 대부분은 AAC 128k~160k가 최대비트레이트로서 서비스하고 있었습니다. 팟플레이어와 아프리카가 192k까지 지원하고 있고, 이 정도 수준은 MP3건 AAC건 귀로 듣는 것이 아닌 스펙트럼을 봐도 음질차이가 거의 없습니다. youtube가 실시간 스트리밍이 아닌 업로드 영상으로는 2015년 1월 현재 스테레오가 384k, 5.1채널이 512k까지 지원하긴 합니다만, 스트리밍이라면 max가 128k입니다. 혹시 음악방송이 목적이시라면 유료로 wav를 48kHz까지 그대로 쏘는 게 가능합니다. http://source-elements.com/source-connect/examples/

      영상+음성에서 음성을 고음질로 하시고 싶으시면, 현재는 CDnetworks 등의 유료 서비스를 이용하시거나, 직접 스트리밍 서버를 만들어 송출하는 방법밖에는 없습니다. 워낙 서비스가 많다보니 찾다보면 있을 법하기도 한데, 안타깝게도 저는 못찾았습니다. 영상/음성을 각각 최대치를 정하기보다는 좀 유동성있게 영상퀄리티를 떨어뜨리고 음성을 강화시키는 설정이 있었으면 좋을텐데 말이죠..

      Delete
  2. ffmpeg로 다중 스트리밍 하는 방법이 뭔가요...
    프로그램 자체가 gui가 아니다보니 전혀 모르겠네요 ㅠ.ㅠ;

    ReplyDelete
    Replies
    1. 그림에서 설명하는 대로 한번만 압축해다 여러곳으로 송출하는 방법입니다. 한번 만들어두면 계속 쓸 수 있지만 GUI가 아닌 CLI 직접 해야하는 방법이다보니 어려워서 추천하지는 않습니다.

      Delete
  3. 좋은글 잘 읽었습니다.
    혹시 ffmpeg 로 원소스 멀티캐스팅 하는 CLI 명령어 대략적으로 보여주실수 있으신가요?
    참고 좀 해보고 싶습니다.

    ReplyDelete
    Replies
    1. 방문 감사합니다.
      내용에 Ustream과 Twitch의 예시를 추가하였습니다만 제대로 테스트 된 코드가 아니라서 정상작동이 안될 수도 있습니다. 만약 작동 안된다면 저 코드에서 조금만 수정하면 될 것입니다.

      Delete
    2. 답변 감사드려요. 혹시 시간 나시면 유튜브에 ffmpeg 로 방송하는 코드도 넣어주시면 안될까요.
      트위치에 올리는 코드는 많이 있던데 유튜브에 올리는건 거의 없거나 잘 안되더라구요.

      ffmpeg -f x11grab -s "1920x1080" -r "15" -i :1.0 \
      -f alsa -ac 2 -i pulse -vcodec libx264 -crf 30 -keyint_min 0 -g 60 -maxrate 700k -bufsize 1 \
      -preset "fast" -s "1280x720" \
      -vol 11200 -acodec libmp3lame -ar 44100 -threads 0 \
      -f flv "$URL"

      이렇게 하니까 올라가긴 하던데 제대로된 온라인 스트림은 안되더라구요.ㅎㅎ

      다시한번 감사드립니다.

      Delete
    3. 유튜브도 코드는 다를 바 없습니다. 스트림주소와 스트림키를 넣어 시작하면 되지만, 반드시 유튜브 설정페이지에서 라이브 이벤트 예약/시작을 먼저 해주고 CLI 커맨드를 실행해야하는 점이 다른 서비스와 다릅니다. 그냥 커맨드입력으로는 방송활성화 되지 않습니다. 간단하게 테스트하기로는 OBS 등의 GUI툴로 먼저 순서를 연습하신 후에 CLI툴로 시도해보시길 권장합니다.

      그리고 질문해주신 코드처럼 배치파일에 변수화시켜서 다루면 오타낼 일 없이 손쉽게 바꿀 수 있을겁니다.

      여기를 참조해보시면 같은 것을 알 수 있습니다.
      https://gist.github.com/olasd/9841772

      Delete