'NetStream'에 해당되는 글 3건

  1. 2008.08.17 비디오의 제어 속성들 6
  2. 2008.08.17 비디오 프로그래밍 2
  3. 2008.07.06 FLV파일의 스트리밍 흐름과 정보
AS3.0 Cookbook/비디오2008. 8. 17. 13:02
비디오 파일을 제어하기 위해서는 몇가지 속성을 알아야한다. 이러한 속성은 대부분 NetStream()클래스를 통해서 얻게 된다.

우선 전체재생시간은 NetStream이 onMetaData() 콜벡호출시 duration이라는 값으로 알게 된다.
그리고 현재 재생시간을 알기 위해서는 NetStream의 time속성을 통해 현재 재생시간을 알 수 있다.
최초 재생할 파일을 선택하고 재생하는 것은 NetStream의 play()에서 하지만 이 후 정지와 다시 재생은 NetStream의 pause()resume()메서드를 통해 간단하게 구현할 수 있다.
게다가 NetStream에는 seek()라는 메서드를 제공하는 재생할 시간을 입력하면 그 시간과 가장 가까운 비디오 프레임을 재생하게 된다.

* seek시 가까운 프레임 헤더란?
비디오 파일은 시간 압축되어 있는 파일이다. 즉 모든 영상정보를 저장하는것이 아니고 특정 구간마다 거의 움직이지 않는 장면을 한개 저장하고 있다가 조금씩 움직이는 부분의 영상정보를 저장하여 보여준다. 즉 플래시 무비를 만들 때 배경은 1개의 프레임으로 1개의 레이어를 소비하지만 다른 움직이는 것을 여러개의 프레임을 가지고 있다. 이처럼 배경이나 큰 움직임이 있을때만 비디오 프레임이 갱신되고 이후에는 앞서 갱신된 프레임만 보여주기 때문에 정확한 seek위치가 나오질 않는다. 가령 비디오가 시작시 배경만 갱신되고 이후 특정부위만 움직일때 다시 갱신이 없다면 seek하면 제일 처음부터 재생된다는 것이다.

비디오의 사운드를 제어하기 위해서는 NetStream클래스의 속성인 soundTransform에 제어된 soundTransform를 대입한다. 이방법은 SoundChannel과 같은 방법으로 사용한다.

또한 사용자 네트워크가 느린 경우를 생각하여 NetStream에는 bufferTime이라는 속성이 있다. 이는 최초 재생시 또는 중간에 끊김 이후 재생시 설정한 시간동안 데이터를 받고 해당시간이 되면 재생하도록 하는 버퍼타임을 설정한다.

위에서 언급한 속성과 메서드만 있으면 재생/정지 , 프로그래시브바 , skip등 많은 일들을 할 수 있고 이 모든 것은 NetStream()을 통해서 이루어 진다. 아마 어도비에서도 각 클래스를 분담해서 작업했겠지만 사운드도 이처럼 조금 더 제어 클래스에 집중화 되었더라면 하는 아쉬움이 남는다...



위 무비는 재생이 끝나면 Video의 clear()메서드를 통해 화면을 지웠다. 따라서 아래의 무비처럼 재생 종료 후 영상이 남지 않는다. clear()는 removeChild()와 달리 비디오의 현재 재생화면만 지울 뿐 디스플레이 리스트에서 지워지는 것이 아니기 때문에 언제라도 play()가 이루어 지면 화면을 보여주게 된다. 시시콜콜한 소린 왜 했는가면 책(오라일리)에서 이 둘을 같은 개념으로 설명했기에 차이점을 짚어보고 싶었다...
Posted by 버터백통
AS3.0 Cookbook/비디오2008. 8. 17. 11:40
AS3에서는 Video클래스를 제공하여 FLV파일을 제생할 수 있게 한다. 단 FMS서버가 아닌 경우 대부분 프로그래시브한 FLV를 재생한다.

비디오를 재생하기 위해서는 몇가지 클래스와 콜벡함수에 대한 처리를 해주어야 한다.
우선 비디오파일이 있는 서버와의 길을 만들기 위한 NetConnection이 필요하고 이를 관리하고 제어(비디오파일)하는 NetStream 클래스를 만들어야 한다.
이 두개의 클래스로서 외부 비디오 파일과의 연결은 준비가 된 것이다.

NetConnection을 통해 흘러오는 비디오데이터를 NetStream 이 재생을 하게되는데 실제로 화면에 보여주기 위해서는 DisplayObject를 상속받은 녀석이 있어야 한다. 그것이 Video클래스이다.

다른 로더나 사운드관련 클래스들 처럼 서버와의 통신전문 클래스인 NetConnection, 실제 파일의 움직임을 관리하는 NetStream, 이들을 통해 불러들인 데이터를 담아 보여주는 Video클래스 이렇게 3개의 클래스가 기본적으로 설정되어 있어야 하며, 비디오 파일이 NetStream을 통해 흘러들어올 때 콜벡함수 onMetaData()를 호출하게 된다. 이는 자신의 총 재생시간을 duration이라는 변수값으로 호출하기 때문에 클래스에 onMetaData를 설정해 두어야 한다. 그리고 만약 FLV에 큐포인트가 설정되어있다면 onCuePoint()함수도 설정해 두어야 한다.

onMetaData의 정보
width  :  비디오파일의 폭
height  :  비디오파일의 높이
videodatarate  :  비디오 데이터 속도
cuePoints  :  큐포인트의 배열
framerate  :  재생속도
videocodecid  :  비디오 인코딩에 사용된 코덱 버전

duration  :  전체 재생시간
audiodatarate  :  오디오의 kbps(초당 킬로바이트) 속도

canSeekToEnd  :  FLV 파일이 점진적 다운로드 무비 클립의 파일끝까지 검색할 수있는 불리언값
audiodelay  :  영상과 오디오간의 지연시간을 보정한 시간


CuePoint로 설정할 수 있는 값은 4개로 한정되어있다.
name  :  큐포인트 이름
type  :  인코딩시 선택된 event나 navigation
parameters  :  변수와 값
time  :  큐포인트 위치의 시간

parameters에값이 있다면 해당 변수명으로 한 depths 더 들어간다.


* 참고로 앞서 비디오 파일 통신을 설명한 바 있다. 참고자료 보기
Posted by 버터백통
Tip And Tech2008. 7. 6. 14:01
swf에서는 flv파일을 재생할 수 있는 Video객체가 존재한다.
flv파일은 스트리밍이 가능한 파일이다 이는 곧 파일의 일부인 패킷(packet)단위의 데이터만 들어와도 재생할 수 있는 것이다.

* 스트리밍(streaming)
스트리밍의 정의는 파일의 일부만 존재하여도 재생 활용 할수 있는 의미를 갖는다.
현재 swf는 반스트리밍 파일이다 이는 root의 프레임단위 스트리밍이기 때문에 프레임에 모션을 담은 무비클립이나 loader를 통한 애니메이션이 존재한다면 재생 중 이를 다 받고 다음프레임의 정보를 다운로드하게 된다.
그렇기 때문에 모션이나 영상 개발시 프레임구조 또한 중요한 차지를 하게 된다. 이를 제외하고 swf에 포함되는 flv만 놓고 보았을 때는 스트리밍을 지원한다. 이때 파일을 제공하는 서버가 FMS가 아니면 progressive방식으로 스트리밍을 한다. progressive방식은 패킷단위로 저장된 정보순으로 재생을 하며 이를 벗어나서는(스킵) 재생할 수 없다. 하지만 FMS에서 제공하는 flv파일 재생은 nonprogressive가 된다.
nonprogressive는 클라이언트에 저장된 패킷(데이타)이 없더라도 가고자 하는 장면(시간)으로 이동 재생할 수 있는 마치 내 컴퓨터에 파일이 존재하는 것 처럼 사용할 수 있다.

참고) 영상(VOD)이나 음원(AOD)처럼 일부 패킷만으로  스트리밍이 가능하여 재생할 수(사용할 수 )있지만 zip , 이미지파일 , hwp , doc등 전체 파일포맷이 다운되어 완성되어 보여져야 하는 파일들은 스트리밍의 개념이 없다. 단 http://www.bytearray.org/에서 제공하는 ASZip같은 경우에는 압축파일이 전송된 양만큼 활용할 수 있다.


아래 그림은 swf에서 flv를 받는 과정을 그려보았다
사용자 삽입 이미지
swf에는 Video라는 객체가 있다. 이 객체는 제공받은 flv파일을 재생하기 위한 viewer인데 제공받기 까지의 과정에 2개의 필수 객체가 필요하다. 우선 어느 서버(경로)로 접근할 때 사용할 길(대역 : 帶域 )인 NetConnection 필요하다. 그리고 이를 관리할 NetStream이 필요하다. 비디오객체에서 필요한 요청을 할 때는 NetStream를 통해서 요청을 하고 NetStream는 NetConnection을 통해 서버에 던진다. 요청받은 일을한 서버는 응답을 NetConnection를 통해 되돌려주고 가만히 앉아서 기다리던 NetStream은 응답이 오자 결과를 자신을 바라 보고 있는 Video객체에 전달하도록 되어있다.

* NetConnection 역할
 - 단순히 서버와의 길을 연결하는 통신선이다

* NetStream(흐름관리자) 역할 
- 자신이 관리할 NetConnection를 정하여 서버에 요청을 하고 응답이 오면 값을 전달하는 객체이다.
- ordering(순서) : 재생 순서(시간)를 지켜서 데이터를 Netconnection을 통해 보내거나 받는다.
- jitter(지터) : 패킷과 패킷사이에 거리(시간차), 거리를 맞추기 위해서 NetStream이 조절한다.

* 비디오 객체
- 흐름을 타고 넘어온 데이터가 최종적으로 화면에 출력하는 객체

위처럼 각 역할을 맡은 객체들이 서로의 역할을 수행하면서 비디오 파일을 가져올 때 해당 파일에 필요한 메타정보를 반드시 가져와야 한다. 가령 비디오파일 확장자를 가지고는 있지만 실제 파일이 이미지나 기타 파일 포맷인지를 재생하기 전에 확인하는 절차가 필요하기 때문이다. 따라서 비디오 객체를 포함하는 클래스에는 public으로 onMetaDataonCuePoint라는 함수를 반드시 만들어 놓아야 한다.

참고) 메타데이타(부가 정보)
- 이미지의 메타데이타는 크게 아래와 같다
  [ 부가정보(이름 , 파일용량 , 가로 , 세로 , 확장자 .. ) ] [ 핵심데이터(블럭) ] [ 핵심데이터(블럭) ]..

- 동영상의 메타데이타도 이미지와 비슷한 정보를 갖는다.
  [ 부가정보(이름 , 파일용량 , 가로 , 세로 , 전체 재생길이 , 코덱...) ] [ 핵심데이터(블럭) ] ....
단 flv만의 부가적 특징이 바로 cuePoint가 있다. 이는 영상 중간 중간에 변수(정보)를 삽입할 수 있다.
따라서 AS3에서는 반드시 onMetaDataonCuePoint를 체크하여야 한다. FMS서버일 때 이러한 cuePoint를 체크하여 서버의 파일의 위치를 찾아가 바로 바로 재생할 수 있도록 하기 위해서 이다.

Posted by 버터백통