전자회로 실무 / 펌웨어

SD(Secure Digital) 카드에 복사한 영상이 재생되지 않으면 파일명과 내부 형식을 확인합니다

컴퓨터에서는 영상이 잘 열리는데 작은 화면을 단 기기에서는 파일이 보이지 않거나 첫 장면에서 멈추는 경우가 있습니다. 이때 확장자를 .avi로 바꿨다고 해서 변환이 끝난 것으로 여기면 원인을 찾기 어렵습니다. 기기는 정해진 폴더에서 특정 이름의 파일을 찾고, 그 안의 영상 부호화 방식과 화면 크기, 프레임 속도까지 맞아야 재생할 수 있습니다. 이 글에서는 변환 프로그램과 기기 펌웨어의 파일 규칙을 대조하고, 카드에 복사한 뒤 무엇을 확인할지 설명합니다.

파일의 이름과 영상의 내부 형식을 따로 확인합니다

AVI(Audio Video Interleave)는 영상과 소리 등의 데이터를 담는 컨테이너(container) 형식입니다. 파일명 뒤의 .avi는 형식을 짐작하게 하는 표지일 뿐, 파일 내부가 실제 AVI인지와 영상이 어떤 방식으로 압축됐는지는 알려주지 않습니다. 프레임마다 JPEG 그림처럼 압축하는 MJPEG(Motion JPEG)는 AVI 안에 들어갈 수 있는 코덱(codec)의 한 예시입니다. 기기가 AVI를 읽더라도 그 안의 코덱을 지원하지 않으면 재생할 수 없습니다.

AVI 안의 영상 스트림에는 압축 방식을 구별하는 네 글자 코드인 FOURCC(four-character code)가 기록될 수 있습니다. 어떤 기기의 AVI 읽기 코드는 MJPEG 영상이라도 이 코드가 MJPG인지 검사합니다. 따라서 확장자와 코덱 이름을 맞춘 뒤에도 영상 스트림의 식별값이 그 기기의 코드와 맞는지 확인해야 합니다.

한 프레임의 가로·세로 픽셀 수는 해상도(resolution)이고, 1초 동안 표시할 프레임 수는 프레임 속도(frame rate)입니다. 속도 단위 fps(frames per second)는 1초당 프레임 수를 뜻합니다. 기기가 요구하는 해상도가 240 × 240 픽셀이라면 컴퓨터에서 240 × 240으로 변환했는지 확인해야 합니다. 그러나 크기가 맞아도 프레임 속도가 기기의 처리 능력을 넘으면 재생이 끊길 수 있습니다. 변환 명령에 프레임 속도를 지정하지 않았다면 입력 영상의 속도가 출력에 반영될 수 있으므로, 결과 파일의 속성을 별도로 읽어야 합니다.

변환 파일과 기기 펌웨어에서 확인할 이름·경로·영상 형식을 연결한 개념도입니다.
변환 파일과 기기 펌웨어에서 확인할 이름·경로·영상 형식을 연결한 개념도입니다. · 클릭하면 확대됩니다.

변환하기 전에 펌웨어가 찾는 경로를 먼저 적습니다

펌웨어(firmware)는 기기 안에서 파일을 찾고 화면을 구동하는 프로그램입니다. 먼저 실제 기기에 기록된 펌웨어의 파일 열기 부분을 확인하십시오. 사용자가 폴더를 선택한 뒤 펌웨어가 a와 세 자리 번호, .avi를 붙여 파일명을 만든다면, 0번부터 재생을 시작하는 경로에서는 첫 파일이 a000.avi, 그다음이 a001.avi입니다. 그 경로에 output000.avi만 두었다면 확장자가 같아도 파일 열기 경로는 일치하지 않습니다.

여기서 a는 파일명 앞에 붙이는 접두어(prefix)의 예시입니다. 다른 펌웨어에는 다른 접두어와 자릿수가 있을 수 있습니다. 변환 스크립트의 출력 이름과 펌웨어의 검색 이름이 다르면, 먼저 공개된 소스 코드가 기기에 실제 기록된 버전과 같은지 확인하십시오. 버전을 모른다면 파일 열기 기록이나 짧은 시험 파일로 기기가 찾는 이름을 확인한 뒤 변환 파일의 이름을 맞춥니다. 이름 차이만 보고 원래 영상이 재생에 실패했다고 단정하지 않습니다.

변환 스크립트가 기본 출력 이름에 세 자리 번호를 덧붙이는 방식이라면, 입력칸에는 완성 파일명이 아니라 접두어만 입력해야 합니다. 이 규칙에서 a를 입력하면 첫 두 파일은 a000.avi, a001.avi가 됩니다. 반면 a000을 입력하면 첫 파일은 a000000.avi입니다. 스크립트 실행 뒤 실제 생성된 파일명과 펌웨어가 여는 이름을 다시 대조하십시오. 이름을 맞추더라도 영상 형식과 실제 재생은 별도로 확인해야 합니다.

다음 항목을 한 줄씩 적으면 빠뜨리기 어렵습니다.

확인할 곳적어 둘 내용맞지 않을 때 보이는 현상
펌웨어의 파일 열기 코드선택 폴더, 접두어, 번호 자릿수, 확장자폴더를 선택해도 해당 영상을 열지 못할 수 있습니다.
변환 프로그램출력 파일명 형식, 분할 길이, 코덱, 해상도, 프레임 속도 설정 유무이름은 맞지만 영상이 멈추거나 깨질 수 있습니다.
SD 카드의 실제 내용폴더 위치, 연속 번호, 불필요한 파일의 존재다음 조각으로 넘어갈 때 없는 파일을 찾을 수 있습니다.

긴 영상을 나눌 때는 번호와 속성을 함께 확인합니다

FFmpeg는 영상·소리를 변환하는 프로그램이고, ffprobe는 파일에 기록된 영상 속성을 읽는 도구입니다. 어떤 변환 스크립트는 ffprobe로 입력 길이를 읽고 60초마다 파일을 나눕니다. -ss는 시작 위치, -t는 잘라낼 길이, scale=240:240은 출력 화면 크기, -an은 소리 제거, -c:v mjpeg는 영상 코덱 선택을 뜻합니다. 따라서 소리가 필요한 기기라면 -an을 쓰는 변환 방식은 그대로 적용할 수 없습니다.

예를 들어 길이 125초인 입력에 대해 실제 펌웨어가 a000.avi부터 찾고 240 × 240 MJPEG AVI를 지원한다고 확인한 경우, 세 조각을 만드는 명령의 형태는 다음과 같습니다. 이는 특정 기기에서 재생 성공을 확인한 명령이 아니라, 이름과 변환 옵션을 대조하기 위한 예시입니다.

ffmpeg -ss 0 -i input.mp4 -t 60 -vf scale=240:240 -an -c:v mjpeg -q:v 2 a000.avi
ffmpeg -ss 60 -i input.mp4 -t 60 -vf scale=240:240 -an -c:v mjpeg -q:v 2 a001.avi
ffmpeg -ss 120 -i input.mp4 -t 60 -vf scale=240:240 -an -c:v mjpeg -q:v 2 a002.avi

원본이 정사각형이 아니면 scale=240:240이 화면 비율을 바꿀 수 있습니다. 영상이 늘어나 보이지 않게 하려면 대상 기기가 허용하는 자르기 또는 여백 추가 방법을 별도로 정해야 합니다. -q:v 2는 이 MJPEG 변환 예시의 품질 설정이며, 파일 크기와 저장장치 읽기 속도도 시험해야 합니다. 위 명령에는 프레임 속도를 고정하는 -r 옵션이 없습니다. 따라서 출력 속도를 임의로 30 fps라고 기록하지 마십시오. 기기가 허용하는 속도를 확인한 뒤 필요하다면 출력 파일 앞에 -r과 그 속도를 지정하고, 변환 결과와 실제 재생을 다시 검사합니다.

변환 후에는 실제 결과 파일을 읽습니다. 아래의 ffprobe 명령은 컨테이너의 실제 형식과 첫 비디오 스트림의 코덱·FOURCC·가로세로 크기·보고된 평균 프레임 속도를 표시합니다. format_name이 AVI인지, codec_name이 MJPEG인지, codec_tag_string이 기기의 AVI 읽기 코드가 요구하는 값인지 차례로 보십시오. 화면에 나온 값을 기기의 펌웨어와 디코더 조건에 대조해야 합니다. 이 값으로 파일 메타데이터를 확인했다고 해서 실기기 재생 성공까지 확인한 것은 아닙니다.

ffprobe -v error -select_streams v:0 -show_entries format=format_name:stream=codec_name,codec_tag_string,width,height,avg_frame_rate -of default=noprint_wrappers=1 a000.avi

예를 들어 길이 125초인 입력을 60초씩 나누는 프로그램은 번호가 000, 001, 002인 세 조각을 만들도록 설계할 수 있습니다. 마지막 조각은 남은 약 5초만 담습니다. 이것은 분할 규칙을 설명하는 계산 예시이며, 실제 출력 길이·프레임 수는 변환한 파일에서 확인해야 합니다.

카드의 파일 수를 세는 코드까지 확인합니다

펌웨어가 폴더 안의 모든 일반 파일을 세면서 영상 번호를 순환시키는 구현이라면, 폴더에 영상 외 파일이 들어갔을 때 셈이 달라질 수 있습니다. 예를 들어 a000.avi, a001.avi 두 개만 재생하려는 폴더에 별도 문서가 하나 있으면, 코드가 파일 수를 3으로 보고 존재하지 않는 a002.avi를 찾을 가능성이 있습니다. 이는 코드에서 예상되는 고장 경로이며, 특정 기기에서 실제로 실패한 결과를 뜻하지 않습니다.

파일 순번이 항상 000에서 시작하는지도 확인해야 합니다. 한 펌웨어는 시각을 맞추는 동안 12시간제 시각의 ‘시 × 60 + 분’을 재생 시작 파일 번호로 사용합니다. 이 코드에서는 01시를 선택할 때 a060.avi, 이어 01:05를 선택하면 a065.avi를 열려고 합니다. a000.avi와 a001.avi만 담긴 시험 폴더로는 이 시각 설정 경로를 끝까지 확인할 수 없습니다. 이는 코드에서 도출한 조건이며 실제 장치에서 재생 실패를 관찰한 결과는 아닙니다. 입력 영상을 60초씩 나눈 것만으로 영상 장면이 시계의 실제 시각과 대응하는 것도 아닙니다. 시각 설정이나 재개 동작이 시작 번호를 바꾸는지 확인하고, 시험하려는 번호의 파일이 실제로 있는지와 그 장면이 어떤 시각에 표시되는지를 따로 검사하십시오.

카드에 복사하기 전에는 재생 경로별 시작 번호를 적고, 그 번호부터 필요한 파일이 빠짐없이 있는지 확인합니다. 처음 a000.avi를 열고 파일 끝마다 다음 번호로 넘어가는 경우와 시각을 설정하면서 a060.avi를 여는 경우는 필요한 파일 범위가 다릅니다. 폴더 안에 예상하지 않은 파일이 없는지, 펌웨어가 선택한 폴더와 실제 복사 위치가 일치하는지도 확인합니다. 운영체제가 자동으로 만드는 숨김 파일도 해당 코드가 셀 수 있는지 확인하십시오. 파일을 지웠거나 이름을 바꿨다면 컴퓨터에서 카드를 안전하게 제거한 뒤 다시 넣어 실제 목록을 확인합니다. 카드의 파일 시스템 형식과 용량 제한 역시 기기 설명과 비교해야 하지만, 이를 확인하지 않은 채 임의의 포맷을 권하지는 않습니다.

한 가지씩 바꾸며 실제 기기에서 재생을 확인합니다

먼저 짧은 시험 영상 하나를 펌웨어가 요구하는 이름과 형식으로 카드에 넣습니다. 전원을 켜고 해당 폴더를 선택한 다음 파일 열기 성공 여부, 첫 화면, 프레임 진행과 파일 끝 처리를 확인합니다. 디버그 기록이나 화면 메시지가 있다면 파일을 못 찾은 상태와 파일은 열었지만 디코딩에 실패한 상태를 구분하십시오. 이 둘은 고쳐야 할 위치가 다릅니다.

첫 조각이 재생되면 같은 규칙으로 두 번째 조각을 넣고 전환 지점을 확인합니다. 이름·코덱·해상도·프레임 속도를 한꺼번에 바꾸면 어떤 변경이 효과를 냈는지 알 수 없으므로 한 조건씩 바꾸고 결과를 적습니다. 설명 영상과 소스 코드의 버전이 다르다면 변환 파일명을 코드에 맞추는 방법과 실제 기기에 기록된 펌웨어 버전을 확인하는 방법 중 하나를 선택해 시험합니다. 시험 결과가 없을 때는 파일명 차이를 재생 실패의 가능 원인으로만 기록해야 합니다.