Przejdź do treści
SubtitleMatrix

Format napisów JSON

Co potrafi wyrazić ten format

Formatowanie tekstu
Czcionki, kolor, obrys, cień
Pozycja na ekranie
Tak
Czasy karaoke
Tak
Podziały wierszy w bloku
Tak
Oś czasu
Czas początku i końca dla każdego bloku
Dokładność czasów
1 ms
Czasy zapisane jako numery klatek
Nie
Tekst od prawej do lewej
Tak

Przykłady

Typowy plik JSON i to, co z niego czytamy

Plik

{
  "version": 1,
  "title": "Fixture: typical",
  "fps": 25,
  "styles": {
    "Default": {
      "name": "Default",
      "fontFamily": "Arial",
      "fontSize": 20,
      "primaryColor": "#FFFFFF",
      "bold": false,
      "italic": false
    }
  },
  "generator": "subtitlematrix fixtures",
  "cues": [
    {
      "id": "1",
      "start": 0,
      "end": 2000,
      "lines": [
        "Hello world.",
        "Second line."
      ],
      "style": "Default",
      "position": {
        "x": 100,
        "y": 200,
        "align": "center"
      }
    },
    {
      "id": "2",
      "start": 2500,
      "end": 4000,
      "lines": [
        "Plain line.",
        {
          "text": "Styled line.",
          "tags": [
            {
              "kind": "italic",
              "start": 0,
              "end": 6
            }
          ]
        }
      ]
    },
    {
      "id": "3",
      "start": 4500,
      "end": 6000,
      "lines": [
        "Roger: I am here."
      ],
      "speaker": "Roger"
    }
  ]
}

Co zawiera

3 cues, 5 lines of text

  0 ms → 2000 ms
    Hello world.
    Second line.
    [Default; position 100,200 (center)]
  2500 ms → 4000 ms
    Plain line.
    Styled line.   [italic ×1]
  4500 ms → 6000 ms
    Roger: I am here.
    [speaker Roger]

Outside the cues:
  styles     Default
  other keys version, title, fps, generator — carried through untouched

Prawa kolumna to nie przekonwertowany plik, tylko to, co ta strona odczytuje z lewej — i od czego zaczyna się każda konwersja tego pliku.

Trudny plik JSON i to, co mimo to z niego czytamy

Plik

{
    "cues": [
        { "start": "0:00:01,5", "end": "0:00:03,0", "text": "Unpadded timecode." },
        { "start": 4000.5, "end": 5000, "lines": ["Fractional start.", { "text": "Second.", "tags": [] }] },
        { "start": 9000, "end": 8000, "lines": ["End before start."] },
        { "start": "nope", "end": 12000, "lines": ["No readable start."] },
        { "start": 13000, "lines": ["No end at all."] }
    ],
    "generator": "subtitlematrix boundary",
    "styles": {},
    "title": "Fixture: boundary"
}

Co zawiera

3 cues, 4 lines of text

  1500 ms → 3000 ms
    Unpadded timecode.
  4001 ms → 5000 ms
    Fractional start.
    Second.
  9000 ms → 9001 ms
    End before start.

Outside the cues:
  other keys generator, title — carried through untouched

Reported while reading — repaired or skipped, never silently:
  2 × entries with no readable start and end time (they are not cues, so they were skipped)
  1 × cue times that were not whole milliseconds (they were rounded to the nearest millisecond)
  1 × cues whose end time was not after their start time (they were given a 1ms duration)

Prawdziwe pliki przychodzą ze znacznikiem BOM, windowsowymi końcami wierszy, zbłąkaną linią przed znacznikiem czasu albo znacznikiem, którego nie da się odczytać. Nic nie rzuca wyjątku: to, czego nie da się zrozumieć, jest raportowane, a nie po cichu gubione.

Konwertuj SubtitleMatrix JSON na inny format

Każda z nich działa w całości w Twojej przeglądarce. Etykiety mówią, ile kosztuje dany kierunek, zanim go otworzysz.

Konwersja do tego formatu

SubtitleMatrix JSON to jeden z formatów napisów obsługiwanych przez tę stronę, a ta strona jest jego opisem: co potrafi przechować, czego nie potrafi i gdzie przekonwertować go dalej.

Powyższa tabela mówi wszystko — nie ma żadnej ukrytej listy funkcji. Gdy wiersz mówi „nie”, dokładnie to ginie przy konwersji do JSON, i każda strona konwersji linkowana poniżej mówi o tym, zanim otworzysz plik.

Każda z tych konwersji działa w Twojej przeglądarce. Nic nie jest wysyłane i nie potrzebujesz konta, co ma znaczenie przy materiałach objętych NDA, dokumentacją medyczną czy embargiem emisyjnym.

Częste pytania

Czym jest plik JSON w SubtitleMatrix?

`.json` to własny kształt napisów tej strony: pole `version`, tablica `cues`, a w każdym bloku `start` i `end` w milisekundach oraz `lines` z tekstem. Jest celowo bezstratny wobec tego, co potrafią wyrazić inne formaty, i służy raczej skryptom oraz pipeline'om niż odtwarzaczom.

Czy JSON przechowuje styl?

Tak, i więcej niż pozostałe formaty: obiekt `styles` z krojami, rozmiarami, kolorami, obrysami i marginesami oraz znaczniki w tablicy `tags` przy każdej linii, więc jedna linia może być pogrubiona i kolorowa bez nazwanego stylu. Karaoke też jest przechowywane. Formatowanie siedzi w `tags`, a nie w kodach wewnątrz tekstu, dlatego nic nie trzeba escapować przy zapisie i odczycie.

Czy każdy blok JSON ma początek i koniec?

Tak, a moment w pliku JSON zapisuje się jako `4126`, czyli liczbę całkowitą milisekund. To najdrobniejsza jednostka tego formatu i wartość jest dokładna, więc blok może być krótki, długi albo nachodzić na następny.

Na jaki format najlepiej przekonwertować JSON?

Każdy format docelowy ma własną listę strat, bo żaden nie przechowuje całego obiektu `styles` i `tags` razem z czasami. Wybieraj po tym, czego potrzebuje odtwarzacz lub pipeline, a nie po popularności formatu.

Czy plik JSON można otworzyć w edytorze tekstu?

Tak, jeśli tylko nie pogubisz przecinków i cudzysłowów. Czasy to zwykłe liczby milisekund, więc blok na 1,25 sekundy ma `"start": 1250`.