Bahasa Indonesia

Video & subtitle · Perangkat Subtitle

Bagaimana browser mengurai file SRT: blok, indeks, kode waktu, dan teks

· Cara kerjanya

subtitle srt format file

Dua blok isyarat SRT dipisahkan oleh baris kosong, masing-masing dengan baris indeks, baris kode waktu, dan baris teks
Ilustrasi vektor ToolAcre asli

SRT terlihat sepele sampai Anda menemukan file sebenarnya. Posting ini membahas bagaimana parser membagi blok, membaca indeks dan kode waktu, menangani teks multi-baris, dan memulihkan blok cacat yang terdapat dalam file dunia nyata.

File 'terlihat baik-baik saja' tetapi separuh petunjuknya hilang — bagaimana format yang tampak lunak menyembunyikan ekspektasi yang ketat

SRT tidak memiliki badan spesifikasi, tidak ada registrasi MIME dan tidak ada validator yang dikirimkan bersama pemain. Yang ada hanyalah bentuk yang disetujui oleh sebagian besar perangkat lunak: angka, baris kode waktu, satu atau lebih baris teks, lalu baris kosong. Karena bentuknya konvensional dan bukan ditentukan, dua file bisa terlihat benar di editor teks sementara hanya satu yang dimuat, dan kegagalannya biasanya tidak terjadi apa-apa. Seorang pemain yang tidak dapat membaca isyarat cenderung melewatkannya daripada melaporkannya, jadi file dengan blok yang rusak diputar dengan celah, bukan dengan kesalahan.

Oleh karena itu, parser memiliki dua pekerjaan yang berlawanan arah. Ia harus menerima variasi yang terkandung dalam file sebenarnya, karena file diproduksi oleh layanan transkripsi, pengeditan tangan, dan konverter format yang masing-masing membuat asumsi berbeda. Ia juga harus menolak pembacaan yang akan memberikan isyarat pada waktu yang salah, karena stempel waktu yang salah secara diam-diam lebih buruk daripada kegagalan yang dilaporkan.

Memisahkan menjadi beberapa blok — garis kosong sebagai pemisah dan masalah dengan spasi kosong dan CRLF

Pemisahan terjadi pada baris kosong, bukan pada nomor indeks. Parser menormalkan akhiran baris terlebih dahulu, menggantikan pasangan CRLF dan satu-satunya CR dengan satu baris baru, karena file yang dibuat di Windows dan diedit di Unix dapat berisi keduanya. Kemudian terpecah menjadi dua atau lebih baris baru, memangkas setiap blok yang dihasilkan dan membuang yang kosong. Pengurutan itu penting: pemisahan sebelum normalisasi akan meninggalkan kereta kembali di akhir baris kode waktu, dan kode waktu kemudian akan gagal untuk dicocokkan.

Tanda urutan byte dihapus sebelum semua ini. UTF-8 BOM di awal file adalah tiga byte yang dilihat oleh parser naif sebagai bagian dari nomor indeks pertama, yang cukup untuk membuat isyarat pertama tidak dapat dibaca sementara setiap isyarat berikutnya diurai. Spasi tambahan pada garis pemisah yang kosong ditangani oleh trim, sehingga file yang baris kosongnya berisi spasi masih terpecah dengan benar.

Garis indeks — mengapa angka sering kali salah, terduplikasi, atau hilang dan mengapa parser tidak boleh mempercayainya

Nomor indeks dibaca dan kemudian diabaikan. Nomor file asli memberi isyarat dari nol, memulai ulang penomoran setelah penggabungan, menduplikasi nomor setelah pengeditan manual, atau menghilangkan baris seluruhnya saat konverter menulis file. Mempercayai angka-angka tersebut berarti mewarisi setiap kesalahan tersebut, sehingga parser menetapkan nomor urutnya sendiri, menghitung isyarat yang telah berhasil dibangun sejauh ini.

Pilihan itu juga menjelaskan mengapa parser tidak pernah mengharuskan adanya garis indeks. Ini menemukan baris kode waktu dengan mencari blok untuk baris pertama yang berisi panah, daripada berasumsi kode waktu adalah baris kedua. Sebuah blok tanpa garis indeks akan diurai secara normal, dan sebuah blok dengan dua garis nyasar sebelum kode waktu masih akan diurai, karena posisi bukanlah yang mengidentifikasi kode waktu.

Baris kode waktu — HH:MM:SS,mmm --> HH:MM:SS,mmm, variasi yang ditoleransi dan variasi yang merusak pemain

Baris kode waktu dicocokkan dengan satu ekspresi reguler, dan toleransi di dalamnya disengaja. Jam bersifat opsional, karena WebVTT mengizinkan pembacaan dua bidang dan konverter memancarkannya. Baik koma atau titik diterima sebagai pemisah milidetik, apa pun format file yang diklaim, karena pemisah campuran cukup umum sehingga menolaknya akan menghasilkan lebih banyak file yang baik daripada file yang buruk. Digit pecahan diberi bantalan di sebelah kanan, sehingga isyarat yang diakhiri dengan satu digit dibaca sebagai ratusan milidetik, bukan satuan.

Dua pembacaan ditolak. Bidang menit atau detik di atas lima puluh sembilan ditolak daripada dibawa, karena sembilan puluh detik bukan merupakan pembacaan jam dan biasanya menunjukkan file yang rusak atau salah dikonversi; menormalkannya secara diam-diam akan menggerakkan isyarat. Sebuah baris yang awal atau akhir gagal diurai menghasilkan rekaman masalah yang menyebutkan teks yang menyinggung dan bentuk yang diharapkan, dan blok dilewati daripada ditebak.

Baris teks — isyarat multi-baris, tag pemformatan, dan di mana blok benar-benar berakhir

Segala sesuatu setelah baris kode waktu adalah teks isyarat, digabungkan kembali dengan baris baru. Tidak ada batasan garis dan tidak ada upaya untuk mengubah posisi, sehingga isyarat tiga baris bertahan sebagai tiga baris. Inilah alasan baris kosong menahan beban: ini adalah satu-satunya hal yang memberi tahu parser bahwa teks telah berakhir, itulah sebabnya isyarat yang teksnya berisi baris kosong akan dibaca sebagai dua blok dan paruh kedua akan dilaporkan tidak memiliki kode waktu.

Pengaturan isyarat dipisahkan dari stempel waktu akhir dengan dua spasi atau lebih. WebVTT memungkinkan arahan pemosisian seperti penyelarasan dan penempatan garis mengikuti waktu berakhir pada baris yang sama, sehingga parser memisahkannya sebelum stempel waktu diuraikan dan menyimpannya di samping isyarat. Spasi tunggal bukanlah pemisah, yang menjaga baris kode waktu yang tidak rapi agar tidak kehilangan waktu akhirnya.

Contoh praktis: mengurai file dengan lima isyarat dengan dua kesalahan yang disengaja - apa yang dipulihkan oleh parser yang kuat dan apa yang ditandainya

Ambil file lima blok yang baris kode waktunya di blok tiga rusak sehingga terbaca 00:01:75,000 --> 00:01:78,000, dan blok empat telah kehilangan baris kode waktunya seluruhnya selama salin dan tempel. Parser membaca blok satu dan dua secara normal dan memberi nomor satu dan dua. Blok tiga cocok dengan bentuk kode waktu tetapi memiliki kolom detik tujuh puluh lima, sehingga ditolak dan dicatat sebagai stempel waktu yang buruk dengan menyebutkan baris yang tidak dapat dibaca.

Blok empat tidak berisi panah sama sekali, sehingga dicatat tidak memiliki stempel waktu, mengutip empat puluh karakter pertama blok tersebut sehingga baris tersebut dapat ditemukan di file aslinya. Blok lima diurai dan menjadi isyarat tiga, bukan isyarat lima, karena penomoran menghitung isyarat yang berhasil. Hasilnya adalah tiga isyarat yang dapat digunakan dan dua keluhan spesifik yang ada, bukan pengecualian pada kesalahan pertama dan tidak ada informasi tentang kesalahan kedua.

Yang tidak tercakup dalam hal ini — ASS/SSA gaya, kode posisi, dan teks non-subtitle dimasukkan ke SRT

Ini menjelaskan SRT dan bagian WebVTT yang memiliki bentuk isyarat yang sama. Ini tidak mencakup ASS dan SSA, yang membawa header skrip, definisi gaya, dan referensi gaya per acara, dan yang tidak dapat dibaca dengan memisahkan baris kosong. Pengaturan waktu karaoke, perintah menggambar, dan tag penggantian sebaris yang digunakan format tersebut berada di luar model parser isyarat dan kode waktu.

Itu juga tidak memperbaiki teks. Transkrip yang ditempelkan ke dalam file tanpa kode waktu menghasilkan daftar blok yang tidak memiliki stempel waktu, yang dilaporkan secara akurat tetapi tidak dapat diubah menjadi subtitle tanpa informasi waktu yang tidak ada. Kesalahan pengkodean adalah masalah tersendiri: file yang didekode dengan jaringan karakter yang salah diurai menjadi isyarat yang benar-benar valid dan teksnya salah, dan tidak ada pemeriksaan struktural yang dapat mendeteksinya.

Kesimpulan: uraikan dengan lembut, tulis dengan ketat — bagaimana Perangkat Subtitle membaca SRT yang berantakan dan menulis kembali yang bersih

Aturan kerjanya adalah menguraikan dengan lunak dan menulis dengan ketat. Dalam perjalanan masuk, terima jam opsional, baik pemisah, baris indeks yang hilang, akhiran baris campuran, dan tanda urutan byte terdepan, dan catat setiap kesalahan sebagai masalah yang ada alih-alih melemparkan yang pertama, sehingga file dapat diperbaiki dalam sekali jalan. Di jalan keluar, pancarkan satu bentuk kanonik.

Itulah yang dilakukan Perangkat Subtitle saat melakukan konversi. Isyarat dinomori ulang dari satu dan tetap berdekatan, stempel waktu dipancarkan kembali dengan koma untuk SRT dan titik untuk WebVTT, dan file yang dihasilkan adalah bentuk yang diharapkan pemain terlepas dari seberapa tidak teratur masukannya. Tempel file yang ditolak pemain ke dalam konverter dan baca masalah yang dilaporkan terlebih dahulu; mereka menyebutkan isyarat dan mengutip barisnya, yang biasanya cukup untuk menemukan kesalahan pada aslinya.