2021년 10월

10월 27일 (수)

2주만에 작성한다. TIL이 아니라 BWIL이라고 해야 할 듯.

python watchdog

새로 생성되는 파일들을 모니터링 하기위해 python의 watchdog을 쓰고 있다.
on_created 핸들러가 호출될 때마다 생성된 파일을 리스트에 추가하도록 하였는데, 이것 때문에 오늘 문제가 발생했다. 무엇이 문제였는지 정리하고자 한다.

<FileCreatedEvent: event_type=created, src_path='MLMP1_TEST/out_tmp/stream_0/init_0.mp4', is_directory=False>
<FileCreatedEvent: event_type=created, src_path='MLMP1_TEST/out_tmp/stream_1/init_1.mp4', is_directory=False>
<FileCreatedEvent: event_type=created, src_path='MLMP1_TEST/out_tmp/stream_2/init_2.mp4', is_directory=False>
<FileCreatedEvent: event_type=created, src_path='MLMP1_TEST/out_tmp/stream_3/init_3.mp4', is_directory=False>
<FileCreatedEvent: event_type=created, src_path='MLMP1_TEST/out_tmp/stream_3/init_3.mp4', is_directory=False>
<FileCreatedEvent: event_type=created, src_path='MLMP1_TEST/out_tmp/stream_4/init_4.mp4', is_directory=False>
<FileCreatedEvent: event_type=created, src_path='MLMP1_TEST/out_tmp/stream_5/init_5.mp4', is_directory=False>

위 로그를 보면 init_3.mp4 생성 이벤트가 두 번 발생했다. 보통 파일을 생성하고 write를 하는 상황을 가정해보면 create 이벤트가 발생하고 modify 이벤트가 한 번 이상 발생할 것으로 생각 할 수 있다. 그러나 어떠한 이벤트든 매우 짧은 시간에 발생할 경우 한 번으로 인식될 수 있고, 찰나의 차이로 두 번의 이벤트로 인식될 수 있다고 한다.

참고 : https://stackoverflow.com/questions/23859931/python-watchdog-duplicate-events

따라서 이벤트를 기록하는 경우 list를 사용하는 것보다 set을 사용하는 것이 적절한 경우가 있다.

10월 13일 (수)

ffmpeg의 concatdec.c을 응용하여 새로운 concat demuxer를 만들었다.

concatdec.c의 한계

기존 concatdec.c은 파일목록을 다 읽고 난 후에 concat을 수행해서 동적으로 파일 목록을 생성할 수가 없었다.

https://trac.ffmpeg.org/wiki/Concatenate

위 링크에 나와 있는 Automatically appending to the list file 방법대로 file과 concat list 파일을 조합하여 동적으로 추가 하도록 할 수 있으나, 이 방법은 ConcatContext 가 리스트 형태로 계속 증가하는 문제가 있다.

새로 작성한 concat demuxer의 장점

새로 작성한 concat demuxer (concatpipe.c)는 파일목록을 다 읽지 않아도 concat을 한 파일씩 처리한다.

다만 read 할 때 EOF를 만나지 않더라도 return 될 수 있게 하기 위해 namedpipe를 사용해야 하며, file.c 에 file_open 부분도 is_streamed인 경우 fd를 nonblock 모드로 설정해줘야 한다.

소감

ffmpeg은 엄청 generic한 프로그램인 만큼 장점도 있지만 수정하려면 굉장히 골치가 아프다.
그래도 이번 기회에 입력 option 처리 부분과 파일 열기 초기화 부분 등을 한층 더 깊이 이해하게 되었다.

좋은 웹페이지 즐겨찾기