-
영상 스트리밍 서비스 ( ) - 2009/09/08
안녕하세요. 19-1기 임승훈입니다.
이번에는 영상 스트리밍 서비스와 그 방식에 관해 간단한 설명을 하겠습니다.^^
우선 스트리밍 서비스는 1995년 리얼네트워크사가 개발한 리얼오디오에서 처음으로 선보였습니다. 스트리밍 서비스란 콘텐츠를 하드디스크 드라이브에 다운로드 받아 재생하던 것을 다운로드 없이 실시간으로 재생해 주는 기법을 말합니다. 전송되는 데이터가 마치 물이 흐르는 것처럼 처리된다고 해서 '스트리밍(streaming)'이라는 명칭이 붙여졌습니다.
스트리밍과 일반 http 프로토콜의 차이는 다음과 같습니다. 스트리밍은 클라이언트의 하드디스크에 파일을 위치 시키지 않으며 콘텐츠를 실시간으로 재생합니다. 또한 원하는 시간으로 탐색할 수 있는 특징이 있습니다. 반면 http 프로토콜을 이용한 콘텐츠 재생은 파일이 일정량 이상 다운로드 되지 않으면 재생이 불가하고 완전히 다운로드 되기 전까지는 원하는 시간으로의 탐색이 불가능 합니다. 또한 스트리밍 서비스는 무단 다운로드를 방지할 수도 있어 보안이 용의하여 월드와이드웹의 콘텐츠 서비스에서 많이 사용되고 있습니다.
스트리밍이 동작하려면 데이터를 수신하고 있는 클라이언트 측은 데이터를 모으고, 그 데이터를 사운드나 그림으로 변환해 주는 응용프로그램에 끊임없이 보내줄 수 있어야 합니다. 만약 클라이언트가 데이터를 수신하는 속도가 너무 빠르면 여분의 데이터를 버퍼에 저장하면서 동시에 스트리밍하게 됩니다. 그러나 데이터 수신 속도가 빠르지 않으면 데이터의 표현이 매끄럽지 않게 됩니다.
하지만 현재 인터넷회선의 속도 증진과 서버 및 컴퓨터 그리고 OS 및 솔루션, 코덱들이 고루 발전함에 따라 그러한 문제점들은 차츰 사라져가고 있습니다.
스트리밍 서비스는 압축(encoding)된 콘텐츠를 작은 단위(패킷)로 쪼갠 다음, IP에 연속적(Streaming)으로 전송하고, 이를 원격지의 사용자의 단말기(PC)에서 다시 연속적으로 재생(조합,압축해제-Decoding)하여 콘텐츠를 서비스 받을 수 있게 되는 것입니다.
이렇게 작은 단위(패킷)로 쪼개서 IP에 연속적으로 전송하기 위해서는 스트리밍 서버가 필요합니다. 스트리밍서버에서는 콘텐츠를 정해진 위치를 찾아 패킷단위로 전송해주어야 하고, 네트워크의 트래픽 증가를 제어하며 안정적인 서비스를 제공해야 합니다. 이러한 기능들을 담당하는 것이 바로 스트리밍 솔루션입니다.
스트리밍 솔루션의 기능으로는 유니캐스트, 멀티캐스트, 브로드캐스트를 통한 패킷 전송, 네트워크 트래픽의 제어, 콘텐츠관리 등 서버의 안정성과 관리자의 편의성을 고려하여 제작됩니다.
스트리밍 서버의 OS의 종류로는 Windows Server, LINUX, Solaris 가 있습니다.
스트리밍 솔루션의 종류로는 대표적인 예가 Windows NT,2003 Server와 함께 운영되는 Windows Media Service(이하 WMS)가 있습니다. WMS는 사용하기 편리한 GUI를 제공하며, 주문형 게시지점을 생성함으로서 VOD(Video On Demand) 스트리밍 서비스를 제공합니다.
콘텐츠를 라이브로 브로드캐스트하려면 스트림을 인코더에서 Windows Media 서버로 푸시(push)할 것인지 클라이언트(Windows Media 서버 또는 플레이어)가 스트림을 풀(pull)하도록 할 것인지 선택해야합니다.
자신의 현재 상황에 맞는 방법을 선택하면 되겠죠.^^
우선, 푸시(push) 방식에 대해서 설명드리겠습니다. 인코더가 방화벽 안쪽에 있거나 인코더를 출발점으로 하여 연결을 시작하려는 경우 인코더에서 스트림을 푸시(push)하는 것이 좋습니다. 예를 들어, 갑자기 사장님 직원들에게 이야기하는 내용을 스트리밍해야 하는 경우를 가정해 보겠습니다. Windows Media 서버는 회사 방화벽 밖의 원격 위치에 있습니다. 게다가 서버 관리자는 아무 것도 전달 받지 못한 상태입니다. 인코더에서 스트림을 푸시(push)하면 방화벽을 통과하여 스트림을 얻을 수 있으므로 사장님의 요구를 충족시킬 수 있으며 서버 관리자를 급히 호출하지 않아도 됩니다. 푸시(Push) 배포는 Windows .NET Server 2003과 함께 제공되는 Windows Media 서비스 9 시리즈에서만 사용할 수 있습니다.
아래는 푸시(push) 방식에 관한 간단한 샘플 코드입니다.
// Pushing a Stream to a Windows Media Server
try
{
// Configure the encoding session including the input sources and profile.// Create a push distribution object.
IWMEncPushDistribution PushDist = (IWMEncPushDistribution)Encoder.Broadcast;// Declare variables.
string sServerName;
string sPubPoint;
string sPubTemplate;
string sBrdcstInfo;
string sMyNSCFile;
string sMyNSCURL;
string sMyASXFile;// Provide values for the following variables.
sServerName = "211.189.127.80:8888";
sPubPoint = "test";
sPubTemplate = "EXISTING_PUBLISHING_POINT_NAME";
sBrdcstInfo = "NAME OF THE BROACAST INFORMATION FILE";
sMyNSCFile = "NAME OF THE NSC FILE TO CREATE";
sMyNSCURL = "URL TO THE NSC FILE YOU CREATE";
sMyASXFile = "NAME OF THE ANNOUNCMENT FILE";
// Specify the server name, publishing point, an existing publishing
// point, and then generate an NSC file and announcement file.
PushDist.ServerName = sServerName;
PushDist.PublishingPoint = sPubPoint;
//PushDist.Template = sPubTemplate;// Specify whether to destroy the publishing point.
PushDist.AutoRemovePublishingPoint = false;// Initialize the encoding session.
Encoder.PrepareToEncode(true);// Generate the announcement file.
//PushDist.GenerateMulticastInfoFile(sMyNSCFile);
//PushDist.GenerateAnnouncementFile(sMyNSCURL, sMyASXFile);// Start encoding.
Encoder.Start();
}catch (Exception ex)
{
// TODO: Handle exceptions.
MessageBox.Show(ex.Message + ":" + ex.StackTrace.ToString());
}
풀(pull)방식은 Windows Media 서버를 사용해 스트림을 말그대로 풀(pull)하게 됩니다. 우선, 배포 서버가 여러 개이고 모든 연결이 서로 다른 시간에 이루어질 경우 각 서버에서 스트리밍할 준비가 완료되면 인코더와의 연결을 시작할 수 있습니다. 다음으로, 서버와 인코더 간의 대역폭 사용을 최소화하는 게 중요한 경우 서버에서 풀(pull)하는 것이 좋습니다. 예를 들어, 서버 관리자는 게시 지점을 추가하고 클라이언트가 요청하면 게시 지점이 자동으로 시작되도록 구성할 수 있습니다. 이렇게 하면 첫 번째 클라이언트가 연결할 때까지 서버와 인코더의 연결이 시작되지 않습니다. 따라서 서버와 인코더 간에 대역폭이 불필요하게 사용되지 않습니다. 이 시나리오는 Windows .NET Server 2003과 함께 제공되는 Windows Media 서비스 9 시리즈에서만 사용할 수 있습니다. 마지막으로, 서버가 방화벽을 사용하는 경우에도 서버에서 풀(pull)하는 것이 좋습니다. 예를 들어, 회의 때 이벤트를 스트리밍해야 하기 때문에 공용 네트워크에서 인코더를 설정한다고 가정해 보겠습니다. 보호된 네트워크의 배포 서버로 스트림을 가져오면 서버 관리자는 방화벽을 통해 스트림을 풀(pull)할 수 있습니다.
아래는 풀(pull) 방식에 대한 간단한 샘플 코드입니다.
// Pull a Stream to a Windows Media Server
try
{
// Create an IWMEncBroadcast object.
IWMEncBroadcast Brdcst;
Brdcst = Encoder.Broadcast;// Retrieve the port number. The port number defaults to zero.
int iPortNum;
iPortNum = Brdcst.get_PortNumber(WMENC_BROADCAST_PROTOCOL.WMENC_PROTOCOL_HTTP);// Set the port number.
Brdcst.set_PortNumber(WMENC_BROADCAST_PROTOCOL.WMENC_PROTOCOL_HTTP, 2356);
}catch (Exception ex)
{
// TODO: Handle exceptions.
MessageBox.Show(ex.Message + ":" + ex.StackTrace.ToString());
}
이번 AITV 프로젝트에서는 방송자 측에서 인증과정의 복잡함을 제거하기 위해 풀(Pull) 방식을 채택하였으며, 방화벽은 설정을 통해 해당 Port만을 접근 가능하도록 설정하였습니다.- TRACKBACK : http://www.swssm.org/trackback.php?id=344
- [prev] ... 1 ... [next]
