Bagaimana kami mempercepat pengkodean video sebanyak delapan kali lipat

Bagaimana kami mempercepat pengkodean video sebanyak delapan kali lipat

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

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

Posting ini terutama akan menarik bagi mereka yang belum pernah memikirkan apa yang terjadi di balik terpal layanan video. Di komentar Anda dapat mengajukan pertanyaan dan menyarankan topik untuk postingan selanjutnya.

Beberapa kata tentang tugas itu sendiri. Yandex tidak hanya membantu Anda mencari video di situs lain, tetapi juga menyimpan video untuk layanannya sendiri. Baik itu program orisinal atau siaran pertandingan olahraga, film di KinoPoisk, atau video di Zen dan Berita - semua ini diunggah ke server kami. Agar pengguna dapat menonton video, perlu dipersiapkan: dikonversi ke format yang diperlukan, membuat pratinjau, atau bahkan dijalankan melalui teknologi DeepHD. File yang tidak disiapkan hanya memakan ruang. Selain itu, kita tidak hanya berbicara tentang penggunaan perangkat keras yang optimal, tetapi juga tentang kecepatan pengiriman konten kepada pengguna. Contoh: rekaman momen penentu suatu pertandingan hoki dapat dicari dalam satu menit setelah kejadian itu sendiri.

Pengkodean berurutan

Jadi, kebahagiaan pengguna sangat bergantung pada seberapa cepat video tersedia. Dan ini terutama ditentukan oleh kecepatan transcoding. Jika tidak ada persyaratan ketat untuk kecepatan upload video, maka tidak ada masalah. Anda mengambil satu file yang tidak dapat dibagi, mengonversinya, dan mengunggahnya. Di awal perjalanan kami, inilah cara kami bekerja:

Bagaimana kami mempercepat pengkodean video sebanyak delapan kali lipat

Klien mengunggah video ke penyimpanan, komponen Penganalisis mengumpulkan informasi meta dan mentransfer video ke komponen Pekerja untuk konversi. Semua tahapan dilakukan secara berurutan. Dalam hal ini, mungkin terdapat banyak server pengkodean, tetapi hanya satu yang sibuk memproses video tertentu. Diagram sederhana dan transparan. Di sinilah kelebihannya berakhir. Skema ini hanya dapat ditingkatkan secara vertikal (karena pembelian server yang lebih kuat).

Pengkodean berurutan dengan hasil antara

Untuk memuluskan penantian yang menyakitkan, industri ini hadir dengan opsi pengkodean cepat. Namanya menyesatkan, karena pada kenyataannya, pengkodean penuh terjadi secara berurutan dan memakan waktu yang sama lamanya. Tapi dengan hasil antara. Idenya adalah ini: menyiapkan dan mempublikasikan versi video beresolusi rendah secepat mungkin, dan baru kemudian versi resolusi lebih tinggi.

Di satu sisi, video tersedia lebih cepat. Dan itu berguna untuk acara-acara penting. Namun di sisi lain, gambarnya menjadi buram dan mengganggu pemirsa.

Ternyata Anda tidak hanya perlu memproses video dengan cepat, tetapi juga menjaga kualitasnya. Inilah yang diharapkan pengguna dari layanan video saat ini. Tampaknya membeli server paling produktif saja sudah cukup (dan memperbarui semuanya secara rutin sekaligus). Tapi ini jalan buntu, karena selalu ada video yang akan membuat perangkat keras paling kuat sekalipun menjadi lambat.

Pengkodean paralel

Jauh lebih efisien untuk membagi masalah yang kompleks menjadi beberapa masalah yang tidak terlalu rumit dan menyelesaikannya secara paralel di server yang berbeda. Ini MapReduce untuk video. Dalam hal ini, kami tidak dibatasi oleh kinerja satu server dan dapat melakukan penskalaan secara horizontal (dengan menambahkan mesin baru).

Omong-omong, gagasan untuk membagi video menjadi potongan-potongan kecil, memprosesnya secara paralel, dan merekatkannya bukanlah rahasia. Anda dapat menemukan banyak referensi tentang pendekatan ini (misalnya, di HabrΓ© saya merekomendasikan postingan tentang proyek tersebut DistVIDc). Namun hal ini tidak membuatnya lebih mudah secara keseluruhan, karena Anda tidak bisa hanya mengambil solusi siap pakai dan membangunnya di rumah Anda. Kami memerlukan adaptasi terhadap infrastruktur kami, video kami, dan bahkan beban kami. Secara umum, lebih mudah untuk menulis sendiri.

Jadi, dalam arsitektur baru, kami membagi blok Pekerja monolitik dengan pengkodean berurutan menjadi layanan mikro Segmenter, Tcoder, Combiner.

Bagaimana kami mempercepat pengkodean video sebanyak delapan kali lipat

  1. Segmenter memecah video menjadi beberapa bagian berdurasi sekitar 10 detik. Fragmen terdiri dari satu atau lebih GOP (sekelompok gambar). Setiap GOP bersifat independen dan dikodekan secara terpisah sehingga dapat didekodekan tanpa mengacu pada frame dari GOP lain. Artinya, fragmen dapat dimainkan secara independen satu sama lain. Sharding ini mengurangi latensi, memungkinkan pemrosesan dimulai lebih awal.
  2. Tcoder memproses setiap fragmen. Dibutuhkan tugas dari antrian, mengunduh sebuah fragmen dari penyimpanan, mengkodekannya ke dalam resolusi yang berbeda (ingat bahwa pemain dapat memilih versi berdasarkan kecepatan koneksi), kemudian memasukkan hasilnya kembali ke dalam penyimpanan dan menandai fragmen tersebut sebagai diproses dalam basis data. Setelah memproses semua fragmen, Tcoder mengirimkan tugas untuk menghasilkan hasil untuk komponen berikutnya.
  3. Penggabung mengumpulkan hasilnya bersama-sama: mengunduh semua fragmen yang dibuat oleh Tcoder, menghasilkan aliran untuk resolusi berbeda.

Beberapa kata tentang suara. Codec audio AAC paling populer memiliki fitur yang tidak menyenangkan. Jika Anda mengkodekan fragmen secara terpisah, Anda tidak akan bisa merekatkannya dengan mulus. Transisi akan terlihat jelas. Codec video tidak mengalami masalah ini. Secara teoritis, Anda dapat mencari solusi teknis yang rumit, tetapi game ini belum sepadan (audio berbobot jauh lebih ringan daripada video). Oleh karena itu, hanya video yang dikodekan secara paralel, dan seluruh trek audio diproses.

Temuan

Berkat pemrosesan video paralel, kami telah mengurangi penundaan secara signifikan antara video yang diunggah ke kami dan tersedia bagi pengguna. Misalnya, sebelumnya diperlukan waktu dua jam untuk membuat beberapa versi lengkap dengan kualitas berbeda untuk film FullHD yang berdurasi satu setengah jam. Sekarang semua ini membutuhkan waktu 15 menit. Selain itu, dengan pemrosesan paralel, kami membuat versi resolusi tinggi lebih cepat daripada versi resolusi rendah dengan pendekatan hasil antara yang lama.

Dan satu hal lagi. Dengan pendekatan lama, server tidak mencukupi, atau server menganggur tanpa tugas. Pengkodean paralel memungkinkan Anda meningkatkan porsi daur ulang besi. Sekarang cluster kami yang terdiri lebih dari seribu server selalu sibuk dengan sesuatu.

Faktanya, masih ada ruang untuk perbaikan. Misalnya, kita dapat menghemat banyak waktu jika kita mulai memproses bagian-bagian video sebelum sampai kepada kita secara keseluruhan. Seperti yang mereka katakan, masih banyak lagi yang akan datang.

Tulis di komentar tugas apa di bidang pengerjaan video yang ingin Anda baca.

Tautan yang berguna ke pengalaman rekan industri

Sumber: www.habr.com

Tambah komentar