Bagaimana kami mempercepat encoding video delapan kali



Setiap hari, jutaan pemirsa menonton video di Internet. Tetapi agar video tersedia, itu tidak hanya harus diunggah ke server, tetapi juga diproses. Semakin cepat ini terjadi, semakin baik layanan dan penggunanya.

Nama saya Askar Kamalov, setahun yang lalu saya bergabung dengan tim teknologi video Yandex. Hari ini saya secara singkat akan memberi tahu pembaca Habr tentang bagaimana, menggunakan paralelisasi proses pengkodean, kami berhasil mempercepat pengiriman video ke pengguna berkali-kali.

Posting ini terutama akan menarik bagi mereka yang belum pernah berpikir tentang apa yang terjadi di bawah tenda layanan video. Dalam komentar, Anda dapat mengajukan pertanyaan dan menyarankan topik untuk posting selanjutnya.

Beberapa kata tentang tugas itu sendiri. Yandex tidak hanya membantu mencari video di situs lain, tetapi juga menyimpan video untuk layanannya sendiri. Baik itu program penulis atau pertandingan olahraga di Ether, film di KinoPoisk atau video dalam Zen dan Berita - semua ini diunggah ke server kami. Agar pengguna dapat menonton video, video harus disiapkan: konversikan ke format yang diperlukan, buat pratinjau, atau bahkan mengendarainya melalui teknologi DeepHD . File yang tidak siap hanya membutuhkan ruang. Dan kita berbicara tidak hanya tentang penggunaan besi yang optimal, tetapi juga tentang kecepatan pengiriman konten ke pengguna. Contoh: catatan dengan momen yang menentukan dari pertandingan hoki dapat dicari dalam pencarian dalam satu menit setelah acara itu sendiri.

Pengodean berurutan


Jadi, kebahagiaan pengguna sangat tergantung pada seberapa cepat video tersedia. Dan ini terutama ditentukan oleh kecepatan transcoding. Ketika tidak ada persyaratan ketat untuk kecepatan unggah video, maka tidak ada masalah. Ambil satu file yang tidak dapat dibagi, konversikan, unggah. Di awal perjalanan kami, kami bekerja seperti ini:



Klien mengunggah video ke repositori, komponen Analyzer mengumpulkan informasi meta dan mentransfer video untuk dikonversi ke komponen Worker. Semua langkah dilakukan berurutan. Pada saat yang sama, mungkin ada banyak server untuk penyandian, tetapi hanya satu yang sibuk memproses video tertentu. Sederhana, tata letak transparan. Di sinilah manfaatnya berakhir. Skema seperti ini diskalakan hanya secara vertikal (karena pembelian server yang lebih kuat).

Pengurutan berurutan dengan hasil antara


Untuk melancarkan ekspektasi yang menyakitkan, industri mengeluarkan opsi pengkodean cepat. Ini adalah nama yang menipu, karena sebenarnya, pengkodean lengkap berlangsung secara berurutan dan selama. Tetapi dengan hasil antara. Idenya adalah ini: persiapkan dan unggah versi video resolusi rendah sesegera mungkin, dan hanya nanti - versi resolusi lebih tinggi.

Di satu sisi, video menjadi lebih cepat. Dan itu berguna untuk acara-acara penting. Tapi di sisi lain - gambarnya buram, dan ini mengganggu penonton.

Ternyata Anda tidak hanya perlu dengan cepat memproses video, tetapi juga untuk mempertahankan kualitasnya. Inilah yang sekarang diharapkan pengguna dari layanan video. Tampaknya sudah cukup untuk membeli server yang paling produktif (dan secara teratur memutakhirkan semuanya sekaligus). Tapi ini jalan buntu, karena selalu ada video yang akan memperlambat bahkan perangkat keras yang paling kuat.

Pengkodean paralel


Jauh lebih efisien untuk membagi tugas yang sulit menjadi banyak tugas yang kurang kompleks dan secara bersamaan menyelesaikannya di server yang berbeda. Tersebut adalah MapReduce untuk video. Dalam hal ini, kami tidak bergantung pada kinerja server tunggal dan dapat menskalakan secara horizontal (dengan menambahkan mesin baru).

Ngomong-ngomong, gagasan membagi video menjadi potongan-potongan kecil, secara bersamaan memproses dan menempelkannya bersama bukanlah rahasia. Anda dapat menemukan banyak referensi untuk pendekatan ini (misalnya, di HabrΓ© saya merekomendasikan posting tentang proyek DistVIDc ). Tetapi ini umumnya tidak membuatnya lebih mudah, karena Anda tidak bisa hanya mengambil solusi yang sudah jadi dan membangunnya sendiri. Kita perlu beradaptasi dengan infrastruktur kita, video kita, dan bahkan beban kerja kita. Secara umum, Anda lebih mudah menulis sendiri.

Jadi, dalam arsitektur baru, kami membagi blok Pekerja monolitik dengan pengkodean berurutan ke dalam microservices Segmenter, Tcoder, Combiner.



  1. Segmenter membagi video menjadi beberapa bagian dalam waktu sekitar 10 detik. Fragmen terdiri dari satu atau lebih GOP ( kelompok gambar ). Setiap GOP bersifat independen dan dikodekan secara terpisah, sehingga dapat didekodekan tanpa referensi ke bingkai dari GOP lain. Artinya, fragmen dapat direproduksi secara independen satu sama lain. Segmentasi ini mengurangi latensi, memungkinkan Anda untuk mulai memproses lebih awal.
  2. Tcoder . , , (, , ), . , Tcoder .
  3. ombiner : , Tcoder, .

Beberapa kata tentang suaranya. Codec audio AAC paling populer memiliki fitur jahat. Jika Anda mengkode fragmen secara terpisah, maka menempelkannya secara mulus tidak akan berfungsi. Transisi akan terlihat. Codec video tidak memiliki masalah seperti itu. Secara teoritis, Anda dapat mencari solusi teknis yang sulit, tetapi game ini tidak sepadan dengan lilin (audio berbobot jauh lebih sedikit daripada video). Karena itu, hanya video yang disandikan secara paralel dengan kami, dan trek audio diproses secara keseluruhan.

hasil


Berkat pemrosesan video paralel, kami secara signifikan mengurangi penundaan antara mengunduh video kepada kami dan ketersediaannya bagi pengguna. Sebagai contoh, sebelumnya bisa memakan waktu dua jam untuk membuat beberapa versi lengkap dengan kualitas yang berbeda untuk film FullHD yang tahan satu setengah jam. Sekarang semuanya butuh 15 menit. Selain itu, dalam pemrosesan paralel, kami membuat versi resolusi tinggi bahkan lebih cepat daripada versi resolusi rendah dengan pendekatan lama dengan hasil antara.

Dan sesuatu yang lain. Dengan pendekatan yang lama, salah satu server mungkin hilang atau tidak digunakan tanpa tugas. Pengkodean paralel dapat meningkatkan pangsa pemanfaatan besi. Sekarang sekelompok lebih dari seribu server kami selalu sibuk dengan sesuatu.

Bahkan, masih ada ruang untuk perbaikan. Misalnya, kita dapat menghemat banyak waktu jika kita mulai memproses fragmen-fragmen video bahkan sebelum sudah penuh. Seperti yang mereka katakan, lebih jauh - lebih banyak.

Tulis di komentar tentang tugas apa di bidang bekerja dengan video yang ingin Anda baca.

Tautan yang bermanfaat untuk rekan industri



All Articles