שימוש ב-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
1,120 על 840 בפורמט AVIF, בגודל 18,769 בייטים (לחצו כדי להגדיל)
התמונה בפורמט JPEG
1,120 על 840 בפורמט JPEG, בגודל 20,036 בייטים (לחצו כדי להגדיל)

בנוסף, ב-AVIF נוסף קודק ותמיכה בקונטיינרים בתכונות תמונה חדשות כמו High Dynamic Range (טווח דינמי רחב וטווח צבעים רחב), סינתזת גרעיניות סרט ופענוח הדרגתי.

מה חדש

מאז שהוסיפה תמיכה ב-AVIF בגרסה M85 של Chrome, התמיכה ב-AVIF בסביבת הקוד הפתוח השתפרה בכמה מישורים.

Libaom

Libaom הוא מקודד ומפענח AV1 בקוד פתוח שמנוהל על ידי החברות ב-Alliance for Open Media, ומשומש בשירותי ייצור רבים ב-Google ובחברות אחרות שהצטרפו לארגון. בין הגרסה 2.0.0 של libaom – בערך באותו זמן שנוספה ל-Chrome תמיכה ב-AVIF – לבין הגרסה 3.1.0 האחרונה, נוספו לבסיס הקוד אופטימיזציות משמעותיות לקידוד תמונות סטילס. למשל:

  • אופטימיזציות למספר רב של שרשורים ולקידוד בחלוקה לריבועים.
  • הפחתה של פי 5 בשימוש בזיכרון.
  • הפחתה של פי 6.5 בשימוש במעבד, כפי שמוצג בתרשים הבא.
שימוש ב-speed=6, ‏ cq-level=18, לתמונות של 8.1MP

השינויים האלה מפחיתים משמעותית את עלות הקידוד של ה-AVIF – במיוחד התמונות שנטענו בתדירות הגבוהה ביותר או עם העדיפות הגבוהה ביותר באתר. ככל שקידוד בהאצת חומרה של AV1 יהיה זמין יותר בשרתים ובשירותי ענן, העלות של יצירת תמונות AVIF תמשיך לרדת.

Libavif

Libavif, שהיא הטמעה של AVIF, היא מקודד ומנתח AVIF בקוד פתוח שמשמש ב-Chrome לפענוח תמונות AVIF. אפשר גם להשתמש בו עם libaom כדי ליצור תמונות AVIF מתמונות קיימות ללא דחיסה, או כדי לבצע המרה מתמונות אינטרנט קיימות (JPEG,‏ PNG וכו').

לאחרונה נוספה ל-Libavif תמיכה במגוון רחב יותר של הגדרות מקודד, כולל שילוב עם הגדרות מקודד מתקדמות יותר של libaom. אופטימיזציות בצינור עיבוד הנתונים, כמו המרה מהירה של YUV ל-RGB באמצעות libyuv ותמיכה ב-alpha מוכפלת, מאפשרות להאיץ עוד יותר את תהליך הפענוח. לבסוף, התמיכה במצב קידוד intra בלבד שנוספה לגרסה 3.1.0 של libaom כוללת את כל השיפורים ב-libaom שצוינו למעלה.

קידוד תמונות AVIF באמצעות avifenc

דרך מהירה להתנסות ב-AVIF היא Squoosh.app. ‏Squoosh מפעילה גרסה של libavif ל-WebAssembly, ומציגה הרבה מהתכונות של הכלים לשורת הפקודה. זו דרך קלה להשוות בין AVIF לפורמטים אחרים, ישנים וחדשים. יש גם גרסת CLI של Squoosh שמתאימה לאפליקציות Node.

עם זאת, ל-WebAssembly עדיין אין גישה לכל הרכיבים הבסיסיים של ביצועי המעבדים, ולכן אם רוצים להריץ את 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

עוברים לספריית יחסי התלות החיצוניים של libavif.

cd ext

הפקודה הבאה תגרור את קוד המקור של libaom ותבנה את libaom באופן סטטי.

./aom.cmd

משנים את הספרייה ל-libavif.

cd ..

4. פיתוח כלי הקידוד בשורת הפקודה, avifenc

מומלץ ליצור ספריית build ל-avifenc.

mkdir build

עוברים לספריית ה-build.

cd build

יוצרים את קובצי ה-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

השלמת את ה-build של avifenc!

הסבר על הפרמטרים של שורת הפקודה של avifenc

avifenc משתמש במבנה של שורת הפקודה:

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

הפרמטרים הבסיסיים של avifenc שנעשה בהם שימוש במדריך הזה הם:

avifenc
--מינימום 0מגדירים את המכפיל המינימלי לקידוד הצבע כ-0
--עד 63הגדרת הכמות המקסימלית של צבע כ-63
‎--minalpha 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מגדירים את רמת ה-quantize של אלפא כ-Q
‎-a tune=ssimכוונון ל-SSIM (ברירת המחדל היא כוונון ל-PSNR)
--jobs Jשימוש ב-J worker threads (ברירת המחדל: 1)
--speed Sמגדירים את מהירות המקודד מ-0 עד 10 (הכי איטי עד הכי מהיר. ברירת המחדל: 6)

האפשרות cq-level מגדירה את רמת הקידוד (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 בערך.

ההשפעה על המדד 'המהירות שבה נטען רכיב התוכן הכי גדול' (LCP)

תמונות הן מועמדות נפוצות למדד 'המהירות שבה נטען רכיב התוכן הכי גדול' (LCP). אחת מהמלצות הנפוצות לשיפור מהירות הטעינה של תמונות LCP היא לוודא שהתמונה אופטימיזציה. כשמקטינים את גודל ההעברה של משאב, משפרים את זמן הטעינה של המשאב. זהו אחד מארבעת השלבים העיקריים שצריך לטרגט כשמדובר בתמונות שיכולות להיות רכיבי LCP.

מומלץ מאוד להשתמש ב-CDN לתמונות כשמבצעים אופטימיזציה של תמונות, כי זה דורש הרבה פחות מאמץ מאשר להגדיר צינורות עיבוד נתונים לאופטימיזציה של תמונות בתהליך ה-build של האתר או להשתמש באופן ידני בקבצים הבינאריים של המקודד כדי לבצע אופטימיזציה של תמונות באופן ידני. עם זאת, רשתות CDN של תמונות עשויות להיות אסורות בעלות בפרויקטים מסוימים. אם זה המצב שלכם, מומלץ להביא בחשבון את הדברים הבאים כשמבצעים אופטימיזציה באמצעות המקודד avifenc:

  • כדאי להכיר את האפשרויות שהקודק מציע. תוכלו לחסוך עוד יותר ועדיין לשמור על איכות תמונה מספקת על ידי ניסוי עם חלק מתכונות הקידוד הזמינות של AVIF.
  • AVIF מספק קידוד עם איבוד נתונים (lossy) וגם קידוד ללא אובדן מידע. בהתאם לתוכן התמונה, סוג קידוד אחד עשוי להניב ביצועים טובים יותר מסוג אחר. לדוגמה, תמונות שמוצגות בדרך כלל כקובצי JPEG יהיו כנראה הכי טובות עם קידוד עם אובדן נתונים, ואילו קידוד ללא אובדן נתונים יתאים יותר לתמונות שמכילות פרטים פשוטים או גרפיקה לינארית שמוצגות בדרך כלל כקובצי PNG.
  • אם אתם משתמשים ב-Bundler עם תמיכה מהקהילה בשביל imagemin, כדאי להשתמש בחבילת imagemin-avif כדי לאפשר ל-bundler להפיק וריאציות של תמונה בפורמט AVIF.

התנסות ב-AVIF עשויה לשפר את זמני ה-LCP באתר במקרים שבהם התמונה היא רכיב ה-LCP. במדריך הזה מוסבר איך לבצע אופטימיזציה של LCP.

סיכום

באמצעות libaom, ‏ libavif וכלים אחרים בקוד פתוח, תוכלו להשיג את איכות התמונה והביצועים הטובים ביותר באתר שלכם באמצעות AVIF. הפורמט עדיין חדש יחסית, ואנחנו מפתחים אופטימיזציות ושילובים של כלים. אם יש לכם שאלות, תגובות או בקשות להוספת תכונות, תוכלו ליצור קשר ברשימת התפוצה av1-Compliance, בקהילת AOM GitHub וב-AVIF wiki.