การใช้ AVIF เพื่อบีบอัดรูปภาพบนเว็บไซต์ของคุณ

Jai Krishnan
Jai Krishnan
Wan-Teh Chang
Wan-Teh Chang

เราเขียนข้อมูลเกี่ยวกับการขยายตัวของเว็บไซต์จากรูปภาพอยู่บ่อยครั้ง และเครื่องมืออย่าง Lighthouse จะไฮไลต์เมื่อการโหลดรูปภาพส่งผลกระทบด้านลบต่อประสบการณ์ของผู้ใช้ เช่น เพิ่มความเร็วในการโหลด หรือการลดแบนด์วิดท์ลงจากทรัพยากรที่สำคัญกว่า วิธีหนึ่งที่จะแก้ปัญหานี้ได้คือการใช้การบีบอัดสมัยใหม่เพื่อลดขนาดไฟล์ของรูปภาพ และตัวเลือกใหม่สำหรับนักพัฒนาเว็บคือรูปแบบรูปภาพ AVIF บล็อกโพสต์นี้กล่าวถึงการอัปเดตล่าสุดเกี่ยวกับเครื่องมือโอเพนซอร์สสำหรับ AVIF, แนะนำไลบรารีการเข้ารหัส libaom และ libavif รวมถึงบทแนะนำการใช้ไลบรารีเหล่านี้เพื่อเข้ารหัสรูปภาพ AVIF อย่างมีประสิทธิภาพ

AVIF คือรูปแบบรูปภาพที่อิงตามตัวแปลงรหัสวิดีโอ AV1 และเป็นมาตรฐานโดย Alliance for Open Media AVIF บีบอัดได้มากกว่ารูปแบบรูปภาพอื่นๆ อย่างมาก เช่น JPEG และ WebP แม้ว่าการประหยัดที่แน่นอนจะขึ้นอยู่กับเนื้อหา การตั้งค่าการเข้ารหัส และเป้าหมายคุณภาพ แต่เราและผู้อื่นพบว่าการประหยัดค่าใช้จ่ายได้มากกว่า 50% เมื่อเทียบกับ JPEG

อิมเมจที่ใช้ AVIF
AVIF ขนาด 1120 x 840 ที่ 18,769 ไบต์ (คลิกเพื่อขยาย)
รูปภาพที่ใช้ JPEG
1120 x 840 JPEG ที่ 20,036 ไบต์ (คลิกเพื่อขยาย)

นอกจากนี้ AVIF ยังเพิ่มการรองรับตัวแปลงรหัสและคอนเทนเนอร์สำหรับฟีเจอร์อิมเมจใหม่ เช่น High Dynamic Range และ Wide Color Gamut, การสังเคราะห์เนื้อฟิล์ม และการถอดรหัสแบบโพรเกรสซีฟ

มีอะไรใหม่

นับตั้งแต่นำการรองรับ AVIF มาใช้ใน Chrome M85 การรองรับ AVIF ในระบบนิเวศโอเพนซอร์สก็ได้รับการปรับปรุงให้ดีขึ้นในหลายๆ ด้าน

ลิบอม

Libaom เป็นโปรแกรมเปลี่ยนไฟล์และตัวถอดรหัส AV1 แบบโอเพนซอร์สที่ดูแลโดยบริษัทใน Alliance for Open Media และใช้ในบริการผลิตวิดีโอมากมายที่ Google และบริษัทสมาชิกอื่นๆ ระหว่างรุ่น libaom 2.0.0 และในช่วงเวลาเดียวกับที่ Chrome เพิ่มการรองรับ AVIF และรุ่นล่าสุด 3.1.0 ก็ได้มีการเพิ่มประสิทธิภาพการเข้ารหัสภาพนิ่งที่สำคัญในฐานของโค้ด ซึ่งรวมถึงการใช้งานดังต่อไปนี้

  • การเพิ่มประสิทธิภาพสำหรับชุดข้อความแบบหลายรายการและการเข้ารหัสแบบเรียงต่อกัน
  • ลดการใช้งานหน่วยความจำได้ถึง 5 เท่า
  • ลดการใช้ CPU ลง 6.5 เท่าดังที่แสดงในแผนภูมิด้านล่าง
การใช้ความเร็ว=6, cq-level=18 สำหรับรูปภาพความละเอียด 8.1 ล้านพิกเซล

การเปลี่ยนแปลงเหล่านี้ช่วยลดค่าใช้จ่ายในการเข้ารหัส AVIF ได้อย่างมาก โดยเฉพาะรูปภาพที่โหลดบ่อยที่สุดหรือรูปภาพที่มีลำดับความสำคัญสูงสุดในเว็บไซต์ เนื่องจากการเข้ารหัสแบบเร่งด้วยฮาร์ดแวร์ของ AV1 พร้อมให้ใช้งานในเซิร์ฟเวอร์และบริการระบบคลาวด์มากขึ้น ค่าใช้จ่ายในการสร้างรูปภาพ AVIF ก็จะลดลงอย่างต่อเนื่อง

ลิบาวิฟ

Libavif ซึ่งเป็นการใช้อ้างอิงของ AVIF เป็น Muxer และโปรแกรมแยกวิเคราะห์ AVIF แบบโอเพนซอร์สซึ่งใช้ใน Chrome เพื่อถอดรหัสรูปภาพ AVIF นอกจากนี้ยังใช้ร่วมกับ libaom เพื่อสร้างรูปภาพ AVIF จากรูปภาพที่มีอยู่ที่ไม่ได้บีบอัด หรือแปลงจากรูปภาพบนเว็บที่มีอยู่ (JPEG, PNG ฯลฯ) ได้ด้วย

เมื่อเร็วๆ นี้ Libavif ได้เพิ่มการรองรับการตั้งค่าโปรแกรมเปลี่ยนไฟล์ที่หลากหลายมากขึ้น รวมถึงการผสานรวมกับการตั้งค่าโปรแกรมเปลี่ยนไฟล์ libaom ขั้นสูงขึ้นด้วย การเพิ่มประสิทธิภาพในไปป์ไลน์การประมวลผล เช่น การแปลง YUV เป็น RGB ที่รวดเร็วโดยใช้ libyuv และการรองรับอัลฟ่าแบบทวีคูณทำให้กระบวนการถอดรหัสเร็วขึ้นไปอีก และสุดท้าย การรองรับโหมดการเข้ารหัสแบบ All-intra ที่เพิ่มเข้ามาใหม่ใน libaom 3.1.0 จะนำไปสู่การปรับปรุง libaom ทั้งหมดที่กล่าวถึงข้างต้น

การเข้ารหัสรูปภาพ AVIF ด้วย avifenc

วิธีที่รวดเร็วในการทดลองกับ AVIF คือ Squoosh.app โดยSquoosh เรียกใช้ libavif เวอร์ชัน WebAssembly และจะแสดงฟีเจอร์มากมายที่เหมือนกันกับเครื่องมือบรรทัดคำสั่ง ซึ่งช่วยให้เปรียบเทียบ AVIF กับรูปแบบอื่นๆ ทั้งเก่าและใหม่ได้อย่างง่ายดาย นอกจากนี้ยังมี Squoosh ที่มีเวอร์ชัน CLI สำหรับใช้กับแอป Node ด้วย

อย่างไรก็ตาม WebAssembly ยังไม่มีสิทธิ์เข้าถึงประสิทธิภาพดั้งเดิมทั้งหมดของ CPU ดังนั้นหากต้องการเรียกใช้ libavif โดยเร็วที่สุด เราขอแนะนำให้ใช้โปรแกรมเปลี่ยนไฟล์แบบบรรทัดคำสั่ง avifenc

หากต้องการทำความเข้าใจวิธีเข้ารหัสรูปภาพ AVIF เราจะแสดงบทแนะนำโดยใช้รูปภาพต้นฉบับเดียวกันที่ใช้ในตัวอย่างข้างต้น ในการเริ่มใช้งาน คุณต้องมีสิ่งต่อไปนี้

นอกจากนี้ คุณจะต้องติดตั้งแพ็กเกจการพัฒนาสำหรับ zlib, libpng และ libjpeg ด้วย คำสั่งสำหรับ Debian และ Ubuntu Linux มีดังนี้:

sudo apt-get install zlib1g-dev
sudo apt-get install libpng-dev
sudo apt-get install libjpeg-dev

โปรแกรมเปลี่ยนไฟล์ avifenc ของการสร้างบรรทัดคำสั่ง

1. รับโค้ด

ดูแท็กการเผยแพร่ของ libavif

git clone -b v0.9.1 https://github.com/AOMediaCodec/libavif.git

2. เปลี่ยนไดเรกทอรีเป็น libavif

cd libavif

คุณกำหนดค่า avifenc และ libavif เพื่อสร้างบิลด์ได้หลายวิธี ดูข้อมูลเพิ่มเติมได้ที่ libavif เราจะสร้าง avifenc ให้ลิงก์แบบคงที่กับไลบรารีโปรแกรมเปลี่ยนไฟล์และตัวถอดรหัส AV1 ซึ่งก็คือ libaom

3. รับและสร้าง Libaom

เปลี่ยนเป็นไดเรกทอรีทรัพยากร Dependency ภายนอกของ libavif

cd ext

คำสั่งถัดไปจะดึงซอร์สโค้ด libaom และสร้าง libaom แบบคงที่

./aom.cmd

เปลี่ยนไดเรกทอรีเป็น libavif

cd ..

4. สร้างเครื่องมือการเข้ารหัสบรรทัดคำสั่ง, avifenc

การสร้างไดเรกทอรีบิลด์สำหรับ avifenc เป็นความคิดที่ดี

mkdir build

เปลี่ยนเป็นไดเรกทอรีบิลด์

cd build

สร้างไฟล์บิลด์สำหรับ avifenc

cmake -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=0 -DAVIF_CODEC_AOM=1 -DAVIF_LOCAL_AOM=1 -DAVIF_BUILD_APPS=1 ..

สร้าง avifenc

make

คุณสร้าง avifenc สำเร็จแล้ว!

การทำความเข้าใจพารามิเตอร์บรรทัดคำสั่ง avifenc

avifenc ใช้โครงสร้างบรรทัดคำสั่ง:

./avifenc [options] input.file output.avif

พารามิเตอร์พื้นฐานสำหรับ avifenc ที่ใช้ในบทแนะนำนี้มีดังนี้

Avifnc
--ต่ำสุด 0ตั้งค่าควอนเซอร์ขั้นต่ำสำหรับสีเป็น 0
--สูงสุด 63 อักขระตั้งค่าควอนเซอร์สูงสุดสำหรับสีเป็น 63
--ขั้นต่ำ 0ตั้งค่าควอนเซอร์ขั้นต่ำสำหรับอัลฟ่าเป็น 0
--maxalpha 63ตั้งค่าควอนเซอร์สูงสุดสำหรับอัลฟ่าเป็น 63
-a end-usage=qตั้งค่าโหมดควบคุมอัตราเป็นโหมดคุณภาพคงที่ (Q)
-a cq-level=Qตั้งค่าระดับปริมาณสำหรับทั้งสีและอัลฟ่าเป็น Q
-a color:cq-level=Qตั้งค่าระดับปริมาณสำหรับสีเป็น Q
-a alpha:cq-level=Qกำหนดระดับปริมาณสำหรับอัลฟ่าเป็น Q
-a tune=ssimปรับสำหรับ SSIM (ค่าเริ่มต้นคือ ปรับสำหรับ PSNR)
--งาน จใช้ชุดข้อความของผู้ปฏิบัติงาน J (ค่าเริ่มต้น: 1)
--ความเร็ว Sตั้งความเร็วโปรแกรมเปลี่ยนไฟล์จาก 0-10 (เร็วที่สุด ค่าเริ่มต้นเป็น 6)

ตัวเลือกระดับ cQ จะกำหนดระดับปริมาณ (0-63) เพื่อควบคุมคุณภาพของสีหรืออัลฟ่า

สร้างอิมเมจ AVIF ด้วยการตั้งค่าเริ่มต้น

พารามิเตอร์พื้นฐานที่สุดที่ avifenc ทำงานคือการตั้งค่าไฟล์อินพุตและเอาต์พุต

./avifenc happy_dog.jpg happy_dog.avif

ขอแนะนำให้ใช้บรรทัดคำสั่งต่อไปนี้เพื่อเข้ารหัสรูปภาพ เช่น เมื่อวัดระดับ 18

./avifenc --min 0 --max 63 -a end-usage=q -a cq-level=18 -a tune=ssim happy_dog.jpg happy_dog.avif

Avifenc มีตัวเลือกมากมายที่จะส่งผลต่อทั้งคุณภาพและความเร็ว หากต้องการดูตัวเลือกต่างๆ และดูข้อมูลเพิ่มเติมเกี่ยวกับตัวเลือกเหล่านี้ ให้เรียกใช้ ./avifenc

ตอนนี้คุณมีอิมเมจ AVIF ของตัวเองแล้ว

กำลังเร่งโปรแกรมเปลี่ยนไฟล์

พารามิเตอร์หนึ่งที่อาจเปลี่ยนแปลงได้ดีโดยขึ้นอยู่กับจำนวนแกนที่คุณมีในเครื่องคือพารามิเตอร์ --jobs พารามิเตอร์นี้กำหนดจำนวนเทรด avifenc ที่จะใช้ในการสร้างรูปภาพ AVIF โปรดลองเรียกใช้โค้ดนี้ที่บรรทัดคำสั่ง

./avifenc --min 0 --max 63 -a end-usage=q -a cq-level=18 -a tune=ssim --jobs 8 happy_dog.jpg happy_dog.avif

วิธีนี้จะทำให้ avifenc ใช้เทรด 8 แบบเมื่อสร้างอิมเมจ AVIF ซึ่งช่วยเพิ่มความเร็วการเข้ารหัส AVIF ได้ประมาณ 5 เท่า

ผลต่อ Largest Contentful Paint (LCP)

รูปภาพเป็นตัวเลือกที่พบบ่อยสำหรับเมตริก Largest Contentful Paint (LCP) คําแนะนําทั่วไปอย่างหนึ่งสําหรับการปรับปรุงความเร็วในการโหลดของรูปภาพ LCP คือให้ตรวจสอบว่ารูปภาพได้รับการเพิ่มประสิทธิภาพ การลดขนาดการโอนทรัพยากรจะเป็นการปรับปรุงเวลาที่ใช้ในการโหลดทรัพยากร ซึ่งเป็น1 ใน 4 ระยะสำคัญในการกำหนดเป้าหมายเมื่อจัดการกับตัวเลือก LCP ที่เป็นรูปภาพ

เราขอแนะนำอย่างยิ่งให้ใช้ CDN รูปภาพเมื่อเพิ่มประสิทธิภาพรูปภาพ เนื่องจากใช้ความพยายามน้อยกว่าการตั้งค่าไปป์ไลน์การเพิ่มประสิทธิภาพรูปภาพในกระบวนการสร้างของเว็บไซต์ หรือการใช้ไบนารีของโปรแกรมเปลี่ยนไฟล์เพื่อเพิ่มประสิทธิภาพรูปภาพด้วยตนเอง อย่างไรก็ตาม CDN รูปภาพอาจไม่เสียค่าใช้จ่ายสำหรับบางโปรเจ็กต์ ในกรณีเช่นนี้ โปรดพิจารณาสิ่งต่อไปนี้เมื่อเพิ่มประสิทธิภาพด้วยโปรแกรมเปลี่ยนไฟล์ avifenc

  • ทำความคุ้นเคยกับตัวเลือกที่มีให้ในโปรแกรมเปลี่ยนไฟล์ คุณอาจประหยัดค่าใช้จ่ายเพิ่มเติมในขณะที่ยังคงรักษาคุณภาพของรูปได้เพียงพอด้วยการทดลองใช้ฟีเจอร์การเข้ารหัสบางอย่างที่มีอยู่ของ AVIF
  • AVIF มีทั้งการเข้ารหัสแบบสูญเสียบางส่วนและไม่สูญเสียข้อมูล การเข้ารหัสประเภทหนึ่งอาจทำงานได้ดีกว่าอีกประเภทหนึ่ง โดยขึ้นอยู่กับเนื้อหาของรูปภาพ ตัวอย่างเช่น รูปภาพที่ปกติแสดงเป็น JPEG น่าจะทำงานได้ดีที่สุดในการเข้ารหัสแบบสูญเสียบางส่วน ส่วนการเข้ารหัสแบบไม่สูญเสียรายละเอียดจะเหมาะกับรูปภาพที่มีรายละเอียดง่ายๆ หรือลายเส้นที่ปกติแสดงเป็น PNG
  • หากใช้ Bundler ที่มีการสนับสนุนชุมชนสำหรับ imagemin ให้พิจารณาใช้แพ็กเกจ imagemin-avif เพื่อเปิดใช้ Bundler ของคุณแสดงรูปแบบอิมเมจ AVIF

การทดสอบกับ AVIF อาจทำให้คุณสังเกตเห็นการปรับปรุงเวลา LCP ของเว็บไซต์ในกรณีที่ตัวเลือก LCP เป็นรูปภาพ ดูข้อมูลเพิ่มเติมเกี่ยวกับการเพิ่มประสิทธิภาพ LCP ได้จากคำแนะนำในการเพิ่มประสิทธิภาพ LCP

บทสรุป

เมื่อใช้ libaom, libavif และเครื่องมือโอเพนซอร์สอื่นๆ คุณจะได้รับคุณภาพและประสิทธิภาพของรูปภาพที่ดีที่สุดสำหรับเว็บไซต์โดยใช้ AVIF รูปแบบนี้ยังค่อนข้างใหม่ และการเพิ่มประสิทธิภาพและการผสานรวมเครื่องมือก็กำลังได้รับการพัฒนาอย่างต่อเนื่อง หากมีข้อสงสัย ความคิดเห็น หรือคำขอฟีเจอร์ โปรดติดต่อรายชื่ออีเมล av1-discuss, ชุมชน AOM GitHub และ AVIF wiki