Codec AV1 baru: mempercepat pemuatan video di browser

Dalam panduan ini, kita akan belajar cara menggunakan video di Web, seperti kebiasaan pada tahun 2019. Chrome dan Firefox telah mulai mendukung codec AV1 baru - bagi mereka, video dapat dibuat separuh dari itu.

Kami akan berbicara secara terpisah bagaimana cara mengganti GIF dengan video dalam AV1 dan H.264 - maka ukurannya akan turun 20-40 kali.

Browser AV1 di

YouTube sudah menggunakannya di TestTube . Netflix mengatakan AV1 akan menjadi " codec generasi berikutnya ."

Kami di Evil Mars sudah menggunakannya di situs web kami dan di Amplifer . Pada artikel ini, saya akan berbagi pengalaman menerapkan AV1 dan langkah-demi-langkah memberi tahu Anda cara menyematkan video agar berfungsi di semua browser.

Codec dan wadah


Semuanya sederhana dengan gambar: baik JPEG dengan PNG untuk semua browser, atau membuat file yang lebih ringkas di WebP untuk browser modern . Kami selalu dapat memastikan bahwa file .png akan memiliki format PNG (dengan pengecualian yang jarang dari bom PNG yang dapat dilindungi imgproxy ).

File video lebih rumit. Ekstensi file ( .mp4 , .wmv , .webm atau .mov ) hanya berbicara tentang wadah. Sedangkan file video terdiri dari tiga komponen berbeda:

  1. Codec video menentukan seberapa banyak Anda dapat mengompres video, dan apa yang harus Anda korbankan. Codec video utama dari Web: H.264, HEVC, VP9 dan, sekarang, AV1.
  2. Codec audio memadatkan suara. Tentu saja, itu tidak diperlukan jika tidak ada suara di video. Pilihan yang populer adalah MP3, Opus, dan AAC.
  3. Kontainer menyimpan video (dikompresi oleh beberapa jenis codec video) dan aliran audio (dikompresi oleh beberapa jenis codec audio). Serta data tambahan, seperti subtitle dan meta-informasi. Wadah populer: MP4, MOV, WebM.

Ketika kita melihat ekstensi file .mp4 , kita hanya bisa mengatakan bahwa wadah MP4 digunakan. Tetapi codec di dalamnya mungkin berbeda - penulis dapat mengambil H.264 dan AAC, AV1 dan Opus, atau yang lainnya.

Lihatlah AV1


AV1 adalah video codec yang dirilis setahun yang lalu, pada bulan Maret 2018. Itu dibuat untuk melampaui codec dari generasi sebelumnya - HEVC, VP9, ​​H.264 dan VP8.

Grafik generasi codec video
Diagram codec generasi dari Tsahi Levent-Levy

Jika Anda tertarik pada bagaimana tepatnya AV1 berhasil melampaui codec lainnya dalam kompresi, baca detail teknis dalam terjemahan di Habré:
Video Generasi Selanjutnya: Memperkenalkan AV1
AV1 Next Generation Codec: Filter Directional Koreksi CDEF

Karena optimasi baru, AV1 memampatkan video 30-50% lebih baik daripada H.264 atau VP8, dan hingga 30% lebih baik daripada HEVC. Tetapi codec dirilis baru-baru ini dan sejauh ini memiliki beberapa penyakit anak-anak:

  • Encoder saat ini tidak dioptimalkan. AV1 memampatkan video dengan sangat lambat ( encoder cepat baru pada Rust sudah dalam pengembangan). Codec tidak cocok untuk streaming. Jika kita berbicara tentang video statis di pendaratan - masalah ini tidak relevan bagi kami.
  • Sejauh ini, codec hanya didukung di desktop Chrome dan Firefox di Windows. Belum ada dukungan untuk Safari dan Edge (meskipun Microsoft sudah mengujinya ). Anda memerlukan setidaknya 2 file: AV1 untuk Chrome dan Firefox dan H.264 untuk browser lain.

Hal paling keren tentang AV1 adalah bahwa kotak " jackalisasi " tidak muncul pada bit rate yang rendah.

Perbandingan kualitas gambar untuk codec yang berbeda pada bitrate yang berbeda
Membandingkan kualitas gambar untuk codec yang berbeda pada bitrate yang berbeda - AV1 menang

Memasak AV1 dengan benar


Akhirnya mari kita mulai berlatih. Pertama, mari kita putuskan wadahnya. Secara teori, AV1 dapat ditempatkan di wadah yang berbeda, tetapi MP4 lebih kompak dan direkomendasikan dalam spesifikasi. Untuk suara dalam AV1 kami mengambil Opus, karena itu kompres suara dengan sempurna .

Agar video berfungsi di semua browser, kami akan menghasilkan 3 file:

  1. Untuk desktop Chrome dan Firefox di Windows ( 31% pasar pada Maret 2019): Wadah MP4 dengan AV1 untuk video dan Opus untuk suara.
  2. Untuk Safari dan Edge ( 16% pasar ) - MP4 dengan HEVC dan AAC.
  3. Selebihnya: file MP4 besar dengan H.264 dan AAC.

Anda hanya dapat mengambil AV1 dan H.264 - video juga akan berfungsi untuk semua orang.

Untuk kompresi, saya sarankan mengambil konsol FFmpeg . Ada banyak utilitas grafis, tetapi lebih mudah untuk menyimpan opsi di konsol dan kemudian memulai konversi secara otomatis. Pastikan untuk menggunakan FFmpeg versi terbaru. Versi sebelum 4.1 tidak mendukung AV1 dalam MP4.

Untuk Mac OS X:

  1. Instal Homebrew .
  2. brew install ffmpeg

Untuk Linux, lebih baik mengambil versi baru dari situs resmi - sementara di banyak distribusi tidak ada versi dengan dukungan untuk AV1 dalam MP4:

  1. wget https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-amd64-static.tar.xz
  2. tar -xf ffmpeg-release-amd64-static.tar.xz
  3. sudo cp ffmpeg-4.1-64bit-static/ff* /usr/local/bin/

Untuk Windows, Anda dapat menginstal FFmpeg oleh William Diaz .

Kami beralih ke konversi file H.264, yang kami perlukan untuk browser lama. Karena semua file kami menggunakan wadah MP4, saya akan menggunakan .av1.mp4 , .hevc.mp4 dan .h264.mp4 . Jangan khawatir dengan tim panjang, kami kemudian akan menganalisis semuanya:

 #  SOURCE.mov     - ffmpeg -i SOURCE.mov -map_metadata -1 -c:a libfdk_aac -c:v libx264 -crf 24 -preset veryslow -profile:v main -pix_fmt yuv420p -movflags +faststart -vf "scale=trunc(iw/2)*2:trunc(ih/2)*2" video.h264.mp4 

Sekarang buka video.h264.mp4 . Jika kualitasnya bagus dan ukurannya besar, coba -crf ( -crf 26 lalu -crf 28 ). Opsi ini akan mengurangi ukuran file dengan mengorbankan kualitas yang lebih rendah. Menyeimbangkan kualitas dan ukuran adalah seni.

Jika tidak ada file video asli, maka Anda dapat mengkonversi file H.264 lama ke AV1.

Sekarang saatnya untuk mengonversi AV1 - Saya ingatkan Anda, ini akan lebih panjang dari H.264. Codec belum menggunakan kekuatan penuh dari prosesor (masuk akal untuk mulai mengkonversi beberapa file secara paralel).

 ffmpeg -i SOURCE.mov -map_metadata -1 -c:a libopus -c:v libaom-av1 -crf 34 -b:v 0 -pix_fmt yuv420p -movflags +faststart -vf "scale=trunc(iw/2)*2:trunc(ih/2)*2" -strict experimental video.av1.mp4 

-crf dengan -crf lagi untuk -crf keseimbangan kualitas dan ukuran yang sempurna.

Sekarang sama untuk HEVC.

 ffmpeg -i SOURCE.mov -map_metadata -1 -c:a libfdk_aac -c:v libx265 -crf 24 -preset veryslow -pix_fmt yuv420p -movflags +faststart -vf "scale=trunc(iw/2)*2:trunc(ih/2)*2" video.hevc.mp4 

Salin video.h264.mp4 , video.hevc.mp4 dan video.av1.mp4 ke root situs Anda.

Memahami Opsi FFmpeg


Apakah perintah di atas terlihat seperti mantra pemanggil setan? Jangan khawatir, ini bukan PostCSS . Mari kita lihat opsinya.

-i SOURCE.mov menunjukkan file input, dari mana FFmpeg akan mengambil stream video dan audio, kompres mereka dan kemas dalam wadah baru.

-map_metadata -1 akan menghapus informasi meta dari video (misalnya, program di mana video dibuat). Informasi seperti itu jarang berguna di Web.

-c:a libopus atau -c:a libfdk_aac mengatur codec audio. Jika Anda tidak membutuhkan suara, gantilah dengan -an .

-c:v libaom-av1 memilih codec video - perpustakaan yang akan memampatkan bingkai aliran video.

-crf 34 - Faktor Tingkat Konstan, keseimbangan kualitas dan ukuran. Ini seperti slider kualitas JPEG, hanya saja bergerak ke arah yang berbeda (0 adalah kualitas terbaik dan file terbesar). Skala CRF berbeda untuk H.264 dan AV1 - untuk H.264 naik menjadi 51, untuk AV1 naik menjadi 61. CRF untuk AV1 dan H.264 akan berbeda.

Facebook menemukan perkiraan korespondensi antara nilai CRF untuk H.264 dan AV1:
19 → 27, 23 → 33, 27 → 39, 31 → 45, 35 → 51, 39 → 57.

-preset veryslow memaksa codec H.264 dan HEVC untuk mengompres file lebih banyak dengan biaya peningkatan waktu konversi yang tajam.

-profile:v main digunakan oleh H.264 untuk memilih profil codec . Hanya "Utama" yang akan berfungsi di Safari.

-b:v 0 menetapkan bitrate minimum untuk AV1 sehingga video memiliki kualitas yang konsisten.

-pix_fmt yuv420p (format piksel) adalah cara yang sulit untuk mengurangi ukuran file. Ini meninggalkan resolusi asli untuk kecerahan, tetapi mengurangi resolusi untuk warna. Mata kita melihat warna lebih buruk, oleh karena itu mereka tidak memperhatikan trik ini. Hapus opsi ini jika dalam kasus Anda itu akan mengganggu.

-movflags +faststart memindahkan semua yang penting ke awal file sehingga browser dapat memutar video hingga unduhan selesai.

-vf "scale=trunc(iw/2)*2:trunc(ih/2)*2" akan mengubah ukuran sisi video menjadi yang genap terdekat (beberapa codec dapat bekerja dengan resolusi 300 × 200 dan 302 × 200, tetapi tidak akan berfungsi dengan 301 × 200). Jika Anda yakin di mana-mana resolusi dibagi 2 - Anda dapat menghapus opsi ini.

-strict experimental diperlukan untuk AV1, encoder-nya masih eksperimental.

video.av1.mp4 menetapkan nama file yang dihasilkan.

Kami meluncurkan video di browser


Sekarang kita membutuhkan setiap browser untuk mengunduh video yang didukungnya. Untuk ini, <source> memiliki atribut type . Dan saya menyarankan Anda untuk membaca tentang opsi di <video> .

 <video controls width="600" height="400"> <source src="video.hevc.mp4" type="video/mp4; codecs=hevc,mp4a.40.2" /> <source src="video.av1.mp4" type="video/mp4; codecs=av01.0.05M.08,opus" /> <source src="video.h264.mp4" type="video/mp4; codecs=avc1.4D401E,mp4a.40.2" /> </video> 

<source> seperti if…else ekspresi if…else - browser membacanya dari atas ke bawah hingga menemukan yang type didukungnya.

Dalam type Anda dapat menentukan seluruh format file: wadah ( video/mp4 untuk MP4), codec video ( av01.0.05M.08 untuk AV1, hevc untuk HEVC dan avc1.4D401E untuk H.264) dan codec audio ( opus untuk Opus dan mp4a.40.2 untuk AAC).

Bonus: cara mengonversi GIF ke AV1 dan H.264


Pada 2019, menggunakan GIF untuk video pendek adalah dosa besar. Berat GIF 20-40 kali lebih banyak daripada H.264 atau AV1. GIF lebih keras mengenai CPU dan membuat baterai bocor lebih cepat. Jika Anda membutuhkan video loop pendek, ambil codec video. Dan FFmpeg dapat mengkonversi video langsung dari GIF.

Konversi GIF ke H.264:

 ffmpeg -i IMAGE.gif -map_metadata -1 -an -c:v libx264 -crf 24 -preset veryslow -profile:v main -pix_fmt yuv420p -movflags +faststart -vf "scale=trunc(iw/2)*2:trunc(ih/2)*2" video.h264.mp4 

Hasilkan AV1 yang lebih kecil:

 ffmpeg -i IMAGE.gif -map_metadata -1 -an opus -c:v libaom-av1 -crf 50 -b:v 0 -pix_fmt yuv420p -movflags +faststart -vf "scale=trunc(iw/2)*2:trunc(ih/2)*2" -strict experimental video.av1.mp4 

Sekarang masukkan animation.h264.mp4 dan animation.av1.mp4 ke dalam HTML.

 <video autoplay loop muted playsinline width="300" height="200"> <source src="animation.av1.mp4" type="video/mp4; codecs=av01.0.05M.08" /> <source src="animation.h264.mp4" type="video/mp4" /> </video> 

Opsi autoplay dan loop menjadikan video sebagai "GIF" - video loop yang segera diputar setelah halaman dimuat. playsinline memblokir Safari dari membuka video di layar penuh ketika Anda mengklik video.

Waktu penarikan


AV1 masih eksperimental. Tapi itu sudah bisa digunakan untuk membuat seperempat dari pengguna Anda lebih bahagia. Sepasang perintah FFmpeg akan menghasilkan file video. <video> dibuat sejak awal untuk membuat video sesuai dengan kemampuan browser. Kami sudah menggunakan AV1 dalam produksi dan semuanya bekerja dengan baik (kecuali untuk waktu tunggu sampai AV1 encoder selesai bekerja).

Source: https://habr.com/ru/post/id442020/


All Articles