몇일전 flv 컨트롤에 대해서 문제점이 생겨, 요래조래 질문하다가.
[ 우야꼬 ] 행님의 좋은 말씀이 있어, 올립니다.

다시 한번 감사드립니다(__); 쵝오!
(저에게 전하는 말이라, 글이 반말입니다 그냥 읽어주시길...);


-FLV 재생 원리-




동영상이라는 것 자체가 한장한장의 이미지가

연속으로 보여지는 것인데

그렇게 되면 너무 용량이 커지기 때문에

용량을 줄이는 방법들이 고안되었고

여러가지 동영상 압축 기술들이 나왔는데

그 압축 기술대로 동영상을 재생해주는 모듈을 [ 코덱 ] 이라고 한다.

기본적으로 동영상 압축에는

"공간 압축" 과 "시간 압축" 이라는 두가지 기법이 쓰인다.

[ 공간 압축 ]


빨강, 빨강
빨강, 하양

이라는 그림이 있으면 바로 전 픽셀에 대해서 변화되는 양만 기록하는 기법이다.

앞에것도 빨강(0xFF)고 그 다음 칼라도 빨강(0xFF)면 변화되는 값이 없기 때문에

0xFF, 0 이라고 적으면

코덱은 바로 전 픽셀에 차례차례 나오는 변화량만 기록한다.

빨강, 0
0, 하양

이라고 표현할 수 있다.

조금더 쉽게 숫자로 표현하자면

130, 131, 131, 132 라는 숫자가 있으면

총 12자리의 숫자가 필요할테지만

변화량으로 기록하게 되면

130, 1, 0, 1 로 기록 할 수 한다.

그렇게 되면 필요한 자리수는 총 6개가 되니까 압축률은 50%가 된다.

이 기법은 동영상이 아니라 사실 JPEG 압축기술이다.

즉, 한장의 이미지에서 한 픽셀 픽셀의 모든 컬러값을 적는게 아니라 변화되는 변화량만 적는 기법이라서

한번에 한 장면에 있는 이미지를 압축하기 때문에 "공간" 압축이라고 한다.




[ 시간 압축 ]

이 공간 압축에 한 차원을 더하는건데

총알이 움직이는 사진이 있다고하면

첫번째 사진에는 총알이 왼쪽에 있다가 두번째 사진에는 총알이 중간쯤 가 있겠다고 하자.

그러면 사진 윗부분이나 아랫부분, 오른쪽 부분은

첫번째 사진이나 두번째 사진이나 똑같으니, 변화되는것이 극히 적기 때문에

첫번째 사진은 그 사진 그대로 기록을 하고

두번째 사진은 첫번째 사진에서 변화되는 것만 기록한다.

그래서 이걸 "시간 압축 "이라고 한다.





그러면 FLV가 어떤 구조로 되어 있는지 간단하게 설명해볼께

FLV는 기본적으로 일정한 간격으로 동영상이 덩이 덩이로 나뉘어있다.

예를 들어 10초짜리 동영상이라면 하나의 덩이로도 이뤄져있을 수 있는데

1시간 짜리라면 100개나 200개의 덩이로도 나뉘어있을 수 있다.

덩어리에 이뤄져있는 구조는

덩이의 제일 첫번째에는 JPEG 이미지가 들어가있어.

그리고 그 다음부터 나오는 정보들은 앞에서 말한 "시간 압축" 으로

이 이미지에서 변화되는 변화량만 적혀있다.

아마 동영상 보다보면

이런 경험한적 있을것이다.

동영상을 건너뛰어서 보려고 진행률 뒷부분을 클릭해서 보면

지금보던 장면이 이상하게 꿈틀거리면서 뒤틀리다가 갑자기 제대로 동영상이 나오는 현상.

이 현상이 바로 시간 압축때문에 일어나는 현상이다.

즉 10초부분에 있는 덩이의 첫 이미지를 기준으로 변화량을 적용해서 동영상을 재생하고 있었는데

갑자기 뒤로 건너뛰면 10초대에 있던 첫이미지를 기준으로 현재의 변화량을 측정하니까

이상한 이미지가 나와버리는 것이다.

아무튼 한 덩이의 제일 첫 이미지를

i-frame이라고 부르고,

그리고 그 다음에 나오는 변화량들을 b-frame(맞는지 모르겠음;;)이라고 부르는데,


즉 재생하는 원리가 파일을 읽어들이면서 i-frame이 나오면

그걸 저장하고 있다가 그 뒤에 나오는 b-frame을 가지고 i-frame의 이미지를 컨트롤 하는 방식이다.

그래서 동영상을 앞으로 재생하면 그 덩이의 첫 i-frame을 가져오기가 수월한데

뒤로 재생하면 frame을 찾는 헤더 자체가 거꾸로 움직여야되기 때문에

i-frame을 잘 못찾는 거지.

사실 코덱을 좀 더 정밀하게 컨트롤하면 되긴 하는데

그게 우리 맘대로 다룰 수 있는게 아니기 때문에 힘든거지.



나중에 기회되면 H.264/AVC 코덱 관련된 기술같은거 찾아보면

진짜 도움 많이 될거야.

프로그래밍이 아니라 정말 컴퓨팅에 대한 새로운 세상이 열릴거라고 생각해 ㅎㅎ

나중에 PFG 세미나때 짬내서 한번 설명다시 해볼께.

이해 안가면 전화해라 ㅋㅋ


'ActionScript3.0 > As3.0' 카테고리의 다른 글

Function 전달.  (0) 2013.03.06
Function 참조.  (0) 2013.03.04
플래시 기준으로 경로 맞추기  (0) 2010.06.23
input 텍스트 박스, 파이어폭스에서 한글 깨짐 방지.  (0) 2010.06.17
lineTo(), moveTo()  (1) 2010.02.12

+ Recent posts