ContorGPS로 촬영한 동영상 파일에서 nmea를 검색
시작 · 배경
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)이므로 몇 배 빨라지는 정도겠지요.
Reference
이 문제에 관하여(ContorGPS로 촬영한 동영상 파일에서 nmea를 검색), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/tatesuke/items/9936a82a3c464eb3e12d텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)