funscript 형식, 필드별 설명

funscript 형식은 필수 키 하나, actions를 가진 JSON 객체입니다. 이는 밀리초 단위의 시간에 0에서 100 사이의 위치를 지정하는 {"at", "pos"} 쌍의 목록입니다. 그 주변에 version, inverted, range, metadata가 있습니다. 이 페이지는 각 필드, 파일이 따르는 관례, 그리고 AutoScript Sync가 파일을 읽고 쓸 때 정확히 무엇을 하는지 정의합니다.

2026년 9월 21일에 앱의 코드와 대조해 확인했습니다. 공식 사양이 아닌 일반적인 관례를 설명합니다.

구조

funscript는 .funscript 확장자의 UTF-8 텍스트로 저장된 하나의 JSON 객체입니다. AutoScript Sync가 저장하는 형태의 작고 완전한 파일:

{
  "version": "1.0",
  "inverted": false,
  "range": 100,
  "metadata": {
    "creator": "AutoScript Sync",
    "format": "funscript"
  },
  "actions": [
    {"at": 0,    "pos": 50},
    {"at": 350,  "pos": 95},
    {"at": 720,  "pos": 5},
    {"at": 1080, "pos": 95},
    {"at": 1500, "pos": 5},
    {"at": 5500, "pos": 5}
  ]
}

마지막 두 포인트는 4초 동안 같은 위치를 유지합니다. 정지는 빈틈이 아니라 같은 pos를 가진 두 포인트로 표현합니다. JSON에서 키 순서는 상관없으며, 공백도 자유롭게 쓸 수 있습니다.

필드

actions
포인트의 배열이며, 각 포인트는 atpos를 가진 객체입니다. 플레이어에 필요한 유일한 필드입니다. 이 필드가 없는 파일은 쓸 수 있는 스크립트가 아닙니다.
at
영상 시작부터 포인트까지의 시간을 밀리초 단위 정수로 나타냅니다. 1500은 1.5초 지점입니다.
pos
그 시간에 있어야 할 위치로, 0에서 100까지의 정수입니다. 0과 100이 물리적으로 무엇을 의미하는지는 기기와 그 설정에 달려 있으며, 파일은 "범위의 이만큼 지점"이라는 것만 말합니다.
version
형식 버전을 나타내는 문자열로, 보통 "1.0"입니다.
inverted
true 또는 false. true이면 위치를 100 − pos처럼 뒤집어 읽어야 합니다.
range
pos의 범위를 나타내는 숫자로, 보통 100입니다. 대부분의 파일은 100으로 둡니다.
metadata
스크립트에 관한 모든 것을 담는 객체입니다: 만든 프로그램, 제목, 메모, 태그. 플레이어는 파일을 재생하는 데 이것이 필요 없습니다.

편집기에서 만든 파일에는 챕터나 북마크 같은 최상위 키가 추가로 들어 있는 경우가 많습니다. 허용되는 키이며, 이해하지 못하는 리더는 이를 무시하고, 가능하면 보존해야 합니다.

올바른 형식의 파일이 따르는 관례

  • at은 영상 시작부터 센 밀리초 단위의 정수이며, 음수가 될 수 없습니다.
  • pos는 0부터 100까지의 정수입니다.
  • 액션은 at 기준으로 가장 이른 것부터 정렬됩니다.
  • 두 액션이 같은 at을 가질 수 없습니다.
  • 숫자는 문자열이 아닌 JSON 숫자입니다: "at": "400"이 아니라 "at": 400입니다.

파일이 이 규칙을 어겼을 때 얼마나 관대하게 처리하는지는 프로그램마다 다릅니다. 데스크톱 앱은 아래 설명처럼 고칠 수 있는 것은 고칩니다. 저희 브라우저 도구인 Report Studio는 그렇지 않습니다: 액션이 이미 정렬되어 있다고 가정하고, 길이를 마지막 액션에서 가져오며, invertedrange를 무시하고, at 값이 문자열인 파일은 거부합니다. 다섯 가지 규칙을 모두 따르는 파일이라면 이런 차이를 피할 수 있습니다.

AutoScript Sync가 파일을 읽는 방식

Load Funscript…로 스크립트를 열거나, 창에 끌어다 놓거나, 같은 이름의 스크립트가 옆에 있는 영상을 열면, 앱은 파일을 거부하는 대신 액션을 고칩니다:

  • 액션을 시간순으로 정렬합니다;
  • 시간이 같은 액션을 합치고 마지막 것을 남깁니다;
  • pos를 0–100으로 제한하고 음수 시간은 0으로 만듭니다;
  • 읽을 수 없는 항목은 건너뛰며, 몇 개를 건너뛰었는지는 알려 주지 않습니다;
  • range를 읽지만 이를 크기 재조정에 사용하지는 않으므로, range가 100이 아닌 파일도 0–100으로 취급됩니다;
  • version은 있는 그대로 유지합니다(없으면 "1.0").

다음 업데이트(2.121.2, 빌드는 완료되었지만 아직 출시되지 않음)에서는 읽기 기능이 더 많은 파일을 받아들이고 파일 내용을 더 많이 보존합니다:

  • 바이트 순서 표시(BOM)와 함께 저장되었거나 UTF-16으로 저장된 파일도 거부되지 않고 불러와집니다;
  • inverted: true는 불러올 때 한 번 적용되며(100 − pos) 이를 안내하는 메시지가 표시되고, 파일은 inverted: false로 다시 저장되므로 다른 모든 플레이어에서도 같은 움직임이 재생됩니다. 현재 출시된 앱은 이 플래그를 무시하므로 반전된 파일이 위아래가 뒤집혀 재생됩니다;
  • 소수점이 있는 atpos 값은 가장 가까운 정수로 반올림되고, NaN이나 무한대 값은 건너뜁니다;
  • 챕터나 북마크 같은 알 수 없는 최상위 키는 유지되어 저장할 때 다시 기록됩니다. 현재 출시된 앱은 저장할 때 이를 버립니다;
  • 텍스트가 아니거나, JSON이 아니거나, 객체가 아니거나, actions 목록이 없는 파일에는 알기 쉬운 메시지가 표시되며, 사용할 수 있는 액션이 없는 스크립트는 영상에 연결되지 않습니다.

AutoScript Sync가 파일을 쓰는 방식

앱이 저장하는 모든 스크립트는, 생성한 것이든 편집한 것이든, 편집기에서 무슨 일이 있었든 위의 규칙을 따릅니다:

  • 액션은 시간 오름차순으로, 시간이 겹치지 않게 기록됩니다. at은 음수가 아닌 밀리초 단위 정수, pos는 0부터 100까지의 정수입니다. 두 점이 반올림되어 같은 밀리초가 되면 나중 점이 남습니다.
  • 헤더: version, inverted, range는 가지고 있는 값 그대로 기록됩니다. 생성된 스크립트에는 "1.0", false, 100이 들어갑니다.
  • 메타데이터: creator는 항상 "AutoScript Sync"로, format"funscript"로 설정됩니다. 다른 도구의 스크립트 위에 저장하면 그 creator가 바뀝니다.
  • 생성된 스크립트의 분석 세부 정보: 생성기, 인식 요약, 타이밍, 트래킹 경로, 그리고 2초 구간마다의 장면 유형 라벨, 추적한 영역, 측정하지 않고 채워 넣은 비율, 앵커 선정 점수를 담은 ai 블록.
  • 안전한 저장: JSON은 들여쓰기된 형태로 임시 파일에 먼저 기록된 뒤 교체되므로, 저장 도중 충돌이 나도 기존 스크립트가 손상되지 않습니다.
  • 백업: Generate가 영상 옆에 저장할 때, 기존 스크립트가 있으면 먼저 <name>.funscript.bak으로 복사합니다. 백업은 하나만 보관되며, 다음 Generate가 이를 덮어씁니다.

디스크에 있는 파일은 절대 기기에 맞춰 변경되지 않습니다. 앱이 Autoblow AI Ultra로 스크립트를 보낼 때는 사본을 기기의 한계에 맞추고 분석 메타데이터를 제거하며, 움직임과 몇 가지 헤더 필드(generator, creator, format, version, range, stroke_expansion, 그리고 있는 경우 id)만 남깁니다.

흔한 실수와 찾는 방법

funscript 검사기는 파일을 업로드하지 않고 브라우저에서 이 항목들을 각각 검사하고, 찾은 문제를 나열합니다.

잘못된 JSON
쉼표나 괄호가 빠졌거나, 마지막 액션 뒤에 쉼표가 붙은 경우입니다. 고치기 전까지는 어떤 프로그램도 파일을 읽을 수 없습니다.
액션이 없거나 형식이 잘못됨
actions 키가 없거나, 숫자로 된 atpos가 없는 항목이 있는 경우입니다.
시간 순서가 뒤섞임
보통 두 스크립트를 합치거나 직접 편집했을 때 생깁니다. 액션이 정렬되어 있다고 가정하는 프로그램에서는 길이가 잘못 표시되거나 재생이 튑니다.
시간 중복
같은 at에 위치가 다른 두 점이 있는 경우입니다: 플레이어는 동시에 두 곳에 있을 수 없습니다.
0–100을 벗어난 위치
0보다 작거나 100보다 큰 pos는 플레이어가 기기에 대응시키는 범위를 벗어난 곳을 가리킵니다.
기기에 비해 너무 빠른 움직임
형식 오류는 아니지만, 짧은 시간에 크게 이동하면 기기가 낼 수 있는 이상을 요구하게 됩니다. 검사기는 사용자가 정한 속도 제한(기본값 초당 400단위)을 넘는 구간을 표시합니다.

파일이 actions 목록을 가진 올바른 JSON이면, 검사기는 수정된 사본을 제공합니다: 시간순으로 정렬하고, 중복된 시간을 합치고, 위치를 0–100으로 제한하고 값을 반올림하며, 파일의 나머지는 모두 유지합니다. 깨진 JSON이나 누락된 actions 목록은 고칠 수 없으며, 너무 빠른 움직임을 느리게 만들지도 않습니다.

질문

공식 funscript 사양이 있나요?

이 페이지는 유통되는 파일들이 따르는 관례와 AutoScript Sync가 읽고 쓰는 내용을 설명합니다. 공식 표준이 아니며, 다른 플레이어가 예외 상황을 어떻게 처리하는지는 설명하지 않습니다.

스크립트에는 초당 몇 개의 점이 있어야 하나요?

형식 자체는 빈도를 정하지 않습니다. 점은 움직임이 방향을 바꾸는 곳에 있어야 합니다. AutoScript Sync가 생성한 스크립트는 측정된 움직임이 반전될 때마다 점을 찍으므로, 느린 장면에는 점이 적고 빠른 장면에는 많습니다.

다른 사람이 만든 스크립트인데 왜 "creator": "AutoScript Sync"로 표시되나요?

앱은 저장할 때마다, 다른 도구의 스크립트 위에 저장할 때도, creator에 자기 이름을 기록합니다. 공유할 때는 메타데이터나 게시글에 원작자의 이름을 다시 적어 주세요.

AutoScript Sync는 챕터와 기타 추가 키를 유지하나요?

다음 업데이트(2.121.2)에서는 그렇습니다: 알 수 없는 최상위 키가 유지되어 다시 기록됩니다. 현재 출시된 2.121.1은 저장할 때 이를 버리므로 원본 사본을 보관해 두세요.

다음 읽을거리

영상에서 형식이 올바른 스크립트를 생성하세요

AutoScript Sync는 영상 옆에 표준 funscript를 기록합니다. 체험판은 하루 동안 쓸 수 있는 전체 앱입니다.