Apa arti semua singkatan ini? Apa yang diperlukan untuk mengembangkan pemutar sumber terbuka untuk menonton video dari Amazon, Sky dan platform lain dan menonton video dari penyedia mana pun? Sebastian Golasch berbicara tentang bagaimana proses streaming video berlangsung di konferensi HolyJS 2018 Piter. Di bawah potongan video dan terjemahan laporannya.
Sebastian Golasch saat ini adalah pengembang di Deutsche Telekom. Dia bekerja dengan Java dan PHP untuk waktu yang lama, dan kemudian beralih ke JS, Python, dan Rust. Selama tujuh tahun terakhir, ia telah bekerja pada platform milik rumah pintar Qivicon.Sedikit tentang sejarah streaming video
Pertama, mari kita lihat sejarah web, karena kita telah beralih dari QuickTime ke Netflix dalam 25 tahun. Semuanya dimulai pada tahun 90-an ketika Apple menemukan QuickTime. Penggunaannya di Internet dimulai pada 1993-1994. Pada saat itu, pemain dapat memutar video dengan resolusi 156 ร 116 piksel dan frekuensi 10 FPS, tanpa akselerasi perangkat keras (hanya menggunakan sumber daya prosesor). Format ini difokuskan pada koneksi dial-up 9600 baud - 9600 bps, termasuk informasi overhead.
Itu adalah waktu browser Netscape. Video di browser tidak terlihat terlalu bagus, karena itu bukan asli web. Untuk pemutaran, kami menggunakan perangkat lunak eksternal (QuickTime yang sama) dengan antarmuka sendiri, yang divisualisasikan di browser menggunakan tag embed.

Situasi menjadi sedikit lebih baik ketika Macromedia merilis Shockwave Player (setelah pengambilalihan Macromedia oleh Adobe, itu dikenal sebagai Adobe Flash Player). Versi pertama dari Shockwave Player dirilis pada tahun 1997, tetapi pemutaran video hanya muncul di tahun 2002.
Mereka menggunakan Sorenson Spark alias codec H.263. Ini telah dioptimalkan untuk resolusi kecil dan ukuran file kecil. Apa artinya ini? Misalnya, video 43 detik yang digunakan untuk menguji Shockwave Player dengan berat hanya 560 KB. Tentu saja, tidak akan terlalu menyenangkan untuk menonton film dengan kualitas ini, tetapi teknologinya sendiri menarik untuk saat itu. Namun, seperti halnya QuickTime, agar Shockwave Player berfungsi di browser, diperlukan perangkat lunak tambahan. Pemain ini memiliki banyak masalah keamanan, tetapi yang paling penting adalah bahwa video itu masih merupakan add-on browser.
Pada tahun 2007, Microsoft merilis Silverlight, agak mengingatkan pada Flash. Kami tidak akan menggali lebih dalam, tetapi semua solusi ini memiliki kesamaan - kotak hitam. Semua pemain berfungsi sebagai add-on browser, dan Anda tidak tahu apa yang sedang terjadi di dalamnya.

< Video/
> elemen
Pada 2007, Opera mengusulkan menggunakan tag <
Video/
>, yaitu membuat video asli di browser. Kami menggunakannya hari ini. Mudah dan nyaman, dan video apa pun tidak hanya dapat dilihat, tetapi juga diunduh. Dan bahkan jika kami tidak ingin mengizinkan pengunduhan video, kami tidak dapat melarang mengunduhnya ke browser. Maksimumnya adalah membuat pengunduhan video lebih sulit.

<Video/>
adalah kebalikan dari kotak hitam, dan melihat kode sumber sangat sederhana.

DRM
Namun, Anda tidak bisa mengklik kanan pada video di Netflix dan memilih "Simpan Sebagai". Alasannya adalah DRM (Digital Restrictions Management). Ini bukan teknologi tunggal atau aplikasi tunggal yang melakukan tugas apa pun. Ini adalah istilah umum untuk konsep seperti:
- Otentikasi dan Enkripsi Pengguna
- Enkripsi Berbasis Konten
- Definisi hak dan penerapan pembatasan
- Umpan balik dan pembaruan
- Kontrol keluaran dan perlindungan tautan
- Pemeriksaan dan pelacakan penyusup
- Manajemen kunci dan lisensi
Untuk memahami apa itu DRM, kita perlu mempelajari ekosistemnya, yaitu untuk mengetahui perusahaan mana yang terlibat. Ini adalah:
- Pemilik konten berada di puncak ekosistem. Misalnya, Disney, MGM atau FIFA. Perusahaan-perusahaan ini menghasilkan konten, dan mereka memiliki hak untuk itu.
- DRM Cores adalah perusahaan yang menyediakan teknologi DRM (misalnya, Google, Apple, Microsoft, dll.) Saat ini, ada sekitar 7-8 teknologi DRM dari perusahaan yang berbeda.
- Penyedia Layanan - Mengembangkan perangkat lunak server yang mengenkripsi video.
- Browser yang sebenarnya adalah pemain.
- Penyedia konten adalah perusahaan seperti Netflix, Amazon, Sky, dll. Sebagai aturan, mereka tidak memiliki hak atas konten, mereka melisensikan dan mendistribusikannya.
- Vendor chip / perangkat juga terlibat dalam ekosistem, karena DRM bukan hanya teknologi perangkat lunak. Beberapa perusahaan (terutama Cina) sedang mengembangkan chip yang menyandikan dan mendekode video.
Pernahkah Anda bertanya-tanya mengapa ketika melihat video di Netflix di browser itu tidak memiliki resolusi sangat tinggi (SD), tetapi jika Anda menonton video yang sama di Apple TV atau Android TV Box, konten yang sama diputar dalam Full HD atau dalam 4K? DRM juga bertanggung jawab untuk ini. Faktanya adalah bahwa produsen selalu takut bajak laut mencuri konten. Oleh karena itu, semakin tidak aman lingkungan di mana decoding video dilakukan, semakin buruk kualitas yang ditunjukkan kepada pengguna. Misalnya, jika decoding dilakukan secara terprogram (misalnya, di Chrome atau Firefox), video ditampilkan dalam kualitas terburuk. Di lingkungan di mana kemampuan perangkat keras untuk mendekode digunakan (misalnya, jika Android menggunakan GPU), kemungkinan penyalinan konten ilegal kurang, dan di sini kualitas pemutaran lebih tinggi. Akhirnya, lingkungan yang paling aman adalah perangkat keras sepenuhnya (Apple TV atau Android TV Box), di mana decoding dan pemutaran dilakukan tanpa melibatkan perangkat lunak.

Tetapi jika kita berbicara tentang browser, maka decoding di dalamnya hampir selalu dilakukan oleh perangkat lunak. Browser yang berbeda menggunakan sistem yang berbeda untuk DRM. Chrome dan Firefox menggunakan Widevine. Perusahaan ini dimiliki oleh Google dan melisensikan aplikasi DRM mereka. Jadi, untuk decoding, Firefox mengunduh perpustakaan DRM dari Google. Di browser Anda dapat melihat dari mana unduhan berasal.

Apple menggunakan sistem FairPlay sendiri, yang diciptakan kembali ketika perusahaan memperkenalkan iPhone dan iPad pertama. Microsoft juga menggunakan pengembangannya sendiri yang disebut PlayReady, yang dibangun langsung ke Windows. Dalam kasus lain, Widevine paling sering digunakan. Sistem ini ada baik sebagai aplikasi dan sebagai solusi perangkat keras - chip yang memecahkan kode video.
Cdm
Singkatan CDM singkatan dari Modul Dekripsi Konten. Ini adalah beberapa perangkat lunak atau perangkat keras yang dapat bekerja dalam beberapa cara:
- Dekripsi video, setelah itu di-render di browser menggunakan tag <Video />.
- Dekripsi dan dekode video, dan kemudian transfer frame mentah video untuk diputar ke browser.
- Dekripsi dan dekode video, dan kemudian transfer frame mentah video untuk diputar menggunakan GPU.
Meskipun dukungan GPU, opsi kedua paling sering digunakan (setidaknya ketika datang ke Chrome dan Firefox).
Decoding dan decoding layer di browser
Jadi bagaimana semuanya bekerja bersama? Untuk memahami ini, lihat pada layer decoding dan dekripsi di browser. Mereka dibagi menjadi:
- Aplikasi JavaScript - memberitahu komputer video mana yang akan saya tonton.
- Browser adalah pemain yang memainkan konten video.
- Modul dekripsi konten.
- Manajemen hak digital adalah tentang decoding video (saya tidak dapat menghasilkan notasi yang lebih baik, jadi saya menyebutnya begitu).
- Runtime tepercaya.
- Dalam hal ini, dua komponen pertama adalah pemutar DRM, modul dekripsi konten adalah klien DRM, dan dua komponen terakhir adalah inti DRM.

Apa yang terjadi ketika Anda memutar video di browser ditunjukkan pada gambar di bawah ini. Dia, tentu saja, agak membingungkan: ada banyak panah dan warna. Saya akan memahaminya langkah demi langkah, menggunakan case nyata untuk membuatnya lebih jelas

Kami akan menggunakan Netflix sebagai contoh. Saya menulis aplikasi debugging.
Saya mulai dengan di mana, saya pikir, Anda masing-masing akan mulai: Saya melihat permintaan yang dibuat Netflix ketika saya memulai video, dan saya melihat sejumlah besar rekaman.

Namun, jika Anda hanya menyisakan yang benar-benar diperlukan untuk memutar video, ternyata hanya ada tiga: manifes, lisensi, dan fragmen video pertama.

Pemain Netflix ditulis dalam JavaScript dan berisi lebih dari 76.000 baris kode, dan, tentu saja, saya tidak dapat menguraikannya sepenuhnya. Tetapi saya ingin menunjukkan bagian-bagian utama yang diperlukan untuk memutar video yang dilindungi.
Kami akan mulai dengan templat:

EME
Tetapi sebelum kita mempelajari fungsinya, kita perlu berkenalan dengan teknologi lain - EME (Encrypted Media Extensions, ekstensi media terenkripsi). Teknologi ini tidak melakukan dekripsi dan decoding, itu hanya API peramban. EME berfungsi sebagai antarmuka untuk CDM, untuk KeySystem, untuk server dengan lisensi, dan untuk server tempat konten disimpan.
Jadi mari kita mulai dengan getKeySystemConfig.

Harus diingat bahwa itu tergantung pada penyedia, sehingga konfigurasi yang saya sajikan di sini berfungsi untuk Netflix, tetapi tidak berfungsi, katakanlah, untuk Amazon.
Dalam konfigurasi ini, kita harus memberi tahu sistem backend tingkat runtime tepercaya yang dapat kami tawarkan. Ini bisa berupa decoding perangkat keras yang aman atau decoding perangkat lunak yang aman. Artinya, kami memberi tahu sistem perangkat keras dan lunak mana yang akan digunakan untuk pemutaran. Dan itu akan menentukan kualitas konten.

Setelah konfigurasi dikonfigurasi, lihat membuat MediaKeySystem awal.

Di sinilah interaksi dengan modul dekripsi konten dimulai. Anda harus memberi tahu API sistem DRM dan KeySystem mana yang kami gunakan. Dalam kasus kami, ini Widevine.

Langkah selanjutnya adalah opsional untuk semua sistem, tetapi diperlukan untuk Netflix. Sekali lagi, kebutuhannya tergantung pada penyedia. Kita perlu menerapkan sertifikat server ke mediaKeys kami. Sertifikat server adalah teks biasa dalam file Netflix Cadmium.js yang dapat dengan mudah disalin. Dan ketika kami menerapkannya pada mediaKeys, maka semua komunikasi antara server dengan lisensi dan browser kami menjadi aman berkat penggunaan sertifikat ini.

Ketika ini selesai, kita harus beralih ke elemen asli video dan berkata: "Oke, ini adalah sistem kunci yang ingin kita gunakan, dan ini adalah tag video halo. Biarkan kami mempersatukan Anda. "

Dan inilah fungsi terakhir yang Anda perlukan untuk mengonfigurasi sistem video.

Ini adalah sesi DRM, atau MediaKeySession. Ini hanya data yang masuk dari penyedia ke modul dekripsi yang menandatangani permintaan dengan mereka. Data ini juga berupa teks biasa, yang tersembunyi di balik beberapa fungsi di file pemain Netflix, tempat saya menyalinnya.

Saat kami memanggil create. Sesi pada objek mediaKeys, kami perlu memberi tahu video mana yang kami dukung. Dalam hal ini, mp4. Ini membawa kita kembali ke konteks pengiriman pesan dengan sistem CDM kami. Kami juga membutuhkan Netflix untuk menerapkan sertifikat server base64 di setiap formulir, tetapi semua konfigurasi ini dalam sesi buat lagi disediakan tergantung pada sistem DRM.

Fungsi terakhir di sini di bawah ini - keySession.generateRequest membangun permintaan lisensi di latar belakang. Atau CDM sedang membangun permintaan lisensi di latar belakang. Dengan kata lain, ini adalah data biner mentah yang harus kami kirim ke server berlisensi untuk mendapatkan lisensi yang valid sebagai imbalannya.

Di sini cenc menarik. Ini adalah standar enkripsi ISO yang menetapkan skema keamanan untuk video mp4. Di WebM, ini disebut berbeda, tetapi fungsinya melakukan hal yang sama.
handleMessage adalah antarmuka EventListener yang kami konfigurasikan. Ketika acara ini dimunculkan oleh acara pesan di keySession, kami tahu bahwa kami siap untuk mendapatkan lisensi dari server.

Dan dalam panggilan balik ini kami hanya mendapatkan permintaan ke server dengan lisensi yang memberikan beberapa data biner (mereka mungkin juga berbeda tergantung pada penyedia). Kami menggunakan data ini untuk memperbarui sesi saat ini dengan menambahkan lisensi. Yaitu, segera setelah kami menerima lisensi yang valid dari server, CDM kami tahu bahwa kami dapat memecahkan kode dan mendekripsi video.

Jika kami menerapkan ini pada diagram di bawah, kami mendapatkan ini: kami ingin memutar video, dan aplikasi JavaScript mengatakan: "Halo, browser! Saya ingin memutar videonya! โ - kemudian menggunakan Ekstensi Media Terenkripsi dan membuat permintaan ke Fungsi Lisensi di Widevine CDM untuk lisensi. Permintaan ini kemudian dikembalikan ke browser, dan kami dapat menukarnya dengan lisensi yang valid di server lisensi, dan kemudian kami perlu mentransfer lisensi ini kembali ke CDM. Proses ini ditunjukkan dalam kode di atas.

Tetapi perhatikan bahwa kita belum kehilangan satu detik dari video, dan kita semua perlu melakukan ini untuk dapat memutar beberapa video di masa depan.
MSE
Dan teknologi lain yang perlu kita teliti adalah MSE (Media Source Extensions). Dia bisa disebut saudara tiri EME (Encrypted Media Extensions). Ini juga API browser, dan tidak ada hubungannya dengan DRM. Saya melihatnya sebagai antarmuka pemrograman untuk <
Video/
> Src. Dengan menggunakannya, Anda dapat membuat aliran biner dalam JavaScript dan menerapkan fragmen video ke elemen <
Video/
>. Dengan demikian, berkat itu, sumber tag <
Video/
> menjadi dinamis.
Jadi, kita dapat menggunakan ekstensi untuk sumber multimedia, instantiate dan mengakses video, lalu mengunduh fragmen video di bagian dan menerapkannya pada tag <
Video/
>.

Intinya adalah ketika Anda menonton video dua jam, Anda tidak ingin menunggu sampai video terisi penuh. Sebagai gantinya, Anda memotongnya menjadi potongan-potongan kecil mulai dari ukuran sekitar 30 detik hingga 2 menit dan menerapkannya pada elemen <
Video/
> satu per satu.
Setelah buffer MediaSource kami siap dan ditautkan ke elemen <
Video/
>, kami dapat menambahkan SourceBuffer. Kita harus memberi tahu dia lagi format video dan codec mana yang kita gunakan, dan kemudian akan dibuat.

Akhirnya, kita sekarang dapat mengambil dari masing-masing fragmen dan mengirimkannya di SourceBuffer kita menggunakan metode append ke elemen <Video />, menerima video yang dibuat secara dinamis. Itu juga dapat digunakan untuk kasus penggunaan lain di mana orang dapat secara independen menggabungkan berbagai elemen video, membuat video mereka sendiri, tetapi saya tidak ingin menggali terlalu dalam.

Jadi ini hampir langkah terakhir yang harus kita ambil. Anda memiliki jaringan distribusi, Anda memiliki fragmen, dan kemudian browser mengirimkan fragmen terenkripsi dan terkompresi ke CDM, di mana dekripsi dan, mungkin, decoding dilakukan. Kemudian fragmen yang didekripsi dan tidak dikompresi dikirim kembali ke browser, di mana mereka divisualisasikan dan ditampilkan.

Terwujud
Tetapi ada satu hal lagi. Bagaimana kita tahu fragmen mana yang perlu kita unduh, dari mana kita mengunduhnya, dan kapan? Dan ini adalah bagian terakhir, permintaan yang hilang dari manifes. Ketika kami meminta Netflix untuk manifes, itu membutuhkan banyak data. Jika kami hanya ingin memutar video, penting bagi kami sistem DRM mana yang kami gunakan, video mana yang ingin kami tonton (Netflix ID, yang dapat disalin dari URL) dan profil. Profil menentukan dalam resolusi apa kami menerima video, dan juga dalam bahasa apa kami menerima trek audio, dalam format apa (stereo, Dolby Digital, dll.), Apakah kami menggunakan subtitle, dll.

MPEG-DASH
Format manifes yang paling umum digunakan adalah MPEG-DASH. Benar, Apple menggunakan format yang berbeda - HSL, yang tampilannya menyerupai daftar file di pemutar Winamp lama. Tapi Widevine dan Microsoft menggunakan MPEG-DASH persis. Ini didasarkan pada XML, dan mendefinisikan semuanya: durasi, ukuran buffer, tipe konten, ketika fragmen dimuat, fragmen untuk resolusi yang berbeda, serta bitrate switching yang adaptif. Yang terakhir berarti bahwa jika pengguna, misalnya, menonton video dan pada saat yang sama kecepatan unduhannya menurun, pemutaran tidak berhenti, tetapi kualitas video justru memburuk. Ini karena fakta bahwa manifes menentukan bagian yang sama untuk resolusi yang berbeda, mereka memiliki durasi yang sama dan indeks yang sama. Oleh karena itu, jika kecepatan unduhan menurun, browser dapat dengan mudah beralih ke aliran dengan resolusi lebih rendah tanpa menjeda unduhan dan tanpa buffering data.
Inilah bentuk manifesto dari Guardians of the Galaxy. Di dalamnya kita dapat melihat bahwa pada kecepatan unduhan yang berbeda orang akan menerima video dengan kualitas yang berbeda, serta fakta bahwa ada trek audio untuk orang dengan gangguan pendengaran. Itu juga merinci subtitle.

Kami memiliki durasi dan indikasi waktu mulai pemutaran. Fungsi ini digunakan, misalnya, ketika Anda mengganggu menonton dan kemudian kembali ke video lagi, mulai dari tempat Anda tinggalkan.

Ada juga ketahanan lagi, yang mengatakan: fragmen ini dapat hilang hanya jika sistem Anda memenuhi persyaratan. Dalam hal ini, ini adalah decoding perangkat keras - Hardware Secure Codecs.

Untuk bagian video yang sama, Anda dapat menentukan sejumlah fragmen dengan resolusi berbeda.

Dan kemudian Anda mendapatkan URL untuk memuat fragmen, dan parameter rentang menunjukkan rentang nilai dalam milidetik.

Ini bagian terakhir. Anda juga terkadang mendapatkan manifes dari CDN. Beberapa penyedia memiliki server terpisah untuk pengiriman fragmen, tetapi paling sering mereka berasal dari mesin yang sama dengan fungsi manifes. Ketika kami mengunduh manifes, kami tahu fragmen mana yang perlu kami unduh, kami dapat mengirim permintaan untuk fragmen, lalu mendekripsi dan mendekode dari CDM.

Secara umum, itu saja. Semua yang dikatakan di atas cukup untuk mengembangkan pemain open source untuk menonton video dari Amazon, Sky dan platform lainnya dan menonton video dari hampir semua penyedia.
Nyonya
Netflix menganggapnya layak menambahkan enkripsi pesan ekstra antara browser dan server. Mereka menyebutnya "Lapisan Keamanan Pesan," Lapisan Keamanan Pesan, atau MSL. Itu tidak melakukan apa pun secara langsung dengan video, itu hanya lapisan enkripsi tambahan. Salah satu alasan untuk menerapkan MSL adalah bahwa HTTPS tidak cukup aman.
MSL , di sisi lain, adalah open source, sehingga Anda selalu dapat melihat cara kerjanya. Di sini saya tidak akan membahas topik ini, dan jika Anda tertarik, Anda selalu dapat menemukan informasi tentang mengapa Netflix melakukan MSL di blog mereka. GitHub memiliki dokumentasi terperinci tentang implementasi dan implementasi kerjanya di Jawa.
Ada juga
implementasi Python yang kami tulis bersama teman-teman. Sejauh yang saya tahu, ini adalah satu-satunya klien open source yang berfungsi untuk Netflix. Dia bekerja dengan Kodi Media Center. Untuk visualisasi, Anda dapat menggunakan VLC Player atau perangkat lunak lain yang sesuai.
Dan lagi "kotak hitam"
Jadi, Anda melihat apa yang kami butuhkan untuk mengimplementasikan semua ini, dan seberapa sering saya menyebutkan CDM - "kotak hitam" yang diunduh dari Google. Jadi, kami kembali mengembalikan video ke "kotak hitam". Elemen <Video /> yang indah sekali lagi disembunyikan dari kami. Kami telah menambahkan perangkat lunak pihak ketiga yang membantu kami, tetapi yang pada saat yang sama ditutup dan yang tidak dapat kami kelola. Ini dapat melakukan banyak hal yang tidak mencolok: pelacakan, analitik, mengirim data ...

Inilah yang dikatakan Tim Berners Lee tentang ini:
"Jadi, secara umum, penting untuk mempertahankan EME sebagai lingkungan online yang relatif aman di mana Anda dapat menonton film, serta yang paling nyaman dan yang menjadikannya bagian dari wacana saling terhubung umat manusia."Tetapi ada pendapat lain tentang ini. Khususnya, dari Electronic Frontiers Foundation, yang sebelum kedatangan DRM adalah anggota W3C. Inilah yang mereka katakan:
โPada 2013, EFF kecewa mengetahui bahwa W3C mengambil alih proyek standardisasi EME - ekstensi media terenkripsi. Faktanya, kita berbicara tentang API yang fungsinya hanya untuk memberi DRM peran utama dalam ekosistem browser. Kami akan terus berjuang untuk memastikan bahwa Internet gratis dan terbuka. "Kami akan terus menuntut pemerintah AS untuk mencabut undang-undang yang membuat DRM sangat beracun, dan kami akan terus berjuang di tingkat hukum global."Sulit bagi saya untuk mengatakan bagaimana menghubungkannya dengan ini. , , , . , Netflix, . , , .
, 24-25 , HolyJS 2018 Moscow , ยซThe Universal Serial Webยป : WebUSB, USB- . -, .
PS 1- . , โ 50% .