소니 AVCHD 파일 변환기 없이 맥북에서 읽어오기

이미지
 아주예전에 구입했던 소니 HDR-CX12 모델. 생각보다 쓰지 않고 처박혀 있던 녀석을 꺼낸 이유는 꼬맹이가 비디오 촬영에 흥미를 가졌기 때문이다. 다른 컴팩트 카메라를 한대 손에 쥐어 주었는데, 얼마전 찍은 동영상 아빠한테 보여준다고 뛰어오다 떨어트려서 아작이 나버렸다. ㅠㅠ 생각난 김에 처박혀 있던 카메라를 줄려고 꺼내어 보았는데, 특별히 문제 없이 동작중이다. 2008년 모델인데 아무 문제 없이 움직이고 있다. 사스가 소니! 다만 문제는 테스트 용으로 촬영한 동영상을 보려고 메모리 카드에서 파일을 읽어보니 달랑 AVCHD 란 파일 하나만 존재하고 있다. 혹시나 싶어 인터넷에서 매뉴얼을 찾아 읽어보아도, 전용 드라이버를 설치하라고 하는데, 이게 또 귀차니즘이 마구 몰려온다. 같은 avchd 이니 확장자를 m2ts 로 바꾸면 어떨가 싶어 확장자를 바꾸어 보았는데 뜬금 없이 디렉토리로 표시된다.    디렉토리로 되었으니 열어보아야지 하는 마음으로 열어보니 이번엔 BDMV 라는 확장자도 없는 파일이 또 표시되길래 혹시나 싶어 이 파일도 확장자를 m2ts 로 바꾸어 주었다. 확장자를 바꾸어 주니 이 파일도 디렉토리로 표시되었다.   와우, 그랬더니 여러가지 파일과 디렉토리가 표시된다. 이게 바로 처음 메모리 카드를 넣었을때의 비디오 인덱스인 듯 하다. 파일이름에도 인덱스가 들어 있고,디렉토리도 딱 보니 클립, 플레이 리스트, 스트리밍 동영상 등등 어디서 많이 들어본 단어 들이다. 동영상 파일은 예상대로 STREAM 디렉토리 안에 존재하고 있었고 확장자는 MTS 로 맥용 동영상 플레이어인 IINA에서 바로 플레이 할 수 있는 걸 확인했다. IINA에서 다른 동영상 포맷으로 변환은 안되지만 다른 어플을 이용하면 간단하게 처리 할 수 있을 듯 하다. m2ts 가 이런 형식으로 되어 있는 것도 오늘 처음 알았다. 나중을 위하여 메모 겸 남겨 놓는다.  

sftp에서 파일과 디렉토리의 ls 결과에 대해

sftp로 파일을 전송하다가

조금 이상한 일을 겪었다. sftp로 서버에 접속한 후 파일을 전송하고 디렉토리를 “ls -l” 로 확인했을 때와 디렉토리내의 파일을 직접 “ls -l”로 확인했을때, 파일의 timestamp가 틀리게 나오는 걸 확인했다. sftp 클라이언트와 sftp 서버 쪽 timezone을 확인 해 본 결과 sftp 클라이언트는 timezone이 Asia/Tokyo 였고, sftp 서버쪽의 timezone은 UTC로 설정되어 있는게 이유가 아닐까 싶어 확인을 해 보았다.

 

timezone 변경과 확인

먼저 서버쪽에 ssh 로그인 후 timedatectl 로 확인해 본결과 역시나 UTC로 설정되어 있었다. timedatectl set-timezone Asia/Tokyo 명령어로 서버쪽 timezone도 클라이언트와 동일하게 설정해 주니 ls -l 로 디렉토리와 파일을 지정했을때 timestamp 가 엉뚱하게 나오는 현상은 해결 되었다. 

그런데 문제는 해결 되었는데 도대체 왜 이런 현상이 발생하는지 이해가 안간다. 디렉토리와 파일 모두 timestamp 가 동일하게 나온다면 그러려니 하겠는데 디렉토리와 파일에 대해 ls -l 을 실행한 결과가 다르게 나온다는건 조금 이해가 되지 않는다. 인터넷을 검색해 보아도 특별히 보고된 issue 같은 건 없는 듯 하니… 소스 파일을 직접 검색해 보는 수 밖에 없을려나.

 

sftp 소스 분석

sftp 의 소스 파일은 어디에서 받을 수 있을까. 검색 결과 https://www.openssh.com/ 에서 다운 받을 수 있었다. 미러 리스트로부터 적당한 링크를 클릭하여 wget 으로 openssh-8.0p1.tar.gz 파일을 다운 받아 압축 해제를 하고 소스를 확인 하였다. 관련 있는 함수는 sftp-common.c 파일의 ls_file()과 sftp-client.c의 do_readdir() 함수 정도 일려나.

do_lsreaddir(struct sftp_conn *conn, const char *path, int print_flag,
     SFTP_DIRENT ***dir)
 {
   struct sshbuf *msg;
   u_int count, id, i, expected_id, ents = 0;
   size_t handle_len;
   u_char type, *handle;
   int status = SSH2_FX_FAILURE;
   int r;
... 생략 ...

sftp-client.c 의 do_readdir()은 do_lsreaddir()을 불러오고 있어서 do_lsreaddir()을 확인해 보았지만 특별히 눈에 띄이는 점은 없다. 다음으로 sftp-common.c 파일을 확인 해보았다.

ls_file(const char *name, const struct stat *st, int remote, int si_units)
{
   int ulen, glen, sz = 0;
   struct tm *ltime = localtime(&st->st_mtime);
   const char *user, *group;
   char buf[1024], lc[8], mode[11+1], tbuf[12+1], ubuf[11+1], gbuf[11+1];
   char sbuf[FMT_SCALED_STRSIZE];
   time_t now;
... 생략 ...

헐… 자세히는 모르겠지만 파일의 stat로부터 localtime 을 적용시키고 있는 듯 하다. 그렇다면 설명이 된다.ls -l로 디렉토리를 지정했을 경우에는 ls 의 결과를 그대로 받아와서 출력하지만 파일을 지정했을 경우엔 localtime 으로 변경후 반환해 주는 듯 하다. 할려면 똑같이 해줬으면 좋겠는데… 어느쪽이 맞냐고 한다면… 서버 쪽의 timestamp 를 그대로 반환해 주었으면 좋겠는데 말야…

 

다음에 시간 나면 소스를 수정하여 컴파일 한 후에 제대로 동작하는지 테스트 해보고 싶다. 시간에 여유가 생겨서 해볼 수 있다면 다시 결과를 남기도록 하겠다.

댓글

이 블로그의 인기 게시물

소니 AVCHD 파일 변환기 없이 맥북에서 읽어오기

해외거주 국민을 위한 "교민폰" 사용후기

CISCO 2960s 초기화 후 기본 설정