목록전체 글 (33)
기록해야 기억에 남는다

1) 압축이란? 기본적으로 데이터에 중복된 요소들이 있을 것이라는 가정하에 실행 중복된 요소들을 이용해 인코딩 과정을 수행하고, 다시 원복하기 위해 디코딩 과정 수행 위에서 사용되는 인코더/디코더를 합쳐 코덱(codec) 이라고 함 인코딩/디코딩 과정에서 데이터 손실이 일어나지 않으면 비손실 압축, 손실이 일어나면 손실 압축으로 분류 비손실 압축의 경우 Run-Length coding, Huffman coding, LZW 등이 존재한다. 손실 압축의 경우 영상 데이터 등에서 주로 사용 됨 (데이터가 일부 손실 되어도 사람의 눈에 큰 차이가 없는 경우) 2) Run-Length Coding AAAAAAABBCCCDEEEEFFFFFFG 문자에 대해 (빈도수)(문자) 방식으로 압축 AAAAAAACCCEEEEF..

1) FFmpeg이란? 마이클 니더마이어의 주도 하에 개발되고 있는 오픈소스 프로젝트 LGPL / GPL 라이선스를 따르며, 모든 동영상 / 사진 포맷들의 인코딩/디코딩을 목표로 개발 진행 중 FFmpeg 자체는 오픈소스 이지만 FFmpeg 내에 사용되고 있는 H.264/H.265와 같은 유료 (로열티 문제) --- FFmpeg에서는 다음과 같은 기능을 제공함 --- ffmpeg - 미디어 포맷 변환 도구 ffplay - 간이 파일 재생기 ffprobe - 미디어 정보 표시 도구 ffserver - 라이브 방송을 하는 멀티미디어 스트리밍 서버. 버전 3.4이후 제거되었다. libavcodec - 오디오/비디오 코덱 라이브러리 libavformat - 멀티미디어 컨테이너의 디먹서/먹서 라이브러리 libav..

1) RecorderEndpoint callback 비디오 녹화를 위해 RecorderEndpoint 생성 시 이벤트 리스너 콜백 함수를 등록 해줄 수 있다. addRecordingListener - 녹화가 시작되면 호출되는 이벤트 리스너 등록 addPausedListener - 녹화가 일시정지 되면 호출되는 이벤트 리스너 등록 addStoppedListener - 녹화가 중단되면 호출되는 이벤트 리스너 등록 위 세 가지 메소드가 RecorderEndpoint에 정의되어 있고, 상위 클래스에도 추가적인 메소드들이 존재한다. RecorderEndpoint - UriEndpoint - Endpoint - MediaElement - MediaObject - KurentoObject 순으로 상속 관계 addMe..
프로젝트를 진행하며 동기로 동작하던 부분을 CompletableFuture를 이용하여 개선할 수 있었다. 이를 계기로 CompletableFuture에 대해 정리해보려고 한다. 0) Runnable Runnable을 implements 하고 run 메소드에 작업을 정의한 후 thread에 넘기면 비동기로 작업 처리 가능 작업의 경우 Thread를 만들어 Runnable을 넘기거나 Thread를 상속 받아 run을 정의 후 멀티 스레드로 처리 가능 Thread를 상속 받으면 확장이 불편해지므로 일반적으로 interface인 Runnable을 구현함 주의 할 것은 Runnable의 run 메소드를 직접 호출하면 메인 스레드에서 일반 메소드를 호출한 것과 같음 예시) Video를 처리할 수 있는 FFmpeg ..

1) MongoDB란? c++로 작성된 오픈소스 문서지향 데이터 베이스 MySQL, PostgreSQL과 같은 Relational DB가 아닌 NoSQL NoSQL이 Not SQL만 뜻하는 것이 아닌 Not Only SQL을 의미 → RDB의 한계를 극복하기 위해 만들어진 저장소 RDB와 달리 고정된 스키마 존재 X 2) Document란? BSON 형태로 되어 있는 데이터 (RDB의 record) 한 개 이상의 key-value 형태로 되어 있는 구조 _id 필드가 존재하는데, 12bytes의 hexadecimal 값이며 해당 document의 uid로 사용 _id: [ 4bytes: 현재 timestamp] [ 3bytes: machine id ] [ 2bytes: MongoDB 서버의 pid ] [..

(1) IndexElement, TextElement (1) IndexElement 채팅 생성 timeline (4bytes), file offset (4bytes) 로 구성 .idx파일에 8bytes 블록 단위로 기록 timeline값을 기준으로 file offset 값을 읽어올 수 있음 기존 설계의 경우 timeline 8bytes, file offset 8bytes 총 16bytes 였으나, 채팅 데이터 양이 그렇게 많지 않고 데이터를 줄이기 위해 int 2개로 처리 이론상 file offset 2^31 - 1 bytes 까지 기록 가능 (이후 overflow가 발생 하므로 long에 기록) 2^31 - 1 bytes의 경우 약 2GB 이므로 이 정도의 채팅 데이터가 쌓이게 되면 index 파일을 ..

1) Chat data file과 Index file을 이용 (1) About index file Index File에 16bytes 단위의 블럭을 기록 8bytes (long)의 경우 timeline 값을 기록, 나머지 8bytes (long)의 경우 File Offset을 기록 위와 같이 채팅 1개 당 16 bytes 블럭을 Index 파일에 기록 (2) About chat data file Index 파일을 읽어 각 블록의 앞 8 bytes를 통해 찾고자 하는 timeline 값을 조회 찾고자 하는 timeline을 포함한 block에서 뒤 8 bytes를 이용해 offset 값을 읽어옴 offset 값 만큼 seek 작업을 수행하여 file pointer를 이동 해당 줄의 chat data를 읽어..

1) What is Redis? Redis (REmote Dictionary Server)란 오픈소스 DBMS In-memory 방식으로 동작하며 (즉, 데이터를 디스크가 아닌 메모리에 저장) Key-Value 기반의 NoSQL In-memory 기반이므로 데이터 유실의 가능성 존재 Cache, 메세지 브로커 등의 용도로 사용 ex) 세션 등의 손실이 일어나도 비교적 무관한 데이터 저장, pub/sub을 이용한 메세징 시스템 구축 2) Redis의 특징 List, Set, Sorted Set, Hashes, Streams 등 다양한 자료구조 지원 key 값에 맵핑되는 value 값으로 list, hash 등 다양한 자료구조 이용 가능 Dump 파일, AOF (Append Of File) 방식으로 메모리 ..

1) STOMP란? - Simple text oriented messaging protocol - 메세지를 효율 적으로 전송하기 위한 프로토콜 - 기본적으로 pub/sub 구조를 따르고, websocket 위에서 동작합니다. - 스프링에서 stomp를 사용하게 되면 별도의 외장 브로커를 쓰지 않으면 내장 stomp broker 사용 2) STOMP 테스트는 어떻게? - websocket 위에서 동작하지만, 정해진 스펙이 있으므로 일반적인 websocket으로는 테스트 불가 - Apic, NodeJS의 stompjs 이용 3) Apic 3-1) How to use Chrome Extension에서 설치 가능 WS 탭의 Stomp 선택 Request URL에 서버 URl 입력 Subscription URL에..

P2P (mesh) vs SFU vs MCU (1) P2P (mesh) vs SFU vs MCU (2) * WebRTC connection architecture 별 특징 1. P2P (mesh) - Peer끼리 직접 통신하므로 '초저지연' 통신 가능 - Peer의 숫자가 늘어날 경우 Connection의 개수가 늘어나므로 '각 Peer의 부하 급증' - '소수 참여자'가 존재하는 화상회의 시스템에 적합 2. SFU (Selective Forwarding Unit) - 중앙 서버가 Peer들의 미디어 트래픽을 중계하는 방식 - 1:N, N:M 형식의 구조에 적합 - P2P방식보다 중앙 서버의 부하 증가 3. MCU (Multi-point Control Unit) - 중앙 서버에서 미디어를 혼합, 가공 (..