8초짜리 영상이 82일짜리가 된 이유
연예견에서는 셔터를 길게 누르면 영상을 찍어요. 6월 초, 통화와 관련된 문제가 연달아 나왔어요. 통화 중에는 카메라가 까맣게 꺼지고, 녹화 중에 전화가 오면 영상이 망가졌어요. 사흘 동안 고친 기록이에요.
통화 중에도 카메라를 살려 두기
처음 문제는 단순했어요. 길게 누르는 순간 바로 녹화가 시작되게 하려고, 카메라를 켤 때부터 마이크도 함께 켜 두고 있었어요. 그런데 통화 중에는 iOS가 마이크를 쥐고 있어서, 카메라와 마이크를 함께 달라는 요청이 실패하고 화면이 꺼졌어요.
iOS에서 통화가 카메라를 멈추는 건 오디오 장치를 통해서만이에요. 그래서 미리보기는 영상만 쓰고, 마이크는 녹화하는 동안에만 켜도록 바꿨어요. 이제 통화 중에도 미리보기와 사진은 그대로 되고, 항상 켜져 있던 마이크 표시등도 녹화할 때만 켜져요.
녹화 중에 전화가 오면
웹 화면(WebView)에서 하는 녹화는 통화를 뚫고 계속할 방법이 없어요. 그래서 전화가 오는 순간 녹화를 깔끔하게 끝내고, 거기까지 찍힌 부분으로 확인 화면에 가요. “통화가 감지돼 녹화가 종료되었습니다”라는 안내와 함께요. 통화 중에 녹화를 시작하려고 하면 “통화 중에는 영상을 찍을 수 없어요”라고 알려 주고, 사진은 그대로 찍을 수 있어요. 휴대폰 기본 카메라와 같은 동작이에요.
그런데 이 “통화 중” 감지가 처음엔 동작하지 않았어요. 마이크를 쓸 수 없으면 오류가 날 거라고 생각했는데, iOS는 오류 대신 처음부터 음소거된 마이크를 돌려줬어요. 지금은 둘 다 확인해요.
반복 재생이 안 되는 영상
남은 문제는 이상했어요. 전화 때문에 중간에 끊긴 영상은 한 번은 재생되는데, 반복 재생도 안 되고 원하는 지점으로 넘길 수도 없었어요.
첫 번째 추측은 “길이 정보가 없다”였어요. 갑자기 끝난 녹화 파일은 길이가 무한대로 나온다고 알려져 있거든요. 그래서 길이가 무한대면 바로잡는 코드를 넣었는데, 아무 변화가 없었어요.
실제 망가진 파일을 분석 도구(ffprobe)로 열어 보니, 길이가 무한대가 아니라 약 82일이었어요. 8초짜리 영상이요. 그래서 두 번째로, 파일 머리에 있는 길이 정보를 진짜 길이로 고쳐 쓰는 코드를 만들었어요. 이것도 효과가 없었어요.
진짜 원인: 조각난 MP4의 마지막 조각
세 번째는 추측을 그만두고 파일을 통째로 뜯어보는 도구를 만들어 상자 단위로 읽었어요. iOS는 영상을 조각난 MP4(fragmented MP4)로 녹화해요. 이 형식은 파일 머리에 전체 길이를 쓰지 않고(0으로 둬요), 조각마다 “이 조각의 각 프레임이 얼마 동안 보이는지”를 따로 적어요. 두 번째 시도에서 머리의 길이를 고친 게 아무 소용이 없었던 이유예요.
전화로 녹화가 끊기면, 마지막 조각의 마지막 프레임 길이에 쓰레기 값이 들어가요. 약 2의 32제곱(약 43억) 틱, 이 앱의 시간 단위로 82일쯤 되는 숫자예요. 프레임은 모두 멀쩡하고, 그 숫자 하나 때문에 플레이어는 이 영상이 82일짜리라고 믿은 거예요. 그러니 끝까지 가서 처음으로 돌아갈 수가 없었죠.
고치는 방법은 작았어요. 영상의 모든 조각을 훑어서, 말도 안 되게 긴 프레임 길이를 보통 프레임 길이로 바꿔요. 실제 파일에 적용하자 길이가 약 1988시간에서 진짜 길이인 8초로 돌아왔고, 반복 재생과 넘기기가 모두 됐어요. 변환 프로그램을 앱에 넣을 필요도 없었어요. 이 수리는 끊긴 영상을 확인 화면에 보내기 전에, 그리고 업로드하기 전에 적용돼요.
정리하면
- 통화가 카메라를 멈추는 경로(오디오)를 알면, 그 경로를 피하는 설계가 보여요.
- 두 번 추측이 틀렸을 때, 세 번째는 추측 대신 실제 파일을 뜯어보는 도구를 만들었어요. 그게 가장 빨랐어요.
- 그때 만든 분석 도구는 저장소에 남겨 두었어요. 다음에 영상 문제가 생기면 다시 쓸 수 있게요.
연예견 · 묘하냥 — 연예견(강아지)과 묘하냥(고양이)은 초대한 가족·친구에게만 우리 아이 사진을 나누는 비공개 사진 앱이에요. 홈 화면 위젯과 아이 목소리로 오는 알림이 있어요.