ContorGPS로 촬영한 동영상 파일에서 nmea를 검색

10667 단어 nmeaGPS

시작 · 배경



ContorGPS로 촬영한 동영상 파일에는 nmea 형식의 GPS 정보가 내장되어 있으며 일반적으로 Contor Staryteller를 사용하여 동영상을 가져와야 합니다.

↓ 동영상 파일에 포함된 nmea 형식의 문자열


그런데 OS를 Windows 10으로 업그레이드하면 Staryteller가 제대로 움직이지 않게 되어 버렸습니다.

그래서 어쩔 수 없기 때문에 동영상 파일에서 nmea 파일을 꺼내는 프로그램을 만들었습니다. 틈새 지나서 수요가 있는지 모르겠지만 모처럼 만들었으므로 공유합니다. 그렇게 고기능이 아닙니다.

출처



NmeaExporter.java
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.PushbackInputStream;

public class NmeaExporter {

    public static void main(String[] args) throws FileNotFoundException, IOException {
        if (args.length == 0) {
            usage();
            System.exit(1);
        }

        try (PushbackInputStream is = new PushbackInputStream(new FileInputStream(args[0]), 256)) {
            export(is);
        } catch (Throwable t) {
            t.printStackTrace();
        }
    }

    private static void export(PushbackInputStream is) throws IOException {
        while (true) {
            byte[] buf = new byte[6];

            // ファイル終端に達したら終了
            int bytes = is.read(buf);
            if (bytes < buf.length) {
                break;
            }

            // 欲しいデータじゃなければスキップ
            if (!equals(buf, "$GPGGA") && !equals(buf, "$GPRMC")) {
                is.unread(buf, 1, buf.length - 1);
                continue;
            }

            // ここまで来ると欲しいデータなので改行文字(\r\n)まで出力
            System.out.print(new String(buf));
            while (true) {
                buf = new byte[2];
                is.read(buf);
                if (equals(buf, "\r\n")) {
                    break;
                }
                System.out.print((char) buf[0]);
                is.unread(buf, 1, 1);
            }
            System.out.println("");
        }
    }

    private static boolean equals(byte[] buf, String str) {
        if (buf.length != str.length()) {
            return false;
        }

        for (int i = 0; i < buf.length; i++) {
            if ((char) buf[i] != str.charAt(i)) {
                return false;
            }
        }

        return true;
    }

    private static void usage() {
        System.err.println("ファイルパスを渡してください。");
    }

}

사용법



소스를 컴파일하고 다음 명령을 실행합니다. [출력 파일]에서 지정한 경로에 nmea가 출력됩니다.
java NmeaExporter [入力ファイル] > [出力ファイル]

해설



하는 일은 매우 간단합니다. 동영상 파일 중에서$GPGGA 이나 $GPRMC 와 같은 nmea 문자열을 찾고, 발견되면 순차적으로 출력하고 있습니다.

덧붙여서, Storyteller가 출력하는 nmea 파일 중에는 $GPEMT라는 수수께끼의 레코드가 포함되어 있습니다만, 동영상 파일안에는 그런 캐릭터 라인은 포함되어 있지 않습니다. 원래 nmea의 사양에조차 없는 것 같기 때문에 무시해 버렸습니다.

한 글자 한 글자를 찾아가므로 큰 동영상 파일에서 nmea를 꺼내는 데 상당한 시간이 걸립니다. 검색 알고리즘을 궁리하면(BM법이라든지) 좀 더 고속화할 수 있을 것 같습니다만, 어쨌든 계산량은 log(n)이므로 몇 배 빨라지는 정도겠지요.

좋은 웹페이지 즐겨찾기