sudo apt-get update
sudo apt-get upgrade
sudo apt-get install python-pip
sudo -H pip install -U jetson-stats
sudo reboot
# jetson-stats 실행
jtop
팁&테크
- [Jetson] jetson-stats 설치 방법 2023.08.02
- [Jetson] Jetson보드에서 pytorch 설치 방법 2023.08.02
- [Jetson] Jetson vscode install 2023.07.31
- [iOS] require()사용시 'goto into protected scope' 에러 2013.07.19
- [MFC] OnLButtonDown의 nFlag 2011.08.18 1
- [MFC] GDI+ 초기화 2011.08.18 2
- USB에 Ubuntu 설치하기 2009.03.20
- 특허 2007.12.05
- [ 펌 ] I, B, P frame 2007.12.05
- [MFC] Application 프로그래밍시 알아두어야 할 지식 2007.12.04 1
[Jetson] jetson-stats 설치 방법
[Jetson] Jetson보드에서 pytorch 설치 방법
https://forums.developer.nvidia.com/t/pytorch-for-jetson/72048
해당 페이지에서 본인의 jetpack 버전에 맞는 pytorch 배포본 다운로드 할것
>> wget https://nvidia.box.com/shared/static/p57jwntv436lfrd78inwl7iml6p13fzh.whl -O torch-1.10.0-cp36-cp36m-linux_aarch64.whl
>> sudo apt-get install python3-pip libopenblas-base libopenmpi-dev libomp-dev
>> pip3 install Cython
>> pip3 install numpy torch-1.10.0-cp36-cp36m-linux_aarch64.whl
설치 후 적합한 torchvision 버전을 위 페이지에서 다시 찾을 것
- PyTorch v1.0 - torchvision v0.2.2
- PyTorch v1.1 - torchvision v0.3.0
- PyTorch v1.2 - torchvision v0.4.0
- PyTorch v1.3 - torchvision v0.4.2
- PyTorch v1.4 - torchvision v0.5.0
- PyTorch v1.5 - torchvision v0.6.0
- PyTorch v1.6 - torchvision v0.7.0
- PyTorch v1.7 - torchvision v0.8.1
- PyTorch v1.8 - torchvision v0.9.0
- PyTorch v1.9 - torchvision v0.10.0
- PyTorch v1.10 - torchvision v0.11.1
- PyTorch v1.11 - torchvision v0.12.0
- PyTorch v1.12 - torchvision v0.13.0
- PyTorch v1.13 - torchvision v0.13.0
- PyTorch v1.14 - torchvision v0.14.1
- PyTorch v2.0.0 - torchvision v0.15.1
torchvision 설치 (python 3.6)
$ sudo apt-get install libjpeg-dev zlib1g-dev libpython3-dev libopenblas-dev libavcodec-dev libavformat-dev libswscale-dev
$ git clone --branch v.0.xx.x https://github.com/pytorch/vision torchvision
$ cd torchvision
$ export BUILD_VERSION=0.xx.x
$ python3 setup.py install --user
$ cd ..
[Jetson] Jetson vscode install
https://jetsonhacks.com/2019/10/01/jetson-nano-visual-studio-code-python/
tx2에서는 컴파일 버전 설치 불가,
직접 빌드도 원활히 되지 않음. 최신 디펜던시 라이브러리 지원 안됨.
vscode.dev
웹 버전 사용 권장함
[iOS] require()사용시 'goto into protected scope' 에러
ios 6.0 이상에서 이전 코드를 다시 컴파일 하다보면...
강화된 Grammar 때문에 다양한 에러가 발생합니다.
그 중에 하나...
goto into protected scope 에러..
이 에러는 Scope 때문에 발생하는 에러로..
그전엔 암묵적으로 허용되었던 스코프를.. 명시적으로 나타내야 하도록 바꼈기 때문에..
발생하는 에러입니다.
이 에러의 해결책은..
require(success, bail);
{
}
bail:
{
}
의 형태로 스코프를 브레이스로 명확하게 나타내주면 됩니다.
[MFC] OnLButtonDown의 nFlag
[MFC] GDI+ 초기화
초기화 방법
1. 헤더 파일 인클루드
stdafx.h에 아래의 헤더파일을 인클루드 한다.
#include <gdiplus.h>
using name space Gdiplus;
2. Startup & Shutdown
CWinApp의 파생클래스인 C~~~~App에 GDI+ 사용시작하고 끝을 내는 함수를 추가해준다.
우선 C~~~~App에 멤버변수로서...
ULONG_PTR m_gdiplusToken;
를 추가한다.
이후에 C~~~~~App의 멤버함수인 InitInstance()에
GdiplusStartupInput gdiplusStartupInput;
를 추가한다.
마지막으로 C~~~~App에 ExitInstace()함수를 추가하고...
여기에..
GdiplusShutdown(m_gdiplusToken);
를 추가한다.
3. 라이브러리 추가
마지막으로 Project에 Property로 가서 Link를 추가한다.
Link의 input 라이브러리 부분에
gdiplus.lib
여기까지 추가하시고 사용하시면 됩니다.
레퍼런스 서적 : Visual C++ 6 완벽가이드 - 영진출판사 -
USB에 Ubuntu 설치하기
특허
특허 출원 how-to
특허출원을 변리사에게 맡길 수도 있지만, 개인이 직접하는 것도 가능하다.
물론 맡기면 알 필요없겠지만, 그래도 조금은 알아두는게 좋을 거 같다.
모르면 어마게 돈만 날리지 않을까?
특허 출원 절차..
1. 선행기술조사
특허청, 특허전자도서관, 혹은 특허관련 사이트에서 무료로 특허 검색이 가능하다.
검색 후 동일한 주제에 대해서 이미 신청된 것이 있는지 조사하는 것이 필요하다.
2. 출원인코드부여신청
특허출원인의 코드를 받아야 한다. 그리고 향후 특허등록시 이 번호를 필히 기재해야한다고 한다.
http://www.kipo.go.kr/kpo2/user.tdf?a=user.kiporo.html.HtmlApp&c=3021&catmenu=apply0301
여기서 가능..
3. 출원서 작성
특허 출원서 서식에 맞춰서 명세서, 도면, 요약서, 특허출원서 순으로 작성한다.
서식은 역시 특허청에서..
4. 제출 서류 준비
출원서(요약서, 명세서, 도면) 1통, 수수료 감면대상인 경우 증명서류를 준비한다.
5. 접수 및 출원번호 통지서 수령
방문접수의 경우 대전에 있는 특허고객서비스센터나 특허청 서울 사무소에 직접 제출..
우편으로 접수하고자 할 경우 "대전 서구 둔산동 920 정부대전청사 특허청장, 302-701"로 보내면 된다.
온라인 접수의 경우 전자문서이용신고서를 제출하고 특허청 홈페이지에서 신청 가능.
6. 수수료 납부
수수료를 납부한다.
수수료 계산기를 이용해서 계산해보자.. 돈이 좀 든다. ㅡㅡ;;
http://kporc.kipo.go.kr:7073/jsp/ir/common/feeCalculation_M.jsp
7. 출원공개
출원된 서류는 18개월뒤 자동공개된다. 더 일찍 공개하고 싶으면 서류로 신청..
8. 심사청구 및 심사
삼사청구기간은 출원일로부터 5년이내, 결과는 통지서로 알려준다.
9. 등록료 납부
등록결정서와 함께 발급되는 납입고지서를 이용해서 등록료 납부..
우체국이나 은행에서 납부하면 되지만, www.giro.or.kr에서 온라인으로도 납부 가능..
추가 1. 특허청에서 제공하는 특허 모범명세서 샘플
http://www.kipo.go.kr/kpo2/user.tdf?a=user.html.HtmlApp&c=4036&catmenu=m04_04_03_01
추가 2. 특허청 출원신청가이드
http://www.kipo.go.kr/kpo2/user.tdf?a=user.html.HtmlApp&c=4031&catmenu=m04_04_01#03
추가 3. R&D 특허센터 (단순회사가 아니라 연구개발하시는 분들이라면.. 이쪽도 들러보시길..)
referenece : 특허청(www.kipo.go.kr)
written by chamcham
from knu vrlab.
[ 펌 ] I, B, P frame
(출처 : 지식인 poroly97 (2005-11-04 09:50 작성))
자료 찾다가... 의외로 지식인에도 이래저래 잘 적어놓은 글이 있길래..
중복해서 붙어있는거 보니... 어디서 긁은것 같긴하지만 뭐.. 여튼..
-----------------------------
I 프레임 - Infra Frame 의 약자로, 쉽게 말해 키 프레임 입니다. 이것은 JPEG 같은 방식으로 소스로부터 직접 압축되어 온 전체 그림이죠. 가장 화질도 좋지만 가장 용량도 큽니다.
P 프레임 - Previous 또는 Predicted Frame 이라 불리며, 이전에 나온 키 프레임의 정보를 바탕으로 구성된 프레임 입니다. 화질/용량 둘 다 중간급입니다.
B 프레임 - Bidirectional Frame 의 약자로, 전후의 I/P 프레임의 정보를 바탕으로 구성된 프레임 입니다. 화질/용량이 다 최하급입니다.
MPEG-1/2 인코딩에 대한 몇가지...
요즘 miniDVD 를 시작해 보려는 분들이 좀 계심에 따라, 제 생각에 이런것 관련에 의문이 생길수 있을듯한 사항에 대해 간단히 적어볼까 합니다. 처음 하시려는 분들은 일단 이런 저런 옵션들이 있지만 이것들이 어디에 어떻게 쓰이는지 알수가 없는 이유로 헷갈리시는 경우도 많죠.
일단은 제가 TMPGEnc 위주로 사용을 하므로, 다른 인코딩 프로그램들에 대한것은 뭐라 말씀드리기가 어렵군요.
하지만 MPEG 인코더들의 옵션은 거의 다 비슷비슷 하기 때문에 여기 적는것이 다른곳에도 응용될수 있을거라 생각하는 바입니다.
1. GOP (Group of Pictures)
이것은 MPEG-1/2 인코딩의 가장 기본으로, 키 프레임부터 다음 키 프레임까지의 프레임 모음을 뜻하는 겁니다.
프레임 타입에는 I, P, B 의 세가지가 있으며 각각의 특징은 아래와 같습니다.
=====================================================================
I 프레임 - Infra Frame 의 약자로, 쉽게 말해 키 프레임 입니다. 이것은 JPEG 같은 방식으로 소스로부터 직접 압축되어 온 전체 그림이죠. 가장 화질도 좋지만 가장 용량도 큽니다.
P 프레임 - Previous 또는 Predicted Frame 이라 불리며, 이전에 나온 키 프레임의 정보를 바탕으로 구성된 프레임 입니다. 화질/용량 둘 다 중간급입니다.
B 프레임 - Bidirectional Frame 의 약자로, 전후의 I/P 프레임의 정보를 바탕으로 구성된 프레임 입니다. 화질/용량이 다 최하급입니다.
=====================================================================
이것들의 순서는 대충 I B B P B B P B B P B B I B B P ... 식으로 I 프레임들 사이에 P 프레임들이, I/P 프레임들 사이에 B 프레임이 들어가는 방식으로 구성됩니다. 그리고 I 프레임부터 다음 I 프레임 전까지를 하나의 GOP 로 묶고, GOP 크기는 그 프레임들의 갯수가 되죠. 고로, 위와 같은 경우엔 GOP 크기는 12가 됩니다.
보통 MPEG 인코더들엔 저것을 설정하는 방법이 P 프레임의 갯수와 B 프레임의 갯수를 설정하게 되는데, P 프레임의 갯수는 GOP 안에 들어가는 P 프레임의 갯수고, B 프레임의 갯수는 I/P 프레임 사이에 들어가는 갯수입니다.
고로, 위와 같은 경우 P 프레임 갯수는 3, B 프레임 갯수는 2 가 됩니다.
이 GOP 관련에는 두가지 옵션이 있습니다.
Scene Detection 이라 불리는 기술과 Closed GOP 라고 하는 것이죠.
Scene Detection 은 요즘 웬만한 코덱에는 다 붙어있는 것으로, 화면이 바뀌는것을 감지해서 거기에는 I 프레임 (avi 의 경우 키 프레임)을 끼워넣는 방식입니다. 아무래도 다른 프레임들은 딴 프레임들에 의존하는 프레임들이니, 그런 프레임들과 현재 프레임에 변화가 크면 그만큼 화질이 떨어지게 됩니다. 움직임이 빠른 장면에서 깍두기들이 많이 생기는 이유도 이와 같은 것입니다. 하지만 장면 변환시마다 키 프레임을 넣어주면 용량은 좀 불겠지만, 화질 면에선 많은 향상을 가져올수가 있죠.
Closed GOP 는 GOP 구성중 다음 I 프레임 전의 B 프레임들을 빼 버리는 방법입니다.
그러니
I B B P B B P B B P B B I B B P ... 가 아니라,
I B B P B B P B B P I B B P ... 가 되겠죠.
이것을 하는데는 여러가지가 있습니다만, 첫번째로 이것을 하는 이유는 MPEG 편집시의 용이함 때문입니다.
동영상을 자를 경우, 재인코딩 하지 않는 이상 반드시 첫 프레임은 I 프레임, 그러니 키 프레임이어야 합니다.
그 외의 프레임들은 그 앞에 나온 프레임들의 정보를 이용하는데, 첫 프레임은 앞에 아무 프레임도 없으니 그런 의존적 프레임들이 위치할수가 없습니다.
그리고 MPEG-1/2 의 경우 마지막 프레임은 반드시 I/P 프레임이어야 하죠. B 프레임은 위와 같은 이유로, 뒤에 나오는 프레임을 이용하는데, 뒤엔 아무 프레임도 없으니 올수가 없습니다.
헌데 위의 보통 GOP 의 경우 동영상을 자를때 어디를 잘라도 몇개의 프레임이 소실됩니다.
예를 들면
I B B P B B P B B P B B // I B B P ...
// 위치를 자를 경우 뒤쪽 부분이야 첫 프레임이 I 프레임이니 문제가 없지만, 앞쪽 부분은 붉은색으로 표시된 마지막 프레임이 B 프레임들이므로 이 두개의 B 프레임이 소실됩니다. 물론 부분 재인코딩을 해 주는 프로그램도 있고, 그런 경우 그 부분을 다시 압축해서 맞는 프레임으로 바쭤 주기도 하지만, 이럴 경우 그 하나의 GOP (프레임 하나만을 재인코딩 할수는 없고, 반드시 그것을 포함하는 GOP 전체가 재인코딩 되어야 합니다)는 화질이 뚝 떨어지게 되죠. 단순히 자르고 붙이는 편집시에 이런 문제는 그리 달가울리가 없습니다.
하지만 Closed GOP 를 사용할 경우
I B B P B B P B B P // I B B P ...
위와 같이 되니, // 부분을 잘라도 전혀 문제가 없게 됩니다. 그러니 자르고 붙이기가 더 용이해지죠.
두번째 이유는...
I B B P B B P B B P B B (I) B B P ...
예를 들어 (I) 부분에서 장면이 전환되었다고 할 경우, 그 바로 앞의 붉게 표시된 두개의 B 프레임은 파란색으로 표시된 앞의 P 프레임과 바뀐 장면의 I 프레임의 정보를 이용하게 됩니다. 그렇게 될 경우 완전히 다른 두개의 프레임의 정보를 이용하게 되므로 심각하게 화질이 떨어지게 됩니다. 하지만 Closed GOP 를 사용할 경우 저런 문제가 사라지므로 약간의 화질 향상을 기대할수 있습니다.
참고로, 이전에 나왔던 Dazzle DVC 2 의 경우, 저런 상황에서는 저 두개의 B 프레임이 완전히 깨져 버리더군요. 요즘엔 고쳐 졌을지 모르겠습니다만.
이것이 위의 Scene Detection 과 같이 사용되면 더 나은 화질을 기대할수 있을지도 모르겠군요. 아, 물론 Closed GOP 사용시 전체적인 용량이 좀 늘어날겁니다.
(참고로, GOP 앞엔 Sequence Header 라는 것을 넣을수도 있는데, 안 넣어도 그냥 재생엔 문제가 없습니다만, 이것을 매 GOP 마다 넣지 않으면 DVD 로 제작했을시 재생 시작하자마자 멈춰버리거나 하는 현상이 생깁니다. 그러니 DVD 제작용이라면 Sequence Header 간격을 반드시 1 로 주시길)
GOP 에 대한 마지막으로, 어떤 정도가 가장 화질에 좋느냐는것에는 정확한 답이 없습니다. 움직임이 빠를수록 GOP 는 작은게 좋고, 움직임이 느릴수록 GOP 는 큰것이 좋죠.
B 프레임이 화질은 비록 최하라 해도, 움직임이 거의 없어서 앞의 프레임을 그대로 복사해 오는 정도가 된다면, 이건 최소의 용량으로 공짜 화질을 얻게 되는 셈입니다. 이럴경우 전체적으로 용량이 작아질테니 보다 높은 설정을 사용해서 전체적으로 화질을 더 올릴수가 있죠.
반대로 I 프레임이 화질이 좋다고 해서 이것만을 사용하게 된다면, 이것은 화질이 좋다고 해도 용량을 많이 먹게 되므로, 원하는 용량에 맞출 경우 설정이 엄청나게 낮아질수밖에 없고, 고로 전체적으로 화질이 엄청나게 떨어져 버리게 됩니다. 대신 움직임이 아무리 많아도 특별히 더 떨어지는 부분은 없게 되겠죠.
쉽게 비교하면, 정해진 용량에 동영상을 맞춘다고 할 경우, B 프레임이 많으면 전체적인 화질이 좋아지지만 급격한 움직임에서 화질이 떨어지게 되고, I/P 프레임이 많으면 급격한 움직임에도 특별히 화질이 떨어지진 않지만, 전체적으로 화질이 많이 떨어지게 됩니다.
그러니 저용량 고화질의 조건은 이 세개를 어떻게 잘 조합하느냐지, 화질이 좋다는 것만 골라서 쓰는것이 아닙니다.
정 화질을 높이고 싶으시면 Scene Detection 과 Closed GOP 를 같이 사용하시면 보다 나은 효과가 있을 겁니다.
2. Color Space
보면 MPEG 인코딩시 YUV 4:2:0 또는 YUV 4:2:2 등의 것이 있는데, 이게 무엇인지를 설명하려 하는 것입니다.
아시다시피, 컴퓨터의 색상은 RGB 로 결정됩니다. RGB 는 말 그대로 Red/Green/Blue 가 합해져서 색을 표현하는 방식이죠. 가장 이해하기 쉬운 방식이기도 합니다. RGB 24 이 경우, 각각의 RGB 채널이 8비트, 즉 256 색을 낼수 있고, 이것을 섞어서 여러가지 색을 구현합니다.
하지만, TV 의 신호는 약간 다릅니다. 사람의 눈은 색 변화보다는 밝고 어두움의 정도에 더 민감합니다. 색맹이라도 밝고 어두운건 구별합니다. 뭐 깊게 설명하자면 사람 안구 내의 빛을 감지하는 세포가 두종류가 있고 각각이 어쩌구 저쩌구 하게 설명할수도 있지만, 이런건 넘어가고... =_=
그래서 이것을 이용하는 방법이 YUV 라는 방법입니다. 여기서 Y 채널은 밝기 채널, Luminance Channel, 줄여서 루마 채널이라 불립니다. 나머지 UV 채널은 컬러 채널이죠. Chrominance Channel, 줄여서 크로마 채널이라 불립니다. 두개의 크로마 채널은 색만을 기록하고, 루마 채널에서 이것의 밝기를 조절하죠. 예를 들어 남색과 하늘색이 있을 경우, 크로마 채널의 색은 하나지만, 루마 채널에서 밝기를 조절함으로써 어두운 파란색과 밝은 파란색의 효과를 내는 겁니다.
여기서 두개의 크로마 채널이 없이 달랑 루마 채널 하나만 있다면 그것은 흑백이 됩니다.
YUV 중에서 가장 높은건 YUV 4:4:4 로, 주로 편집시에나 쓰입니다.
이것은 루마 채널이 8비트, 두개의 크로마 채널이 각각 8비트 해서, 실질적으로 RGB24 와 동일합니다. 이것은 모든 픽셀이 각각의 루마값과 크로마 값을 갖게 되죠. RGB ↔ YUV 도 별로 어렵지 않습니다.
헌데, TV 방송에는 YUV 4:2:2 를 사용합니다.
이것은 루마 채널은 여전히 8비트지만, 다른 두개의 채널은 각각 절반인 4비트씩밖에 되지 않는 것입니다. (뭐 4비트라고 하긴 좀 의미가 다르긴 하지만요) 고로, 용량을 RGB 16 과 같은 용량밖에 먹지 않습니다.
그럼 이것의 구성은 어떠냐 하면, 사용하는 색 수를 줄이는 것이 아니라, 하나의 색이 하나의 픽셀이 아닌, 두개의 픽셀에 영향을 주는 것입니다. YUV 4:2:2 의 경우, 모든 픽셀은 각각의 루마값을 갖지만, 매 가로 두 픽셀은 하나의 크로마 값밖에 갖지 못하죠.
그러니 이 두개의 픽셀은, 하나는 남색, 다른 하나는 하늘색이 될수 있지만 (루마값은 다르지만 크로마 값은 같은), 하나는 파란색, 하나는 빨간색이 될수는 없습니다. 하지만 아주 칼같이 깨끗한 화면이 아닌 이상, 이런것은 거의 구별할수가 없습니다.
다음으로 YUV 4:1:1...
이것은 NTSC DV 에 사용되는 방식으로, 역시 매 픽셀은 각각의 루마 값을 갖지만, 크로마 값은 가로로 4개의 픽셀당 하나씩밖에 가질수 없습니다. 고로 역시 위와 같이 이 4개의 픽셀은 다른 색을 가질수는 없습니다.
다음으로 YUV 4:2:0 는 MPEG-1/2 에 사용되는 방식인데 (HDTV 는 YUV 4:2:2 입니다만), 이것은 역시 루마 값은 각각이지만 크로마 값은 가로 2픽셀, 세로 2픽셀의 2x2, 총 4개의 픽셀당 하나씩밖에 갖지 못합니다. 쉽게 말해 YUV 4:1:1 과 비슷하지만, 픽셀들의 위치만 다른 셈이죠.
이렇게 볼때, 매 픽셀마다 하나씩의 크로마 값을 준다면,
YUV 4:4:4 는 루마/크로마 채널이 전부 720*480 크기지만,
YUV 4:2:2 는 루마 채널은 720*480, 크로마 채널은 360*480 인 셈이고,
YUV 4:1:1 은 루마 720*480, 크로마 180*480,
YUV 4:2:0 는 루마 720*480, 크로마 360*240 인 셈입니다.
크로마 채널들은 저 크기를 늘려서 맞추는 셈이죠.
그러니 이렇게 형식이 달라진다고 해서 보이는 색이 달라져 보이는 것이 아니라, 선 주위에 색이 얼마나 번져 보이느냐의 차이밖엔 없습니다.
보통 DVD 애니 등을 divx 등으로 립을 했을때, 선 주변이나 타이틀 근처에 파랗게 색이 번져 보이는 경우가 있는데, 보통 이런 이유입니다.
참고로 아날로그의 경우...
LaserDisc 등은 4:2:2 입니다. 그러니 컬러 채널 면에서는 DVD 보다 좋죠. 하지만 아날로그의 단점은 이 컬러 채널들에 노이즈가 굉장히 쉽게 낀다는 겁니다. 그리고 선 주변의 디테일에 흔들림이 많아서 무지개 색처럼 색이 찢어지거나 하는 경우가 많죠.
이런 이유로 LD 가 DVD 보다 화질이 떨어져 보이는 겁니다. 하지만 LD 의 루마 채널은 보통 굉장히 깨끗한 편이고, DVD 처럼 선 주위에 희미하게 압축 노이즈가 나타나거나 하는 것도 없으므로, 만일 흑백으로만 동영상을 캡쳐한다면 DVD 보다 LD 쪽이 더 나은 화질을 낼겁니다. 흑백에 화질이라고 할만한게 있을지 모르겠고, 덤으로 이런 일을 할 사람이 있을지는 더더욱 의문이지만요.
만일, 컬러 채널의 노이즈를 완벽하게 제거할수 있는 필터가 있다면, LD 쪽이 DVD 쪽보다 더 나은 화질을 내게 될지도 모르겠군요.
VirtualDub 의 TV 필터에서 IQ 채널 3x3 필터를 사용하면 나름대로 이 컬러 채널 노이즈를 뭉개 줍니다.
3. 그 외
MPEG-2 에는 3가지의 인코딩 모드가 있습니다.
Progressive, Interlaced, 3:2 Pulldown when playback (TMPGEnc 용어로 따졌을때) 가 그 3가지 입니다.
Progressive, 또는 Non-interlaced 라는건 보통 다른 모든 동영상이 압축되는 방식입니다.
프레임 단위로 압축해 넣는 방식이죠. 대신 화면에 인터같이 문제가 있을 경우엔 그것이 그대로 보이게 됩니다.
Interlaced 모드는 하나의 프레임을 두개의 필드로 나눠서 각각을 따로 압축하는 방식입니다. 그러니 720*480 프레임 하나를 720*240 프레임 두개로 나눠서 압축하는 셈이죠. 이것은 재생시 Weave 라고 하는, 이 두개를 다시 그대로 합해서 보여주는 방법과, BOB 라고 하는, 각각의 720*240 크기 프레임들을 720*480 으로 늘려서 보여주는 방식이 있습니다 (물론 BOB 의 경우 프레임 레이트가 두배가 되어 버리겠죠)
이것의 장점이라면 보통 인터 현상이 나타나는 프레임은 두개의 필드가 어긋나서 생기는 것이므로, 이 모드로 압축하면 그런거 문제 없이 압축이 가능하고, 재생할때도 BOB 모드로 재생할시 그런것이 전혀 보이지 않게 됩니다. 대신 용량을 좀 더 먹게 되죠.
참고로, 이 모드는 23.976 인 소스에는 사용할수 없습니다.
(주의: 이 모드로 압축할 경우엔 어떤 필드가 먼저 재생되는지를 설정하게 되는데, 보통 DVD 는 Top Field 가 먼저입니다. 때에 따라 Odd Field 라고 나오기도 하죠. 그러니 TMPGEnc 를 이용, Interlaced 모드로 압축하신다면 반드시 Advanced 탭에서 Top Field First 라고 되어 있는지 확인하시기 바랍니다. 잘못 설정하면 재생시 움직임마다 계속 뒤로 튕기는 것 같은 현상이 나타납니다.)
마지막으로 3:2 Pulldown when playback 라는 것은, 23.976 소스에만 사용할수 있는 것으로, 보통 TV 등의 progressive 재생을 지원하지 않는 곳에서 재생시엔 자동으로 29.97 프레임으로 늘려서 보여주는 방식입니다. 하지만 프로그레시브 지원의 DVD 플레이어나 컴퓨터에서 재생시 그대로 23.976 으로 보여주게 되죠. DVD2AVI 에서 필름 소스라 표시되는게 이 방법으로 압축된 겁니다.
이것의 장점이라면 당연히 실질적으로 프레임 수가 20% 적으니 그만큼의 화질 향상을 기대할수 있습니다. 그리고 또한, 동영상 정보에는 29.97 로 기록되므로, 진짜 29.97 프레임인 동영상과도 문제 없이 연결됩니다. (연결했을시, 플레이어에 따라 연결 지점에서 잠시 버벅대는 경우가 발생할수 있습니다만) 그러니, DVD 소스를 Inverse Telecine (IVTC) 처리를 해서 23.976 으로 바꿨을 경우, 반드시 이 모드로 압축하시는 것이 좋습니다. 그냥 Interlaced 모드로 압축하는것을 잘 처리해서 이 모드로 압축할 경우 30 ~ 40% 정도의 용량 절약 효과가 있습니다.
일단 이정도만 알고 계시면 제작에 큰 문제는 없으실듯 하군요.
Quantization 설정 같은건 아직 저도 잘 모르겠으니 넘어가고... 한마디 하자면, 딴 MPEG 인코더 같은 경우 Quantization 값을 설정할수 있는 경우가 있는데, 간단하게 말해 이 값은 낮을수록 원본 화질에 가깝게 됩니다. 그렇다고 너무 낮추면 눈에 보이는 향상은 없으면서 용량만 커 지니 주의를... MPEG-1/2 인코딩에 대한 몇가지...
요즘 miniDVD 를 시작해 보려는 분들이 좀 계심에 따라, 제 생각에 이런것 관련에 의문이 생길수 있을듯한 사항에 대해 간단히 적어볼까 합니다. 처음 하시려는 분들은 일단 이런 저런 옵션들이 있지만 이것들이 어디에 어떻게 쓰이는지 알수가 없는 이유로 헷갈리시는 경우도 많죠.
일단은 제가 TMPGEnc 위주로 사용을 하므로, 다른 인코딩 프로그램들에 대한것은 뭐라 말씀드리기가 어렵군요.
하지만 MPEG 인코더들의 옵션은 거의 다 비슷비슷 하기 때문에 여기 적는것이 다른곳에도 응용될수 있을거라 생각하는 바입니다.
[MFC] Application 프로그래밍시 알아두어야 할 지식
http://blog.naver.com/sanghaa123/150008917285
- asmx(웹 서비스)파일로부터 프락시(Proxy) 클래스 얻어오는 방법
MFC(Microsoft Foundation Class)
- 트레이 아이콘(Tray Icon) 사라지는 버그 막기
- 매핑 모드 사용하여 확대 축소 구현하기
- 인터넷 익스플로어 제어와 관련된 Knowledge Base
- 선택 영역에 줄번호 붙여주는 매크로
- Web으로부터 컨트롤을 다운받아서 실행하는 VC예제
- 현재 작업중인 프로젝트의 폴더를 열어주는 매크로
- 로컬 폴더에 있는 DLL 사용하게 만들기
- Dialog Base 프로그램을 Tray에 등록할 때 문제점
- FlashWindow를 사용하여 내 프로그램의 존재를 알리자
- 자신의 IP 얻기
- 스플리터 윈도우 위치 고정하기
- Dialog Box의 Control에 Tooltip넣기
- 타이틀 바가 없는 프로그램에 아이콘을 나오게하는 법
- 슈퍼 클래싱과 서브 클래싱
- 마지막 에러코드 Watch창으로 나타내기
- 네트웍 어드레스 변환 방법
- CWinApp에서 명렁어 인자 분석 방법
- ToolBar에서 256이상의 Color사용
- 특정 확장자명으로 프로그램 실행시키기
- Volatile
- 어셈블된 코드 보기
- ATOM을 이용한 프로세스간 데이터 공유
- WM_COPYDATA 를 사용한 메세지 전송
- TrackMouseEvent 구현하기
- 필요없는 warning 은 보기 시러~~
- 파일의 특정 부분의 warning level을 지정하기
- CFileDialog에서 초기 경로명 지정하기
- 256색 이상의 Bitmap ImageList 만들기
- List Control 에 다른 Control 넣기
- 초 간단!! 시스템 이미지 리스트 얻어오기
- CStringArray 정렬하기
- MFC Dialog Box에서 자신의 Class Name설정
- 사용자 정의 Common Dialog 만들기
- 사용자 정의 Common Dialog에서 Common Dialog자원의 위치 설정
- 자기 프로세스의 복사본을 만드는 방법
- 일반적인 Child Window 만들기
- CSocket 과 CAsyncSocket에서 Thread문제
- SearchPath()의 리턴값 알아보기
- 화면 캡쳐 소스
- Dll에 breakpoint 설치하기
- 윈앰프처럼 TaskBar와 SystemTray 마음대로 주무루기
- Winamp 처럼 벽에 붙이기
- Title바 마음대로 하고 싶나요?
- Toolbar안에 다른 Control넣기
- 문자열 검색 API
- 자신만의 윈도 class name을 가지자
- Coverage가 90% 이하면 안돼요~~~
- _ASSERTE 가 GetLastError()를 망친다
- Explorer처럼 툴바에 Text 넣기
- MDI(Multiple Document Interface) application에서 초기 뷰 없애기
- Dll 찾는 순서
- DLL 파일의 이름 알아보기
- 메인 프래임 윈도우에 얼굴을 부여하기
- Break Pointer 는 INT 3 으로 통한다!!
- 두 변수의 값을 바꾸는 환상의 매크로
- 안전하게 free, delete하는 방법
- 윈도에 포커스가 가지 못하게 하기
- TreeCtrl 에서 Context Menu 사용하기 -번역은 나중에
- 랭귀지 팩을 만들자!!
- Visual C++ 이 만드는 파일의 의미
- 툴바에 Dropdown버튼 넣기
- VC++의 Quick Macro
- VC++에서도 Regular Expression으로 검색할 수 있다
- Dll에서 제공되는 함수들 보기
- 공유 섹션 만들기
- 화면 보호기 제어하기
- 바탕화면, 즐겨찾기, 내 문서 등의 패스얻기
- CAsyncSocket 에서 도메인 주소 바로 사용하기
- bool과 BOOL의 차이
- TRACE를 잠깐 못쓰게 만드려면
- DirectX에서 리턴값 확인은 FAILED매크로를 사용하도록 하자
- DirectDraw에서 Control Box 사용하기
- CFrameWnd가 아닌 윈도우에서 툴바의 툴팁 출력하기
- Dialog Bar 만들기
- Toolbar에 버튼 추가하기
- 화면 정보 얻어오기
- 절전 기능 및 화면 보호기 제어하기
- 절전 모드로 진입을 거부하는 방법
- Console 프로젝트와 Windows 프로젝트 바꾸기
- Ansi 문자열과 Unicode 문자열 바꾸기
- 문자열을 _T() 형으로 바꿔주는 매크로
- Resource ID 이름 짓는 방법
- Little or Big Endian
- Alt+F4 키로 종료되는거 막는 방법
- 프로그램내에서 한/영 전환하기
- pair 라는 것의 용도는?
- WORD 특정 비트값 알아내기
- 일반적인 윈도우 소멸 순서
- 메모리 DC 사용하기
- DirectDraw에서 256색 Bitmap 간편히 사용하기
- Source Safe과 Project를 분리시키기
- 실수(소수점) 나누셈 연산을 정수 연산으로 하기
- 프로그램안에서 Registry 이름 지정하기
- 특정 Registry Key안의 Value값 가져오기
- Registry에 File Icon등록해주기
- '객체 삽입' 상자 없이 객체 삽입하기
- 윈도우즈 강제로 종료하기
- 재밌는(?) 시스템 강제로 다운시키기
- Document없는 CRichEditView에 Ole객체 삽입 막기
- 비교 연산자를 위한 예약어들
- Dialog Based 프로그램에서 가속키 기능 넣기
- 투명한 윈도우 만들기 (w2k만)
- 현재 실행되고 있는 자신의 경로와 파일명 가져오기
- 프로그램 한번만 실행하기
- MFC 모듈의 상태 데이터 관리하기
- Dialog Based 프로그램에서 '최근 사용한 파일 목록' 메뉴 넣기
- Override를 통해 잃어버리는 것들
- 특정 파일의 Property 창 띄우기
- Serialize를 이용한 객체 복사하기 (Copy constructor)
- CWinThread로 UI Thread 만들기
- Socket에서 완벽한 Receive처리
- [API/SHELL] 디스크 복사 및 포맷...
- [API/SHELL] 프로그램 추가 삭제 / 원도 구성 요소 추가 다이얼로그 띄우기
- 원하는 확장자파일만 지우기
- CEdit control의 font 바꾸기
- 연결 프로그램 찾기 다이얼로그 띄우기
- Visual Basicⓡ처럼 property 다루기
- Func()
- [ATL] 새로운 인터페이스 추가하기
- 생성자 두 번 호출되는 버그
- LastError를 보여주는 Debugging Trace Macro
- 할당된 블록의 크기 구하기
- [Win32/C++]템플릿을 이용한 동기화 클래스 만들기
- Visual Studio Macro
- auto_ptr
- explicit
- Unicode/MBCS(DBCS)/ANSI/TCHAR
- String Conversion Macro
- upper_bound/lower_bound
- stringstream
- CD Rom 드라이브 구하기
- WebBrowser 로 부터 키보드 메세지 가로채기
- CDROM Insertion / Removal 감지하기
- 입력 컨트롤에서 허용하는 문자를 제한하려면
- History ComboBox
- HBITMAP을 BMP 파일로 만들어 주는 함수
- FTP 로 파일 전송하기
- ATL Browser - SmileBrowser v0.1
- 레지스터 설명
- 어셈블러 쉽게 쓴 강좌
- 내가 만든 타입 자동으로 확장하기
- watch 창에서 심볼의 출력 타입 정해주기
- Thread 생성시 어떤 API를 사용해야 하는가?
- LAN에 연결된 모든 스테이션에 broadcasting하기
- ActiveX를 무조건 다운로드 하게 하기
- ATL Debugging Support #1
- 웹페이지가 이동될때 진입하는 함수
- GetMessage() PeekMessage()
- based addressing
- 다이얼로그 리소스의 실제 크기 얻기
- 문자열에서 드라이브,디렉토리,파일이름, 확장자 정보 가져오기
- Bitmap 이미지 resizing 하기
- 프로파일링(Profiling) 기능 활용하기
- template으로 구조체 초기화 하기
- 사용하지 않는 인자에 대한 warning 없애기
- 포인터 변수를 검증하기위한 매크로
- #define 보다는 const와 inline을 사용한다.
- malloc과 free 보다는 new와 delete를 사용한다.
- 메모리가 모자랄 경우에 대비한다.
- operator new 와 operator delete 작성시 관례를 따른다.
- 캐럿의 위치 알기
- URL을 파싱하자
- Lite control에서 이벤트가 가능하게 하기
- 소스로 바로가는 TRACE
- Watch 창에서 함수 실행하기
- 파일로 트레이스 하도록 바꾸기 (3줄이면 됨)
- MFC에서 NULL을 비교하는 것은 의미가 없다.
- Floating-Point Error가 Exception을 발생하도록 만들기
- First-chance exception 에서 Stop 하도록 만들기
- exception 클래스 확장하기
- INF file Architecture
- GUID 생성하기
- VC의 IDE를 편하게 쓰는 도구[1]
- VC의 IDE를 편하게 쓰는 도구[2]
- new의 정상 형식을 감추지 않는다.
- operator new를 작성한다면 operator delete도 작성한다
- 동적으로 할당되는 메모리를 갖는 클래스를 위해서는 복사 생성자와 치환 연산자를 선언하라.
- 생성자에서 치환보다는 초기화를 사용한다.
- 클래스에 선언된 순서에 따라 멤버 초기화 리스트에 멤버들을 나열한다
- Edit 컨트롤에서 Tab 키 넣기
- [VB] QueryInterface하는 방법
- [ActiveX] VBScript에서는 QueryInterface가 않된다.
- [ActiveX] VBScript에 User-Define Interface 노출하기
- ATL 디버깅 정보 출력하기
- [ActiveX] 키보드 메세지 받기
- OLE Activation 될때 컨테이너의 툴바 살리기
- 인터넷 Short-Cut 만들기
- StrouStrup의 좋은 기사 3개 Link
- WTL 3.1
- WTL 도움말
- CreateFile 이용시 주의사항
- DLL 로드 시간 성능 최적화 하기
- GUID를 문자열로... 문자열을 GUID로
- 트레이 메뉴가 사라지지 않을때
- 대용량의 파일 순식간에 읽기
- Error LNK2001: '_WinMain@16': Unresolved External Symbol
- Hatch 가 밀려나오는 브러시 수정하기
- Brush 의 패턴을 사용하여 스킨 구현하기
- ATL Object가 한글 폴더 있으면 등록 안되는 버그
- ActiveX 컨트롤에서 사용할 디지털ID 발급 받는 방법
- [VB] 패키지 마법사 최적화 하기
- MFC 라이브러리에 동적으로 링크된 정규 DLL
- 원격 디버깅 하기
- 왼쪽에 이미지 들어가는 메뉴추가하기
- 2000 에서 나오는 파일 저장 다이얼로그 사용하기
- 콤보박스나 에디터 상자에서 입력 자동 완성 기능
- 폴더내의 dll 한 번에 등록하기
- 폴더 선택 다이얼로그 사용하기
- 윈도우즈 작업 관리자 기능 살펴보기
- Delayload 적용시키기 (매우 쉬움)
- Dll Rebase 시키기 (역시 쉬움)
- Win32 버퍼 오버플로어 관련 문서
- local folder에 있는 dll 사용하게 만들기
- ActiveX Control을 View에서 사용하기
- Web으로부터 컨트롤을 다운받아서 실행하는 VC예제
- 인터넷 익스플로어 제어와 관련된 Knowledge Base
- w2k에서 Process Tree 보기
- 줄번호 매겨주는 매크로 입니다.
- DbgChooser from Bugslayer
- 특정 컨트롤에서 한글을 입력받고 싶지 않을때
- 홈페이지 소스 가져오기
- OPCODE 설명서
- ASCII 코드 설명서
- inline assembly에서는 C++맴버변수로 접근 불가
- Unicode Conversions in Visual C++
- 실행 파일(바이너리)에서 파일 이름 가져오기
- 디버깅 관련 KB(Knowledge Base) 모음집
- 디버깅 관련 책 정보
- Coding Techniques and Programming Practices
- The Basics of Programming Model Design
- [ActiveX] automation을 편하게 쓰는팁
- IME 입력기 예제입니다.
- 특정 DLL 을 사용하는 프로그램 알아보기
- [ATL] 나한테 연결했나?
- 인터넷에 연결되어 있는지 알아보기
- 파일 사이즈 별로 단위를 나누어서 출력하기
- 아스키 코드의 재미난 연산
- 이런 코드는 피하고 싶다
- 윈도우가 리사이즈될때 다시 그려야 하는 영역 얻기
- Visual C++ 이 사용하는 확장자 살펴보기
Advanced
- 함수의 호출 규약에 대해서 알아봅시다
- WaitCursor가 만들어지지 않는 경우
- Capture가 되지 않는 경우
- Queue를 함께 씁시다
- SendMessage는 어떻게 작동하는가?
- 친절한 메세지 ( benign message )
- 복잡한 ActiveX Control 라이센스 간단히 얻기
- LHCTRACE( light-weight!!!)
- LHCTRACE
- Advanced Breakpoint
- DECLARE_DYNCREATE()와 IMPLEMENT_DYNCREATE()
- TLS(Thread Local Storage)
- CreateWindow()
- Top 윈도우들의 핸들을 알수 없을까?
- 호출 관행
- C++에서 Internal Linkage를 갖는 몇 가지
- 배경이 투명한 Bitmap 그리기
- VC++에서 RTTI 사용하기
- OLE를 이용한 Drag and Drop
- 콜백함수의 구현
- 프로세스의 초기화와 종료 기다리기
- 향상된 RichEdit control (RICHEDIT20A)
- PowerPoint 파일을 Image 파일로 변환하기
- 실행파일 또는 DLL에서 파일버전 정보를 가져오는 방법
- CEdit - 리소스에서 파일을 여는 방법
- IPicture를 이용한 JPG, GIF, BMP, WMF, EMF, ICO 보기
- Child윈도를 Popup시키는 방법
- Set Next Statement 를 통해서 디버깅 하기
- 스레드에 이름 지어주기
- 툴바의 툴팁을 내가 원하는데로
- 정렬과 탐색 루틴이 필요하신 분
- 데이터 암호화 방법
- Dialog Base에 UpdateCommandUI Handler를 달자.
- Popup Menu에 UpdateCommandUI handler동작 시키기
- 함수대신 function object를 대입하자
- koenig lookup
- Win32 multithreading Performance
- 실행중인 자신의 파일의 fullpath를 정확히 알아내기
- ATL에서 error LNK2001: unresolved external symbol _main 해결하기
- Winsock 2.0 에 관련된 몇가지 것들
- Winsock 2.0의 단점들
- none MFC에서 memory leak난 부분 찾기
- ATL - warning MIDL2039 의 버그
- apartment간의 marshaling
- apartment 모델에 관한 이야기
- #File Error#
- DLL 에 대해서 알아보자.
- Simulating Dynamic Binding
- HANDLE 의 정체!!
- 특정 URL의 파일을 다운로드하기
- dll을 모든 프로세스에 로드시키기
- 특정 Port 가 사용중인지 알아보는 방법
- 스택에 동적으로 메모리 할당하기
- ActiveX 컨트롤로부터 URL 알아내기
- 프로그램의 수행 속도를 개선하는 방법
- 힙: 장점과 단점
- socket을 옳바르게 닫기
- release 에서 _set_new_handler() 가 동작하지 않는 경우
- Windows Structured Exceptions을 C++ Exceptions로 바꾸기
- if문을 사용한 경우와 Exception handling을 사용한 경우의 비교
- dispinterface의 특성
- 치명적인 오류가 발생하였을 때 프로그래머에게 알리기
- API hooking ( Dll 바꿔치우기~)
- 메모리 패킹
- VC++ 에서 OCX 내의 함수 직접 호출하기
- ActiveX 컨트롤 사용하지 않고 프로그램 실행하기
- ActiveX 컨트롤 설치할때 inf 파일에서 dll 순서 중요
- C 에서 최적화된 프로그램 만들기
- regsvr32.exe 를 사용하여 ActiveX 컨트롤 등록시 주의점
- PHP나 ASP 코드 직접 호출하기
ETC
- IE 에서 소스 보여주는 기능 막기
이 자료를 정리하신 분은 서우석이라는 분인데..정말 대단하다라는 생각이 듭니다.
어쩜 이렇게 정리를 잘 하셨을까.. 부럽다는 생각만 드는군요..ㅡㅡ
C#
↑ 클릭!