기본 콘텐츠로 건너뛰기

추천 가젯

Tmux 환경에서 Vim 컴파일 시 발생하는 termio/termios 감지 오류 해결 방법

 리눅스 환경에서 소스코드를 직접 빌드하다 보면 의외의 환경 변수나 터미널 세션 설정 때문에 엉뚱한 빌드 에러를 마주할 때가 있습니다. 대표적인 예로 Tmux 세션 내부에서 Vim 소스를 컴파일할 때 발생하는 termio/termios 감지 오류 가 있습니다. 이번 글에서는 해당 에러가 발생하는 원인과, 단순한 clean 으로는 해결되지 않는 이유 및 올바른 해결 방법을 정리합니다. 1. 문제 원인 Vim의 소스 코드 빌드 과정( configure )은 시스템이 System V 계열인지 Linux 계열인지 판별하기 위해 termio.h 와 termios.h 헤더 파일 및 터미널 인터페이스를 검사(Probe)합니다. 하지만 Tmux 내부(세션 안)에서 컴파일을 진행할 경우 , Tmux가 제공하는 PTY(Pseudo-Terminal) 환경과 TERM=screen 등의 특수한 환경 변수 영향으로 인해 Autoconf가 터미널 인터페이스를 검출하는 과정에서 오동작을 일으킵니다. 그 결과, 실제 시스템 조건과 무관하게 설정 에러를 발생시키게 됩니다. 2. 왜 make clean 으로는 해결되지 않을까? 일반적인 개발 과정에서는 빌드가 꼬였을 때 make clean 을 실행하곤 합니다. 하지만 make clean 은 컴파일된 오브젝트 파일이나 바이너리( .o 파일 등)만 삭제할 뿐, Autotools가 시스템 환경을 탐색한 결과로 남긴 캐시( config.cache 또는 내부 매크로 변수)나 설정 파일들은 그대로 유지 합니다. 일반적인 상황에서는 시스템의 하드웨어/OS 정보가 바뀌지 않기 때문에 이 잔여물이 문제가 되지 않습니다. 그러나 Tmux나 Screen 같은 터미널 멀티플렉서 환경에서 탐색된 왜곡된 정보가 캐시에 박혀버리면, 나중에 Tmux 외부(일반 터미널)로 나와서 빌드를 시도해도 이전의 오염된 캐시 때문에 계속해서 오류가 발생하게 됩니다. 3. 해결 방법 이 문제를 해결하기 위해서는 반드시 Tmux 외부 환경 에서 기존의 오염된 설정 파일을 ...

브로드캐스팅을 활용한, 소규모 영상제작시 타임코드 관리법.

 https://g.co/gemini/share/580748d10dd4

예시코드는,  브로드캐스트 방식으로 씬넘버 테이크넘버 등이 바뀔때 배포하는 것이며, 

일정시간 약 1~10분 정도마다 직접 배포도 하게 해놓으면 좋다. 


그외는 일정시간마다, 타임코드를 폰이 직접관리하게 하다가,   서버(로컬네트워크 노트북)

에 요청해서 접속해서 해당 데이터를 요청하는 방식으로 간다


그리고 timecode는 LTC를 사용하여 왼쪽 채널 오른쪽 채널로 내보낸다. 

화면에는 씬넘버 테이크 넘버, 노트북 관리자가 보내는 메시지등이 나오게 한다. 




listen.py  (브로드캐스팅 리슨)

import socket

import json


# 서버와 동일한 포트 번호를 사용

PORT = 5007


# UDP 소켓 생성

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)


# 모든 IP 주소로부터 오는 메시지를 받기 위해 '0.0.0.0'으로 바인딩

# '0.0.0.0'은 모든 네트워크 인터페이스를 의미

sock.bind(('0.0.0.0', PORT))


print("수신 대기 중...")


try:

    while True:

        # 패킷 수신 (최대 1024바이트)

        data, addr = sock.recvfrom(1024)

        

        # JSON 형식의 데이터를 디코딩

        message = json.loads(data.decode('utf-8'))

        

        print(f"[{addr[0]}]로부터 수신: {message}")


except KeyboardInterrupt:

    print("수신 중단")

finally:

    sock.close()


broadcast.py

import socket

import time

import json


BROADCAST_IP = '192.168.1.255' # 로컬 네트워크에 맞는 브로드캐스트 주소

# 만약 '255.255.255.255'를 사용하면 모든 네트워크 인터페이스를 통해 브로드캐스트 됨

PORT = 5007


# UDP 소켓 생성

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# 브로드캐스트 옵션 설정

sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)


try:

    while True:

        # 전송할 데이터 (타임코드 및 사용자 정보)

        timecode_data = {

            "timecode": {

                "hour": time.localtime().tm_hour,

                "minute": time.localtime().tm_min,

                "second": time.localtime().tm_sec,

                "frame": 0

            },

            "user_data": {

                "scene": "A01",

                "take": "1"

            }

        }

        

        message = json.dumps(timecode_data).encode('utf-8')

        sock.sendto(message, (BROADCAST_IP, PORT))

        print(f"Sent: {message.decode('utf-8')}")

        time.sleep(1) # 1초마다 전송


except KeyboardInterrupt:

    print("서버 종료")

finally:

    sock.close() 

댓글

  1. 텐타클 타임코드 제너레이터는 젠록도 없는놈이 한개에 40만원이나 한다.
    그냥, 핸드폰을 사용하자.

    어차피 세부 싱크는 맞춰야하는데, 1 2프레임은 사람이 고생하는게 낮다.
    그런데, 너무 낮은 수준에서는, 비디오 카메라에 따로 타임코드 수신부가 없는경우도 있고, 따로 붐마이크 녹음을 안하고 현장 녹음을 하는경우도 있어서, LTC를 수신할 포트가 없을 수도 있다.

    답글삭제

댓글 쓰기