RGB에서 YUV로, YUV에서 RGB로 변환할 때 어떤 문제가 발생하는지 수식화 해봤습니다.
변환 공식은 아래 공식을 이용했고(ITU-R BT.601), 8bit 색 깊이로 계산하였습니다.
RGB to YUV Conversion Y = (0.257 * R) + (0.504 * G) + (0.098 * B) + 16 U(Cb) = -(0.148 * R) - (0.291 * G) + (0.439 * B) + 128 V(Cr) = (0.439 * R) - (0.368 * G) - (0.071 * B) + 128
YUV to RGB Conversion R = 1.164(Y - 16) + 1.596(V - 128) G = 1.164(Y - 16) - 0.813(V - 128) - 0.391(U - 128) B = 1.164(Y - 16) + 2.018(U - 128)
표1> 이론상 가장 이상적인 색 변환표입니다. RGB - YUV - RGB 변환이 완벽하게 이루어집니다.
R
G
B
Y
U
V
R
G
B
Black
0
0
0
16
128
128
0
0
0
White
255
255
255
235
128
128
255
255
255
Yellow
255
255
0
210
16
146
255
255
0
Cyan
0
255
255
170
166
16
0
255
255
Green
0
255
0
145
54
34
0
255
0
Magenta
255
0
255
107
202
222
255
0
255
Red
255
0
0
82
90
240
255
0
0
Blue
0
0
255
41
240
110
0
0
255
표2> 위의 이상적인 변환 표를 만들기 위해서는 아래와 같이 소숫점에 대한 정보를 계속 가지고 있어야 합니다.
R
G
B
Y
U
V
R
G
B
Black
0
0
0
16
128
128
0
0
0
White
255
255
255
235.045
128
128
254.968
254.968
254.968
Yellow
255
255
0
210.055
16.055
146.105
254.776
254.931
-0.025
Cyan
0
255
255
169.51
165.74
16.055
0.02142
254.941
254.845
Green
0
255
0
144.52
53.795
34.16
-0.1714
254.903
-0.1484
Magenta
255
0
255
106.525
202.21
221.84
255.14
0.06502
255.117
Red
255
0
0
81.535
90.26
239.945
254.947
0.0278
0.12342
Blue
0
0
255
40.99
239.95
109.895
0.19278
0.03723
254.993
표3> 다음 예는, 소숫점을 반올림 처리하고 그 결과로 다시 변환한 표입니다. 최종 RGB로 변환한 결과에서 +1씩 오차값이 발생합니다.
R
G
B
Y
U
V
R
G
B
Black
0
0
0
16
128
128
0
0
0
White
255
255
255
235
128
128
255
255
255
Yellow
255
255
0
210
16
146
255
255
0
Cyan
0
255
255
170
166
16
1
255
256
Green
0
255
0
145
54
34
0
256
1
Magenta
255
0
255
107
202
222
256
1
255
Red
255
0
0
82
90
240
256
1
0
Blue
0
0
255
41
240
110
0
0
255
표4> 아래 예는, 소숫점 없이 YUV에서 RGB로 변환하고, 다시 YUV로 변환한 결과입니다.
이것은 통상 캠코더(YUV)에서 NLE(RGB)를 거처 최종 동영상 파일을 인코딩(YUV) 했을때를 가상해본 시나리오입니다.
Magenta 변환시 최종 YUV에서 오차가 발생합니다.
Y
U
V
R
G
B
Y
U
V
Black
16
128
128
0
0
0
16
128
128
White
235
128
128
255
255
255
235
128
128
Yellow
210
16
146
255
255
0
210
16
146
Cyan
170
166
16
1
255
255
170
166
16
Green
145
54
34
0
255
1
145
54
34
Magenta
107
202
222
255
1
255
107
202
221
Red
82
90
240
255
1
0
82
90
240
Blue
41
240
110
0
0
255
41
240
110
결론
캠코더는 CCD/COMS에서 빛을 받아 전기적 신호로 변환할 때는 RGB 신호를 사용합니다. 쉬운 예로 3CCD 캠코더는 프리즘을 통해 RGB 3개의 CCD에 각각 신호를 분리해서 받습니다. 이 신호는 채널당 10~14bit 까지 처리합니다. 이후 DSP를 통해 감마와 화이트발란스 등을 잡고, 최종 테잎이나 메모리에 저장할 때는 YUV 신호로 저장합니다. 이렇게 저장할 때까지만 해도 색공간의 오차는 거의(?) 발생하지 않는다고 볼 수도 있습니다. 그러나, 이렇게 캠코더에서 저장된 YUV 동영상 파일(대부분의 동영상 파일들이 YUV를 사용하고 있음)을 YUV 색공간을 사용하는 편집 프로그램이 아닌, RGB 색공간을 사용하는 편집 프로그램 (예로, 애프터이팩트, 컴버스쳔 등)으로 작업하여 다시 YUV 코덱으로 저장하게 되면 바로 위와 같은 문제가 발생할 가능성이 있다는 것입니다.
이 쯤에서 고민해봐야 할 것은 RGB 색공간을 사용하는 NLE에서 색공간을 변환시킬 때, 소숫점 정보를 끝까지 가지고 가는지, 아니면 변환 후 버리게 되는지가 관건이 될겁니다. 소숫점 정보를 끝까지 가지고 간다면 맨 처음 보였던 표1과 같은 이상적인 화면을 얻을 수도 있을 겁니다.
이제 사운드 카드로 소리를 담아 내는 방법을 알게 되었으니 파일로 저장하는 방법에 대해 알아 보겠습니다. 가장 흔히 사용하는 wav 파일 형식을 이용하겠습니다. 사실 이 방법도 문서를 통하여 학습하기 보다는 Warren W. Gay라는 분이 만든 http://www.hitsquad.com/smm/programs/WavPlay/의 WavPlay 1.0을 분석하여 알게되었습니다.
그러다 보니 역시 부족한 부분과 잘못된 부분이 있을 것으로 생각됩니다. 혹 틀린 부분이나 부족한 부분이 있더라도 양해를 부탁드리며 그냥 지나치지 마시고 지적해주시고 알려 주시면 감사하겠습니다.
Wave 파일로 저장하기 위해 다시 한번 Wave 파일의 포맷을 보시겠습니다.
필드 이름
필드 값
크기 (bytes)
Chunk ID
'RIFF'
4
Chunk size
4
Format
'WAVE'
4
SubChunk 1 ID
'fmt '
4
SubChunk 1 Size
4
Audio Format
1
2
Num Channels
2
Sample Rate
4
Byte Rate
4
Block Align
2
Bits Per Sample
2
SubChunk 2 ID
'data'
4
SubChunk 2 Size
4
data
SubChunk 2 Size
이전 Wave 파일을 출력할 때에는 분홍색 부분만 스트럭쳐를 구성해서 헤더 부분을 읽어 내었는데요, 저장하기 위해서는 모든 내용을 스트럭쳐로 구성하겠습니다. 역시 이부분은 http://www.hitsquad.com/smm/programs/WavPlay/에 올려진 WavPlay 1.0 의 소스 부분에서 이름만 조금 수정했습니다.
Wave 파일로 저장하기 위해서는 Wave 파일을 어떻게 만들었는지 wav의 속성을 담은 헤더 부분을 먼저 저장해야 겠습니다. 그래서 녹음 을 스테레오로 녹음했는지 모노로 녹음했는지에 대한 정보나 비트 레이트, 샘플링 비트 수 같은 정보를 담아서 헤더 정보로 먼저 저장합니다.
당연히 헤더 정보는 미리 사운드카드에 설정한 값이 되겠지요. 예제에서도 먼저 마이크로 녹음하는 방법을 모노에, 8000hz, 16비트 녹음으로 설정했습니다.
대부분이 wave 파일의 헤더에 맞추어 스트럭쳐의 내용을 구성하고 스트럭쳐를 그대로 파일에 저장했습니다. 주의해서 보실 것은 인수로 받은 _samples는 녹음 시간(초)* 샘플링 비트 레이트로서 Hz 값입니다. 헤더 정보에는 사운드 부분의 바이트 개수가 들어 가기 때문에 _samples에 스테레오면 2배를 모노이면 _samples 값으로 사운드 데이터 부분의 바이크 개수를 계산하고 헤더에 저장합니다.
방법 1.
---------------------------------------------
<body oncontextmenu="return false" onselectstart="return false" ondragstart="return false">
완전히 오른쪽마우스가 안되게 하는 방법
<script language="javascript">
var ip = '<!--#echo var="REMOTE_ADDR"-->'
if (ip == '차단할IP주소') {
alert("STOP! You are viewing this page from an IP address that is not allowed!");
alert("Why can't you guys just leave me alone?");
if (confirm("Do you want to leave peacefully? Or will I have to help you?"))
{location.href="http://iloveflash.co.kr" } else { ("OK you choose I don't care! Bye bye! Don't come back!"); {location.href="http://iloveflash.co.kr" }} }
</script>
페이지가 용량이 많을때 읽는 중이라는 메시지보여주는 소스
로딩소스
<body onload="hide()">
<script language=javascript>
<!--
n = document.layers
ie = document.all
function hide() {
if (ie || n) {
if (n) document.Load.visibility = "hidden"
else Load.style.visibility = "hidden"
}
}
<!-- [1단계] 아래의 코드를 <body> 와 </body> 태그 사이에 붙여 넣으세요 -->
<script>
// 눈송이의 갯수 (30 - 40 개 이상은 권하지 않습니다)
var snowmax=20
// 눈송이의 색상을 설정 하세요(더 추가하실수 있습니다)
var snowcolor=new Array("#aaaacc","#ddddFF","#ccccDD")
// 눈송이(사실은 글자)의 글꼴을 설정 하세요
var snowtype=new Array("Arial Black","Arial Narrow","Times","Comic Sans MS")
// 눈송이 모양
var snowletter="★"; // 눈송이모양은 (*) 가 좋습니다
// 떨어지는 속도 (0.3 에서 2 까지 권장)
var sinkspeed=0.6
// 눈송이의 최대크기
var snowmaxsize=30
// 눈송이의 최소크기
var snowminsize=8
// 눈이 내릴 구역을 설정 하세요
// 1 전체화면,
// 2 왼쪽화면
// 3 가운데 부분
// 4 오른쪽 화면
var snowingzone=1
var snow=new Array()
var marginbottom
var marginright
var timer
var i_snow=0
var x_mv=new Array();
var crds=new Array();
var lftrght=new Array();
var browserinfos=navigator.userAgent
var ie5=document.all&&document.getElementById&&!browserinfos.match(/Opera/)
var ns6=document.getElementById&&!document.all
var opera=browserinfos.match(/Opera/)
var browserok=ie5||ns6||opera
function randommaker(range) {
rand=Math.floor(range*Math.random())
return rand
}
function initsnow() {
if (ie5 || opera) {
marginbottom = document.body.clientHeight
marginright = document.body.clientWidth
}
else if (ns6) {
marginbottom = window.innerHeight
marginright = window.innerWidth
}
var snowsizerange=snowmaxsize-snowminsize
for (i=0;i<=snowmax;i++) {
crds[i] = 0;
lftrght[i] = Math.random()*15;
x_mv[i] = 0.03 + Math.random()/10;
snow[i]=document.getElementById("s"+i)
snow[i].style.fontFamily=snowtype[randommaker(snowtype.length)]
snow[i].size=randommaker(snowsizerange)+snowminsize
snow[i].style.fontSize=snow[i].size
snow[i].style.color=snowcolor[randommaker(snowcolor.length)]
snow[i].sink=sinkspeed*snow[i].size/5
if (snowingzone==1) {snow[i].posx=randommaker(marginright-snow[i].size)}
if (snowingzone==2) {snow[i].posx=randommaker(marginright/2-snow[i].size)}
if (snowingzone==3) {snow[i].posx=randommaker(marginright/2-snow[i].size)+marginright/4}
if (snowingzone==4) {snow[i].posx=randommaker(marginright/2-snow[i].size)+marginright/2}
snow[i].posy=randommaker(2*marginbottom-marginbottom-2*snow[i].size)
snow[i].style.left=snow[i].posx
snow[i].style.top=snow[i].posy
}
movesnow()
}
function movesnow() {
for (i=0;i<=snowmax;i++) {
crds[i] += x_mv[i];
snow[i].posy+=snow[i].sink
snow[i].style.left=snow[i].posx+lftrght[i]*Math.sin(crds[i]);
snow[i].style.top=snow[i].posy
if (snow[i].posy>=marginbottom-2*snow[i].size || parseInt(snow[i].style.left)>(marginright-3*lftrght[i])){
if (snowingzone==1) {snow[i].posx=randommaker(marginright-snow[i].size)}
if (snowingzone==2) {snow[i].posx=randommaker(marginright/2-snow[i].size)}
if (snowingzone==3) {snow[i].posx=randommaker(marginright/2-snow[i].size)+marginright/4}
if (snowingzone==4) {snow[i].posx=randommaker(marginright/2-snow[i].size)+marginright/2}
snow[i].posy=0
}
}
var timer=setTimeout("movesnow()",50)
}
for (i=0;i<=snowmax;i++) {
document.write("<span id='s"+i+"' style='position:absolute;top:-"+snowmaxsize+"'>"+snowletter+"</span>")
}
if (browserok) {
window.onload=initsnow
}
</script>
단, 아래 소스는 약간의 편법으로 만들어 진 것으로
먼저 기본 HTML에서 풀스크린으로 뛰울 HTML을 오픈하고 자기 자신은 창을 닫는 방식을 사용했습니다.
이 소스는 장점은 어떤 첫화면 풀스크린만들기 소스보다 소스가 간단합니다.
단점은 약간의 시간이 걸리고 또 중간에 다른창이 떳다가 사라지는 것 같은 화면이 잠시 나타납니다.
* 전체화면으로 뜬 창은 Alt+F4 키를 누르면 나갈 수 있습니다. 그러나
사용자들이 이것을 모르는 경우가 많기때문에 "닫기"버튼을 하나 만들어 주는 것이 좋습니다. 닫기 버튼은 이 게시판에서 "닫기"로 검색하면 찾을 수 있습니다.
>I would like to know if there is a way to know my ip address of each
>interface from a C program, if them are up or down...
>Of course, I can do it scanningf the output of "ifconfig", (more
>concretelly "ifconfig ppp0 | grep inetaddr"), but it would be great if
>exists the possibility of reading a structure with this information with a
>system call, just like sysinfo allows me to know how many free memory I
>have, for example.
>I have looked for such a function, but I havent found it. (I also have
>tried to look at the ifconfig code for a hint, but for me it is too
>complicated).
Below is a demo program that has been posted a few times previously.
/*
This won't work on HP-UX 10.20 as there's no SIOCGIFHWADDR ioctl. You'll
need to use DLPI or the NETSTAT ioctl on /dev/lan0, etc (and you'll need
to be root to use the NETSTAT ioctl. Also this is deprecated and doesn't
work on 11.00).
On Digital Unix you can use the SIOCRPHYSADDR ioctl according to an old
utility I have. Also on SGI I think you need to use a raw socket, e.g. s
= socket(PF_RAW, SOCK_RAW, RAWPROTO_SNOOP)
/* Select which hardware types to process.
*
* See list in system include file included from
* /usr/include/net/if_arp.h (For example, on
* Linux see file /usr/include/linux/if_arp.h to
* get the list.)
*/
switch (ifr->ifr_hwaddr.sa_family) {
default:
printf("\n");
continue;
case ARPHRD_NETROM: case ARPHRD_ETHER: case ARPHRD_PPP:
case ARPHRD_EETHER: case ARPHRD_IEEE802: break;
}
대부분 집의 컵퓨터는 정품을 안쓰고 비품을 쓰고 계시더군요.
간단하게 "윈도우 XP 정품인증"을 받을수가 있거든요.
xp정품인증 따라해보세요
시작 - 실행 - regedit -확인 - 다음에 경로로 이동합니다.
HKEY_LOCAL_MACHINE
SOFTWARE
Microsoft
windows NT
CurrentVersion
WPAEvents
보면은 oobetimer 라는게 있을 것입니다.
그걸 더블 클릭하면 편집이 뜨는데 첫째줄에 보면은 0000하고
몇칸 띄었고 그 다음에 숫자하고 영어하고 섞여있는게 보일겁니다.
맨앞에(0000다음에) ca 를 붙여주고 확인 누르시면 끝.
이제 재부팅 하시고...
시작>>실행>>oobe/msoobe /a 를 적고 <엔터>하여 정품인증 됐나 보세요.
정품인증 됐다고 나올껍니다.
그럼윈도우 업그레이드로 들어가셔서 무료로 업데이트하시고 여러가지 좋은것을 깔으세요.^*^
미래의 웹 혹은 인터넷 환경 변화에 대한 방향성을 제시한 일종의 패러다임으로, 특정한 기술을 지칭하는 말은 아니다. Web 2.0에서는 단순한 website의 집합체를 web 1.0으로 보고, web application을 제공하는 하나의 완전한 플랫폼으로의 발전을 web 2.0이라고 지칭한다. Web 2.0이라는 용어는 'O'Reilly Media'에서 2004년에 사용되기 시작하면서 대중화 되었다.
Web 2.0의 기본 철학 = 참여, 개방, 공유
2. AVI Format
기본적으로 AVI도 마이크로소프트의 WAV 사운드 파일처럼 RIFF 포맷의 일부이다. 다른 RIFF 파일과 마찬가지로 AVI 파일도 하나의 RIFF 헤더와 여러 개의 chunk와 list로 구성되어 있다. RIFF 헤더, chunk, list의 기본 구조도는 다음과 같다.
위치
이름
크기
의미
0x00
groupID
4
RIFF 파일을 나타낸다. "RIFF"가 저장되어 있음.
0x04
groupSize
4
헤더 8바이트를 제외한 파일 크기.
0x08
riffType
4
AVI 파일을 나타낸다. "AVI"가 저장되어 있음.
헤더의 구조
위치
이름
크기
의미
0x00
chunkID
4
어떤 종류의 chunk인지를 나타낸다.
0x04
chunkSize
4
ID와 size 8바이트를 제외한 실제 저장된 데이터 크기.
0x08
Data
n
실제 저장된 데이터
Chunk의 구조
위치
이름
크기
의미
0x00
groupID
4
LIST임을 나타내는 문자열. "LIST"가 저장되어 있다.
0x04
listSize
4
ID와 size 8바이트를 제외한 실제 저장된 데이터 크기.
0x08
listType
4
어떤 종류의 list인지를 나타내는 문자열.
0x0C
Data
n
실제 저장된 데이터. Chunk또는 또 다른 list가 올 수 있다.
List의 구조 < RIFF 헤더, chunk, list 블록의 구조 >
다음은AVI 파일의 구조도이다.
<AVI 파일 구조>
그림에서 보듯이 list 안에는 여러 개의 chunk 블록과 또 다른 list들이 들어 있을 수 있다. 맨 처음 RIFF 헤더가 오고 다음에는 동영상 재생과 관련된 여러 가지 정보를 담고 있는 헤더 리스트가 온다. 그리고 파일 크기를 일정하게 만들기 위한 JUNK 블록이 오는데 이는 선택 사항으로 없을 수도 있다. 그 다음 실제 오디오/비디오 데이터를 담고 있는 audio/video data list가 온다.
헤더 리스트의 구조는 다음과 같다.
위치
이름
크기
의미
0x00
groupID
4
"LIST"
0x04
listSize
4
헤더 8바이트를 제외한 리스트 크기.
0x08
ListType
4
"strl"
0x0C
ListData
n
오디오/비디오 스트림 헤더(strh)와 오디오/비디오 스트림 포맷(strf)가 들어있다.
< 헤더 리스트의 구조>
헤더 리스트 안에는 AVI 헤더(avih)와 AVI 스트림 list(strl)가 들어 있는데 각각의 구조는 다음과 같다.
위치
이름
크기
의미
0x00
chunkID
4
“avih”
0x04
chunkSize
4
헤더 8바이트를 제외한 데이터 크기.
0x08
MicroSecPerFrame
4
프레임과 프레임 사이 시간 간격. 단위는 밀리초
MaxBytesPerSec
4
최대 초당 전송 바이트 수.
Reserved
4
Flags
4
플래그. 인덱스 유무 등을 나타낸다.
TotalFrames
4
총 프레임 수
InitialFrames
4
시작 프레임
Streams
4
스트림 개수. 하나의 오디오와 비디오가 있는 경우 스트림 수는 2.
SuggestedBufferSiz
4
파일을 읽을 때 사용할 버퍼 크기
Width
4
이미지 폭. 픽셀 단위.
Height
4
이미지 높이.픽셀 단위.
Reserved
16
AVI 헤더
위치
이름
크기
의미
0x00
groupID
4
“LIST”
0x04
listSize
4
헤더 8바이트를 제외한 리스트 크기.
0x08
ListType
4
어떤 헤더 리스트인가를 나타내는 문자열 “hdrl”이 들어 있다.
0x0C
ListData
n
AVI 헤더(avih)와 AVI 스트림 list(strl)가 온다.
AVI 스트림 < AVI 헤더와 AVI 스트림 리스트의 구조 >
AVI 스트림 리스트 안에는 스트림 개수에 따라 하나 또는 그 이상의 오디오/비디오 스트림 헤더와 오디오/비디오 스트림 포맷이 들어 있다. 다음은 오디오/비디오 스트림 헤더와 포맷의 구조이다. 오디오/비디오 스트림 포맷은 코덱에 따라 차이가 날 수 있다.
위치
이름
크기
의미
0x00
chunkID
4
“strh”
0x04
chunkSize
4
헤더 8바이트를 제외한 데이터 크기.
0x08
fccType
4
스트림의 유형. “vids”는 비디오 스트림을 나타내고 “auds”는 오디오 스트림을 나타낸다.
fccHandler
4
데이터 핸들러를 가리키는 문자열. 보통 사용한 오디오/비디오 코덱을 나타낸다.
Flags
4
플래그.
Priority
2
중요도. 여러 개의 스트림이 있을 때 중요도가 가장 높은 스트림이 디폴트 스트림이 된다.
Language
2
언어.
InitialFrames
4
오디오 데이터가 비디오 데이터에 비해 얼마나 앞서 있는가를 나타냄
Scale
4
Rate / Scale = 초당 샘플링 수.
Rate
4
Start
4
시작 시간
Length
4
길이
SuggestedBufferSize
4
버퍼 크기
Quality
4
화질 또는 음질. 0에서 10,000 사이의 값을 가진다. –1이면 디폴트 값을 사용한다.
SampleSize
4
샘플 데이터의 크기
Frame
16
비디오가 출력될 윈도우 크기.
< 오디오/비디오 스트림 헤더 >
위치
이름
크기
의미
0x00
chunkID
4
“strf”
0x04
chunkSize
4
헤더 8바이트를 제외한 데이터 크기.
0x08
Data
n
오디오/비디오 스트림 포맷 데이터
< 표 6 오디오/비디오 스트림 포맷 >
그 다음에 실제 오디오/비디오 데이터가 저장된 비디오/오디오 데이터 리스트가 온다. “movi” 리스트 안에 여러 개의 오디오/비디오 데이터 chunk가 들어있다. 이들 데이터 chunk들은 다시 “rec” 리스트로 묶여 있을 수 있다.
작년 세계 시장 조사기관인 JP프리먼의 발표 자료에 따르면 IP camera 산업의 전망은 밝은 것으로 보입니다.
JP프리먼은 최근 보고서를 통해 2009년까지 IP서베일런스(IP서베일런스(IP surveillance)는 CCTV와 DVR 등 영상보안 장비들을 IP기반 네트워크 시스템으로 구성한 것을 말하며 IT 카메라도 이에 해당합니다.)에 들어가는 IP카메라와 비디오 서버 시장이 15배 이상 성장할 것으로 전망하였습니다. 반면, 현 영상보안 시장의 핵심인 디지털영상저장장치(DVR)는 2008년 이후 성장 정체될 것으로, 아날로그 카메라와 아날로그 저장장치는 이미 시장 축소 단계에 있는 것으로 조사 되었습니다.
특히, 주요 제품 가운데 통신과 융합된 영상보안 시장의 주력장비로 꼽히는 IP 카메라와 비디오 서버는 향후 5년간 각각 15배, 19배 성장할 것으로 예상되었습니다. 지난해 4400만달러 수준였던 IP카메라 시장은 올해 8000만달러로 성장하고 2009년에는 6억5000만달러 규모에 이를 것으로, 비디오서버 시장 역시 2004년 1500만달러에서 5년 후에는 2억8000만달러 규모로 초고속 성장이 가능할 것으로 예측됐습니다. 다음 자료는 2005년 JP 프리먼에서 발표한 것으로 세계 시장 규모는 통상 미국의 두 배로 추정합니다.
<표. 미국 주요 영상보안 장비 시장전망(단위:백만달러) >
구분 2004년 2005년 2006년 2007년 2008년 2009년
IP카메라 44 80 150 250 410 650
비디오서버 15 30 50 100 170 280
DVR 100 140 160 180 180 170
아날로그 240 260 250 230 180 100 카메라
아날로그 65 48 30 18 12 5 리코더
최근 IP camera 사업에 박차를 가하고 있는 기업은 아이디스, 윈포넷, 어드밴텍, KT 등이 있습니다. 아이디스(대표 김영달)는 이미 IP카메라, 비디오 서버 등의 제품군 개발은 마친 상태라고 말한바 있습니다. 또 현재 판매중인 주력 DVR 제품군은 모두 IP 원격제어 및 저장·전송 기능을 갖췄다고 설명하였습니다. 단, 아직까지 DVR 매출이 좋은 상태로 향후 시장 상황을 고려해 IP기반 제품군 대응 수위를 조절한다는 계획에 있습니다.
윈포넷(대표 권오언)은 전용 비디오 서버와 네트워크 연계 DVR(NDR), IP와 연동한 영상전용 스토리지를 최근 출시했습니다. 모두 IP 기반에서 활용도를 높인 제품으로, 회사는 IP 환경에서 장비의 성능을 극대화할 수 있는 전용 소프트웨어도 자체 개발, 판매에 돌입했습니다. 권오언 윈포넷 사장은 "GE·펠코 등 해외 주요 매출처를 중심으로 IP연동 제품에 대한 납품 및 개발 요구가 크게 늘고 있다"며 "영상보안 시장의 네트워크화는 대세로 이에 맞는 제품 개발을 통해 시장에 대처하겠다”고 밝혔습니다.
어드밴텍(대표 최영준)은 KT와 영상보안장비 공동 마케팅을 벌이는 등 IP기반 제품 개발에 적극적입니다. IP카메라와 비디오 서버 이외에 다양한 IP기반 제품군을 선보이고 있습니다다. VoIP 등에 활용되는 프로토콜인 SIP(Session Initiation Protocol)를 탑재해 영상을 보고 상대방과 대화가 가능한 전용서버 개발을 마치고 출시를 준비중입니다다. 단순히 사물의 동작에 반응하는 것이 아니라 프로그램화된 특정 행위만을 감시할 수 있는 인텔리전트 DVR도 개발하고 있습니다. 신제품은 영상정보의 실시간 데이터 분석도 가능할 것이라고 회사 측은 설명합니다.
투자 가능성에 대한 전문적은 지식은 아니지만, IP camera 시장에 대한 전반적인 이해에는 도움이 되실 것 같아서 이렇게 답변 드립니다. 여러가지를 고려하여 좋은 선택 하시길 바랍니다. ^^
XMLHttpRequest(XHR) 객체는 Internet Explore5에서 ActiveX 컴포넌트 형식으로 가장 먼저 제공되었기때문에, 모질라와 사파리 웹브라우저에서 이 객체를 도입하기전까지 사실 많은 개발자들이 XMLHttpRequest 객체의 사용을 꺼려했다.
XHR은 W3C 표준이 아니기때문에 브라우저마다 작동방식에 있어서 다소나마 차이가 존재했었지만 현재 대부분의 브라우저들은 XHR 기능을 서로 비슷하게 구현하고 있다. 현존하는 브라우저들 중에서 XHR을 지원하지 않는 브라우저는 거의 없을정도로 대부분의 브라우저들은 현재 XHR 을 지원하고 있다.
ajax 구현의 시작은 XHR 객체의 생성에서 시작한다. XHR 은 W3C 의 표준이 아니므로, 인터넷익스플로어에서는 ActiveX Component 형식으로 구현되었고, 그 밖에 다른 브라우저들(FireFox, Safari, Opera)은 native javascript 객체로 구현되었다. 이런 차이점을 고려해서 XHR 객체를 얻어오는 자바스크립트 코드를 다음과 같이 작성할 수 있다.
var xmlHttp;
function createXMLHttpRequest() { if(window.ActiveXObject) { xmlHttp = new ActiveXObject("Microsoft.XMLHTTP"); } else if(window.XMLHttpRequest) { xmlHttp = new XMLHttpRequest(); } return xmlHttp; }
window.ActiveXObject 는 ActiveXObject를 지원하는 브라우저라면 오브젝트를 리턴하고 그렇지 않다면 null를 리턴하게 된다. 따라서 오브젝트가 존재하면 if 구문은 true 를 반환하고 xmlHttp 값은 ActiveXObject 객체가 할당되어진다. if 구문이 false 를 반환하면 else 구분으로 이동하여 xmlHttp 값은 navtive javascript 객체가 할당될 것이다. 따라서 위 코드를 이용하면 브라우저가 다르더라도 하나의 메소드로 XHR 객체를 생성할 수 있다.
XHR 오브젝트의 메소드
void open(method, url, [async, [user, [ password ]]]) 요청을 초기화한다.
method : GET/POST url : 요청대상 URL async : 비동기 true, 동기 false (default : true) user : 인증페이지에서 사용될 사용자 이름 password : 인증페이지에서 사용될 암호
async 을 false 로 설정하면 요청은 동기로 처리되기 때문에 서버에서 응답을 받을때까지 프로세스는 기다린다. XHR 을 사용하는 가장 큰 이점중의 하나인 비동기 처리를 위해서는 asynch 항목을 true 로 설정해야 한다. false 를 설정한다면 XHR 을 사용하는 이점이 그만큼 줄어든다.
void send(content) 실질적으로 요청을 서버로 보낸다. 요청이 비동기이면 이 메소드는 바로 리턴되지만 요청이 동기이면 서버에서 응답을 받을때까지 계속 대기한다. content 는 선택사항이며, DOM 객체이거나 input stream, string 값으로 설정할 수 있으며 HttpRequest body 의 한 부분으로 서버로 전달된다. (※content 에 값을 넘기려면 open() 메소드는 반드시 POST 로 설정해야 하며, GET 방식으로 요청하려면 null 을 설정하면 된다.)
open(), send() 메소드가 가장 많이 사용되는 메소드들이다. 나머지 메소드에 대해서도 알아보자.
void setRequestHeader(string header, string value) header 에 해당하는 value 값으로 HttpRequest 헤더에 값을 설정하는 메소드이다. 반드시 open() 메소드 다음에 위치해야 한다.
void abort() 요청을 중지한다.
string getAllResponseHeaders() 요청에 대응되는 응답의 헤더정보를 리턴한다. 즉, Content-Length, Date, URI 등을 포함하는 헤더정보를 string 형식으로 반환한다.
string getResponseHeader(string header) 응답의 헤더정보중에서 header 에 대응되는 값을 string 형식으로 반환한다.
XHR 속성중에서 중요한 몇가지 속성
onreadystatechange 자바스크립트 콜백함수(funtion pointer)를 저장한다. 콜백함수는 readyState 값이 변할때 마다 호출된다. 요청이 서버로 보내지면 readyState 는 5가지 숫자값으로 계속 변화가 일어나게 된다.
readyState 요청의 상태를 의미한다.
0 : UNINITIALIZED : 오브젝트는 작성되어 있으나 아직 초기화되어 있지 않다.(open()이 불리지 않았음) 1 : LOADING : 오브젝트가 작성되었으나 아직 send()가 불리지 않았다. 2 : LOADED : send()가 불렸지만 ststus와 header가 아직 도착하지 않았다. 3 : INTERACTIVE : data일부를 받았다. 4 : COMPLETED : data전부를 받았다. 완전한 데이터가 이용가능
responseText 서버의 응답을 string 형식으로 나타낸다.
responseXML 서버의 응답을 XML 로 나타낸다. 이 속성은 DOM 객체로 파싱할 수 있다.
status 서버로부터의 HTTP 상태코드이다.(예 200(OK), 404(NOT Found) 등등)
statusText HTTP 상태코드에 대한 텍스트 값이다.(예 OK, NOT Found 등등)