미디어서버를 이용해서 동영상 서비스를 제공하고 싶을 때 문제가 되는 부분은 동영상 주소가 웹 소스 상에 그대로 노출된다는 점이다. 예를 들어, 아래 코드를 보자.
<a href="http://somehost/vod/_definst_/mp4:0000/00/1/1_PC1.mp4/playlist.m3u8">
조금만 지식이 있다면 위 코드를 이용해서 아무 곳에서나 동영상을 플레이할 수 있게 된다. 자유롭게 사용할 수 있도록 해 주는 것이 문제가 되지 않는다면 상관없지만, 만약 동영상 컨텐츠를 허용된 방법 이외의 다른 방법으로 재생하거나 동영상 자체를 다운로드 할 수 없도록 하고 싶다면 별도의 방안을 강구해야 한다.
DRM을 사용할 수 있겠지만 DRM 솔루션 자체가 비싸고 플레이어를 별도로 구현해야 한다는 단점이 있다. 또한, 디바이스에 따라 플레이어를 커스터마이징 할 수 없는 경우가 발생할 수도 있다. 그래서 생각해 볼 수 있는 것이 아래와 같이 동영상 주소를 시간에 따라서 다르게 생성해주는 것이다.
<a href="http://somehost/vod/_definst_/E14c1d156a...무지긴문자열...72ea34e4/playlist.m3u8">
위 값을 생성하는 방식에 따라 원하는 기능을 구현할 수 있다. 예를 들어, 암호화할 때 현재 시간 값을 포함시켜서 일정 시간이 지나면 값이 무효화되도록 구현할 수 있다. 이 경우, 위 주소를 복사해서 사용하더라도 일정 시간이 지나면 더 이상 동영상 재생을 할 수 없게 된다.
남은 작업은 Wowza 서버에서 암호화된 주소 값을 인식하도록 하는 것이다. Wowza 서버는 서버 상에 커스텀 모듈을 설치할 수 있도록 지원해주고 있는데, 이 커스텀 모듈을 사용해서 위 기능을 구현할 수 있게 된다. Wowza가 제공하는 서버 API 중 하나인 IMediaStreamNameAliasProvider2 인터페이스를 이용하면 클라이언트가 요청한 변경된 스트림 이름을 실제 스트림 이름으로 변경해 줄 수 있다. 아래 코드는 이 인터페이스를 이용한 구현 예를 보여주고 있다.
public class RaconAliasModule extends ModuleBase implements
IMediaStreamNameAliasProvider2 {
public void onAppStart(IApplicationInstance appInstance) {
appInstance.setStreamNameAliasProvider(this);
getLogger().info(
"RaconAliasModule is registered to " + appInstance.getName());
}
public String resolvePlayAlias(IApplicationInstance appInstance,
String name, IClient client) {
return resolveAlias(name);
}
private String resolveAlias(String name) {
// name이 암호화된 값
RequestStreamName rsn = convertAliasToRequestStreamName(name); // name을 복호화 처리
if (rsn.isTimeout()) {
return null; // 유효하지 않은 name값. null 리턴
}
return si.getRealStreamName(); // 실제 스트림 이름 리턴
}
public RequestStreamName convertAliasToStreamInfo(String name) {
// name을 복호화 처리
...
}
public String resolvePlayAlias(IApplicationInstance appInstance,
String name, IHTTPStreamerSession httpSession) {
return resolveAlias(name);
}
public String resolvePlayAlias(IApplicationInstance appInstance,
String name, RTPSession rtpSession) {
return resolveAlias(name);
}
.... // 동일하게 구현
}
모듈을 구현한 클래스를 구현했다면, 해당 모듈을 jar 만들어서 [wowza디렉토리]/lib에 복사한다. 이 때, 모듈에서 함께 사용하는 외부 jar 파일도 함께 복사해 주는 것도 잊지 말자.
lib에 복사했다면 위 모듈을 적용하고 싶은 Wowza 어플리케이션의 Application.xml 파일에 다음과 같이 Module 정보를 추가해 주면 된다.
<Module>
<Name>customaccesscontrol</Name>
<Description>CustomAccessControl</Description>
<Class>com.custom.wowza.module.CustomAliasModule</Class>
</Module>
모듈을 개발하려면 Wowza 관련 jar 파일이 필요한데, 이 jar 파일들은 [wowza디렉토리]/lib에 위치한다. 이 파일들을 별도로 클래스패스로 잡기 귀찮다면 Wowza IDE를 이용해도 된다. Wowza IDE에 대한 자료는 아래 참고자료 링크를 확인해보기 바란다.
참고자료
- IMediaStreamNameAliasProvider2 Interface:
http://www.wowza.com/forums/content.php?205-IMediaStreamNameAliasProvider2-interface - Wowza 모듈 개발 위한 IDE:
http://www.wowza.com/media-server/developers#wowza-ide