Projekt Subtitld

OtwieranieZapisywanieZIPXMLProjekt

Własny plik Subtitld: pakiet ZIP, na którego początku stoi dokument USF z napisami, ich tłumaczeniami, mówcami i dubbingami, a dalej manifest wszystkiego, co jest w środku, obraz miejsca, w którym skończyłeś, i, jeśli zechcesz, wideo oraz jego dźwięk. Jeden plik do przeniesienia, zarchiwizowania lub przekazania, a każdą jego część da się odczytać standardowymi narzędziami.

W skrócie

Rozszerzenie.usfx
Typ mediówapplication/x-usfx, rodzaj application/zip. W systemach Apple org.subtitld.usfx.
SpecyfikacjaTa strona. Pakiet to ZIP firmy PKWARE (APPNOTE.TXT); dokument to USF 1.0 z elementami Subtitld.
PakietZIP, składniki skompresowane metodą Deflate (RFC 1951) i sprawdzane CRC-32; Zip64 dla plików powyżej 2 GiB
Pierwszy składniksubtitles.usf: jego nazwa stoi na bajcie 30 każdego projektu zapisanego przez Subtitld
Precyzja czasuNapisy: milisekundy. Dubbingi: dokładne sekundy, z tyloma miejscami po przecinku, ile trzeba.
Kodowanie tekstuUTF-8, w XML i w nazwach składników
StylizacjaTa z USF: kursywa, pogrubienie, podkreślenie, przekreślenie, kolor i dziewięć miejsc
MówcyKażdy z nazwą, kolorem, zdjęciem i głosem
JęzykiOryginał i każde tłumaczenie, każde w osobnym bloku, według kodu ISO 639-2 i nazwy
Media w środkuDubbingi i zdjęcia mówców; wideo, jego dźwięk, rozdzielone głosy i tło oraz przebieg fali z osi czasu, jeśli zechcesz

Budowa pliku

Plik .usfx to ZIP. Otworzy go każdy program do archiwów, po zmianie nazwy na .zip, jeśli program się upiera.

Tears of Steel.usfx
subtitles.usf
manifest.xml
thumbnail.png
assets/speakers/Celia.png
assets/dubs/77a03e27.wav
assets/video/Tears_of_Steel.mkv
assets/waveform.npy
assets/audio/vocals.flac
  1. 1 · Dokument

    Sam projekt, w USF: każdy napis, tłumaczenie, mówca i dubbing. Zawsze obecny, zawsze pierwszy.

  2. 2 · Manifest

    Co utworzyło plik, gdzie było wideo, jak zmiksowano dźwięk, oraz typ mediów każdego innego składnika.

  3. 3 · Obraz

    To, co menedżery plików pokazują z projektu: klatka, na której skończyłeś, jej napis i oś czasu w tym miejscu.

  4. 4 · Zasoby

    Dźwięk każdego dubbingu i twarze mówców; wideo, jego dźwięk i przebieg fali tylko na życzenie.

Dokument mówi, co się dzieje; zasoby są tym, co odtwarza. Dubbing w subtitles.usf wskazuje swój klip ścieżką w pakiecie, assets/dubs/77a03e27.wav, więc pakiet można przenieść do innego folderu, na inny dysk czy komputer, a nadal będzie kompletny.

Składniki

Ścieżka Co zawiera Kompresja Zapisywany
subtitles.usf Dokument: napisy, tłumaczenia, mówcy, głosy, dubbingi Deflate Zawsze, jako pierwszy
manifest.xml Manifest Deflate Zawsze, jako drugi
thumbnail.png Karta PNG projektu, 512 × 384 Bez kompresji Gdy jest z czego zrobić obraz
assets/speakers/<speaker>.png Zdjęcie mówcy, najwyżej 256 pikseli na bok Deflate Chyba że to wyłączysz
assets/dubs/<uid>.<ext> Dźwięk ujęcia dubbingu, nazwany jego identyfikatorem Deflate Zawsze, dla każdego ujęcia z dźwiękiem
assets/dubs/<uid>__<n>__<file> Podzielony lub rozciągnięty fragment ujęcia oraz nietknięte źródło, z którego go rozciągnięto Deflate Gdy ujęcie podzielono lub rozciągnięto
assets/video/<file> Wideo Deflate Na życzenie
assets/waveform.npy Szczyty przebiegu fali z osi czasu, tablica NumPy Deflate Na życzenie
assets/audio/original.flac Dźwięk wideo Deflate Na życzenie
assets/audio/vocals.flac, background.flac Dźwięk rozdzielony na głosy i resztę Deflate Na życzenie

Nazwy w assets/ składają się z liter, cyfr, -, _ i .; wszystko inne staje się _, więc Tears of Steel.mkv zostaje zapisany jako Tears_of_Steel.mkv. Litery spoza ASCII są zachowywane, a nazwa zapisana w UTF-8 i tak oznaczona (bit 11 nagłówka ZIP), jak wymaga APPNOTE.

Dlaczego obraz jest przechowywany bez kompresji. PNG jest już skompresowany; Deflate kosztowałby tylko czas. Bez kompresji jego bajty leżą w pliku dokładnie jako PNG, więc generator miniatur odczytuje je bez rozpakowywania czegokolwiek.

Pierwsze bajty

Każdy projekt zaczyna się tak samo: lokalny nagłówek pliku ZIP, a potem nazwa pierwszego składnika.

50 4B 03 04
14 00 00 00 08 00
4E 70 51 5D
64 CE 1E 0B
6F 3B 00 00 7F E2 00 00
0D 00 00 00
73 75 62 74 69 74 6C 65 73 2E 75 73 66
  1. 1 · Sygnatura

    PK\3\4, bajty od 0 do 3: tu zaczyna się składnik ZIP.

  2. 2 · Nagłówek

    Wersja 2.0 potrzebna do rozpakowania; bez flag; metoda 8, Deflate; czas i data w stylu MS-DOS (tutaj 17 października 2026, 14:02:28); CRC-32; rozmiar po kompresji i bez niej (15 215 i 57 983 bajty).

  3. 3 · Długość nazwy

    13, i bez pola dodatkowego.

  4. 4 · Nazwa

    subtitles.usf, od bajtu 30.

Nazwa nigdy nie jest kompresowana, nawet gdy składnik jest. Dzięki temu działa jak sygnatura: ZIP, którego nazwa na bajcie 30 to subtitles.usf, jest projektem Subtitld. Tracker w Haiku odróżnia projekty od innych archiwów dokładnie tą regułą, 0.60 ("PK\003\004") [30] ("subtitles.usf" | "manifest.xml"), umieszczoną wyżej niż zwykła reguła ZIP. ODF i EPUB robią to samo z pierwszym składnikiem o nazwie mimetype.

Wideo może być większe niż pierwotny limit ZIP wynoszący 4 GiB. Od 2 GiB Subtitld zapisuje pola dodatkowe i rekordy końcowe Zip64 (APPNOTE, sekcja 4.5), tak jak powyżej 65 535 składników; Subtitld, jego moduł miniatur dla Windows i każdy współczesny unzip je odczytują.

Manifest

<?xml version="1.0" encoding="UTF-8"?>
<manifest version="1.0">
  <format>USFX</format>
  <generator>Subtitld</generator>
  <source path="/home/ana/Videos/Tears of Steel.mkv"
          basename="Tears of Steel.mkv"/>
  <voicemix volume="0.5000"/>
  <entry path="subtitles.usf" type="application/x-usf+xml"/>
  <entry path="thumbnail.png" type="image/png"/>
  <entry path="assets/speakers/Celia.png" type="image/png"/>
  <entry path="assets/dubs/77a03e27.wav" type="audio/wav"/>
</manifest>
Element Co zawiera
<manifest version> Wersja manifestu, 1.0
<format>, <generator> USFX i to, co zapisało plik: Subtitld
<source path basename> Pełna ścieżka wideo w chwili zapisu projektu oraz sama nazwa pliku
<voicemix volume> Położenie suwaka Muzyka/Głos: 0 tylko tło, 0.5 dźwięk bez zmian, 1 tylko głosy, przy czym dubbingi cichną razem z tłem
<entry path type> Po jednym dla każdego składnika oprócz samego manifestu, każdy z typem mediów

Typy to application/x-usf+xml, image/png, audio/wav, audio/flac, audio/mpeg, video/mp4, video/x-matroska, video/quicktime, video/webm, video/ogg oraz application/octet-stream dla przebiegu fali i wszystkiego innego.

Ścieżka wideo podróżuje z plikiem. <source path> to miejsce, w którym wideo leżało na komputerze, który zapisał projekt, razem z folderami i nazwą użytkownika. Pamiętaj o tym, zanim udostępnisz projekt. Gdy ścieżka donikąd nie prowadzi, Subtitld szuka wideo po nazwie w folderze projektu.

Dokument

subtitles.usf to plik Universal Subtitle Format, w UTF-8, taki, jaki Subtitld zapisuje samodzielnie, z tym, czego potrzebuje projekt, dodanym w stylu samego USF: elementy i atrybuty tam, gdzie USF ich nie ma. Czytnik USF, który pomija to, czego nie zna, odczyta napisy.

<USFSubtitles version="1.0"
              xmlns:subtitldcc="https://subtitld.cc/ns/usf/1">
  <metadata>
    <title>Tears of Steel</title>
    <author><name>Subtitld</name></author>
    <language code="eng">English</language>
    <subtitldcc:origin share-id="Xk3pQ9aZ2bT" version="3"/>
  </metadata>
  <styles>
    <style name="Celia">
      <fontstyle color="#e5484d"/>
      <dubbing engine="edge-tts" voice="en-GB-SoniaNeural"
               rate="0" pitch="0" fit_to_subtitle="true"/>
    </style>
  </styles>
  <subtitles>
    <language code="eng">English</language>
    <subtitle start="00:00:23.000" stop="00:00:24.500">
      <text speaker="Celia" style="Celia">You're a jerk, Thom.</text>
      <dubbing uid="77a03e27" engine="edge-tts"
               voice="en-GB-SoniaNeural" rate="0" pitch="0"
               path="assets/dubs/77a03e27.wav"
               start="23.0" end="24.5"/>
    </subtitle>
  </subtitles>
  <subtitles>
    <language code="por">Portuguese (Brazil)</language>
    <subtitle start="00:00:23.000" stop="00:00:24.500">
      <text speaker="Celia" style="Celia">Você é um idiota, Thom.</text>
    </subtitle>
  </subtitles>
</USFSubtitles>

Co Subtitld dodaje do USF

Gdzie Element lub atrybut Co zawiera
<metadata> <subtitldcc:origin share-id version> Napisy z subtitld.cc, z których pochodzi projekt, aby zmiany można było opublikować jako ich następną wersję. We własnej przestrzeni nazw, https://subtitld.cc/ns/usf/1, zapisywany tylko wtedy, gdy istnieje.
<styles> <style name> Po jednym dla każdego mówcy, nazwany jego imieniem. Bez stylu Default, który w odtwarzaczu zmieniłby styl każdego napisu.
<style> <fontstyle color> Kolor mówcy, #RRGGBB
<style> <dubbing engine voice rate pitch fit_to_subtitle> Głos mówcy: silnik, głos, tempo i wysokość od −100 do 100 oraz to, czy dubbingi są dopasowywane do długości napisu
<text> speaker, style Kto to mówi i jego styl
<text> alignment Jedno z dziewięciu miejsc USF, od TopLeft do BottomRight; brak dla środka dołu
<subtitle> <dubbing> Ujęcie dubbingu napisu, każde osobnym elementem
<dubbing> uid engine voice rate pitch Identyfikator ujęcia i głos, którym je wykonano
<dubbing> path, raw_path Jego dźwięk w pakiecie oraz źródło, z którego zrobiono rozciągnięte ujęcie
<dubbing> start, end Gdzie gra na osi czasu, w sekundach
<dubbing> <subclip type path raw_path start end offset rate> Fragmenty ujęcia, które podzielono lub rozciągnięto

W zwykłym .usf zdjęcia mówców i dźwięk dubbingów mogą podróżować wewnątrz XML, jako base64 w <avatar> i <data>. .usfx nigdy tego nie robi: są osobnymi składnikami, o ćwierć mniejszymi niż w base64, i odczytywanymi bez parsowania XML.

Czas

start i stop napisu to czasy USF, zaokrąglone do najbliższej milisekundy. Czasy dubbingu to zwykłe sekundy zapisane w całości, 18.01579117916244: najkrótsza liczba dziesiętna, która odczytuje się z powrotem jako ta sama liczba 64-bitowa, więc klip umieszczony przeciąganiem wraca dokładnie tam, gdzie był.

Starsze wersje Subtitld zapisywały czasy o milisekundę za wcześnie, a start w zerze jako 23:59:59.999. Subtitld odczytuje tę wartość jako zero, a milisekundę zostawia, jak jest.

Ujęcia i podklipy

Napis może mieć kilka ujęć. Pierwszy <dubbing> to ten, który gra; pozostałe są alternatywami, cichymi, dopóki któregoś nie wybierzesz, a wtedy przechodzi na początek.

Ujęcie podzielone lub rozciągnięte przechowuje listę elementów <subclip>, ułożonych jak klipy w edytorze audio:

Atrybut Znaczenie
start, end Część pliku źródłowego, która gra, w sekundach od początku pliku
offset Gdzie ta część się zaczyna, w sekundach od start ujęcia
rate Tempo, do którego ją rozciągnięto: 20 to 120 %
path, raw_path Dźwięk, który gra, oraz nietknięty dźwięk, z którego go rozciągnięto

Podklip gra od start ujęcia plus jego offset, przez end minus start sekund. Przerwy to cisza; nakładające się części są miksowane. Źródła nigdy się nie zmieniają, więc każdy podział i rozciągnięcie można cofnąć, a rozciągnięcie zawsze powstaje na nowo z raw_path, nigdy z rozciągnięcia rozciągnięcia.

Tłumaczenia

Każdy język ma własny blok <subtitles>, oznaczony kodem ISO 639-2 i, w elemencie, nazwą języka, która odróżnia portugalski brazylijski od europejskiego. Każdy blok zawiera każdy napis w tych samych czasach; tylko pierwszy zawiera dubbingi. Subtitld dopasowuje tłumaczenie do napisu po czasie początku albo do tego, z którym najbardziej się nakłada, więc bloki zapisane przez inne narzędzia nie muszą się idealnie pokrywać.

Otwieranie projektu

Duże projekty otwierają się od razu: Subtitld najpierw czyta to, czego potrzebuje edytor, a resztę w trakcie pracy.

Zanim pojawi się edytor
  • subtitles.usf, odczytany dla napisów, mówców i głosów
  • manifest.xml, dla wideo i miksu
  • assets/speakers/, twarze, dekodowane poza głównym wątkiem
  • Dołączone wideo, rozpakowane raz
W trakcie pracy
  • Dubbingi, najpierw, abyś mógł je odtworzyć
  • Potem przebieg fali
  • Rozdzielony dźwięk, na końcu

Każdy dubbing na osi czasu jest zakreskowany, dopóki nie dotrze jego dźwięk, a potem gra.

Składniki są rozpakowywane do własnych folderów Subtitld, nigdy obok projektu: dokument, twarze i dubbingi do folderu pamięci podręcznej nazwanego skrótem MD5 ścieżki projektu. To, co dociera w trakcie pracy, spływa w porcjach po 1 MiB do pliku tymczasowego, który po ukończeniu zostaje przemianowany na właściwe miejsce, więc awaria w połowie nie zostawia niczego zapisanego do połowy. Przy następnym otwarciu tego samego projektu plik, który już istnieje, jest używany ponownie tylko wtedy, gdy ma dokładnie rozmiar składnika; w przeciwnym razie zostaje rozpakowany na nowo.

Wideo jest szukane w tej kolejności:

  1. wideo w pakiecie, w assets/video/;
  2. ścieżka z <source path>, jeśli nadal istnieje;
  3. plik o nazwie z <source basename>, w folderze projektu;
  4. w przeciwnym razie Subtitld o nie prosi.

Plik, który nie jest ZIP-em, jest ucięty lub nie przechodzi kontroli CRC, niczego nie otwiera: Subtitld to zgłasza i usuwa go z listy ostatnich. Wcześniejsze projekty też się otwierają: bez manifestu albo z USF pod inną nazwą w katalogu głównym ZIP.

Zapisywanie projektu

Zapisz nigdy nie naraża projektu, który masz.

  1. Migawka. Projekt jest kopiowany w stanie z chwili zapisu, więc możesz dalej edytować, gdy jest zapisywany. Zapisy, autozapisy i kopie zapasowe czekają na swoją kolej: naraz pisze tylko jeden.
  2. Nowy plik. Pakiet jest zapisywany do <project>.usfx.tmp obok projektu.
  3. Niczego nie brakuje. Dubbing, którego dźwięku nie ma jeszcze w pamięci podręcznej, bo wciąż spływa lub został usunięty, jest kopiowany z pliku, który ma zostać zastąpiony. Projekt zapisany bez wideo zachowuje obraz, który miał.
  4. Sprawdzony. Nowy plik jest ponownie otwierany, a CRC-32 każdego składnika weryfikowane.
  5. Podmieniony. Dopiero wtedy zastępuje projekt, jedną zmianą nazwy (os.replace): pod nazwą projektu nigdy nie leży pół projektu.

Jeśli któryś krok się nie powiedzie, plik tymczasowy zostaje usunięty, projekt na dysku jest tym, który miałeś, a twoje zmiany są nadal otwarte w Subtitld. Dopóki dubbingi projektu wciąż spływają, Zapisz na nie czeka.

Co trafia do środka

Ustawienia globalne, a potem USFX, decydują, co jeszcze zawiera projekt, dla każdego projektu, który zapisujesz:

  • Zdjęcia mówcówTwarze mówców. Włączone.
  • Pamięć podręczna przebiegu faliPrzebieg fali, aby projekt otwierał się na innym komputerze bez ponownego obliczania. Wyłączone.
  • Oryginalna ścieżka dźwiękowaDźwięk wideo, jako FLAC. Wyłączone.
  • Przetworzone audio (wokal + tło)Dźwięk rozdzielony na głosy i resztę, jako FLAC, aby nie trzeba było ponownie uruchamiać separacji. Wyłączone.
  • Oryginalny plik wideoSamo wideo: jeden plik ze wszystkim, tak duży jak wideo i więcej. Wyłączone.

Każdy trafia do środka, gdy Subtitld ma co włożyć: rozdzielony dźwięk na przykład dopiero po przeprowadzeniu separacji. Napisy, tłumaczenia, mówcy, głosy i każdy dubbing są w środku zawsze. Deflate zmniejsza WAV dubbingu o mniej więcej jedną szóstą; wideo i FLAC prawie się nie kurczą.

Autozapis i kopie zapasowe

  • Automatycznie zapisuj plik projektuZapisuje sam twój .usfx, jak Zapisz, w ten sam bezpieczny sposób. Dla projektu zapisanego jako USFX.
  • Automatyczne kopie zapasowePełny .usfx w folderze kopii zapasowych Subtitld, z dala od twojego pliku, o nazwie <project>_<YYYYMMDDHHMMSS>.usfx, gdy są zmiany do zachowania. Powyżej Zachowuj najwyżej, domyślnie 20, najstarsze są usuwane.

W menedżerach plików

Miniatura to karta w stylu Subtitld: klatka wideo, na której pozostawiono projekt, napis na niej, a pod nią dwanaście sekund osi czasu wokół głowicy odtwarzania, przebieg fali i napisy w kolorach mówców. 4:3 w rozmiarze 512 × 384, więc lepiej wypełnia kwadratowe pole menedżera plików niż szeroka klatka. Bez wideo zamiast klatki pojawia się znak Subtitld.

System Typ Co daje
Linux application/x-usfx w shared-mime-info, rodzaj application/zip, rozpoznawany po *.usfx Własną ikonę; z pakietem AUR miniatury z subtitld-thumbnailer, generatora miniatur freedesktop.org
Windows Typ pliku w instalatorze i pakiecie MSIX Ikonę; dostawcę miniatur powłoki (UsfxThumbnail.dll, IThumbnailProvider), który sam czyta katalog centralny ZIP, łącznie z Zip64, i dekoduje PNG przez WIC w rozmiarze, o jaki prosi Eksplorator
macOS Typ org.subtitld.usfx, zgodny z public.zip-archive Własną ikonę
Haiku application/x-usfx, z powyższą regułą rozpoznawania Ikonę oraz Trackera odróżniającego projekt od ZIP

Po dwukrotnym kliknięciu projekt otwiera się w Subtitld we wszystkich czterech. Oba generatory miniatur czytają tylko thumbnail.png, odrzucają większy niż 8 MiB i nie przyjmują niczego, co nie zaczyna się od sygnatury PNG, 89 50 4E 47 0D 0A 1A 0A. Windowsowy przyjmuje go tylko bez kompresji, tak jak zapisuje go Subtitld. Linuksowy korzysta wyłącznie ze standardowej biblioteki Pythona, bo menedżery plików uruchamiają generatory miniatur w piaskownicy i po wiele naraz.

Samodzielne czytanie .usfx

Nic w projekcie nie należy wyłącznie do Subtitld. Aby zajrzeć do środka:

unzip -l "Tears of Steel.usfx"
unzip -p "Tears of Steel.usfx" manifest.xml

Aby odczytać jego napisy, w każdym języku, standardową biblioteką Pythona:

import zipfile
import xml.etree.ElementTree as ET

def text_of(element):
    """A <text>'s words, <br/> as a line break."""
    parts = [element.text or '']
    for child in element:
        parts.append('\n' if child.tag == 'br' else text_of(child))
        parts.append(child.tail or '')
    return ''.join(parts)

with zipfile.ZipFile('Tears of Steel.usfx') as usfx:
    usf = ET.fromstring(usfx.read('subtitles.usf'))

for block in usf.iter('subtitles'):
    language = block.find('language')
    if language is not None:
        print('#', language.get('code'), language.text)
    for subtitle in block.iter('subtitle'):
        text = subtitle.find('text')
        print(subtitle.get('start'), subtitle.get('stop'),
              text.get('speaker'), text_of(text))

Projekt od kogoś innego parsuj za pomocą defusedxml zamiast xml.etree, jak każdy XML, którego nie napisałeś sam.

Tworzenie własnego

Najmniejszy projekt, jaki otworzy Subtitld, to ZIP zawierający subtitles.usf. Bez manifestu Subtitld poprosi o wideo. Aby zrobić taki, który rozpoznają też menedżery plików, postępuj tak jak Subtitld:

  • najpierw subtitles.usf, potem manifest.xml;
  • każdy składnik skompresowany metodą Deflate, z wyjątkiem thumbnail.png, przechowywanego bez kompresji;
  • dubbingi w assets/dubs/, wskazywane w dokumencie ścieżką w pakiecie;
  • wszędzie UTF-8.

Subtitld zachowuje to, co zna. Zapis tworzy składniki opisane na tej stronie oraz dokument zbudowany z tego, co Subtitld zrozumiał ze starego. Plik dodany do pakietu przez inne narzędzie albo własny element w USF znika, gdy tylko Subtitld zapisze projekt. Trzymaj własne dane obok.

Porównanie

USFX jest zbudowany tak jak pakiety dokumentów pakietów biurowych i e-booków: ZIP, główny dokument w XML, spis zawartości, media obok.

ODF (.odt) EPUB Office Open XML (.docx) USFX
Standard OASIS ODF 1.3, część 2 W3C EPUB 3.3, jego OCF ECMA-376 część 2, OPC Ta strona
Jak narzędzie go rozpoznaje Pierwszy składnik mimetype, bez kompresji Pierwszy składnik mimetype, bez kompresji: application/epub+zip [Content_Types].xml Nazwa pierwszego składnika, subtitles.usf, na bajcie 30
Spis zawartości META-INF/manifest.xml, typ dla każdego pliku META-INF/container.xml, potem dokument pakietu [Content_Types].xml i _rels/ manifest.xml, typ dla każdego składnika
Główny dokument content.xml Dokument pakietu i jego spine word/document.xml subtitles.usf
Media Pictures/ W dowolnym miejscu pakietu word/media/ assets/
Podgląd Thumbnails/thumbnail.png Obraz okładki Opcjonalna część z miniaturą thumbnail.png, bez kompresji

Główny dokument jest samodzielnym otwartym formatem: wyjmij subtitles.usf z .usfx, a otrzymasz plik USF, format z publiczną specyfikacją od 2002 roku.

Ciekawostki

30

Bajt, od którego zaczyna się nazwa pierwszego składnika każdego projektu, i sposób, w jaki Haiku odróżnia projekt Subtitld od każdego innego ZIP.

512 × 384

Rozmiar obrazu projektu: 4:3, bo menedżery plików pokazują pliki w kwadratach.

26.10

Wydanie, które dało .usfx własną ikonę w Linuksie, Windows, macOS i Haiku oraz obraz w Eksploratorze Windows i linuksowych menedżerach plików.

Powiązane formaty

Zacznij projekt

Otwórz wideo w Subtitld, zrób do niego napisy i zapisz: to jest .usfx.

Pobierz Subtitld