是时候让 AVIF 无处不在了吗?
Isn't It Time for AVIF Everywhere?

原始链接: https://www.michaelponders.com/2026/11/isnt-it-time-for-avif-everywhere.html

随着存储硬件和托管成本上升,作者认为互联网应采用更高效的媒体格式——尤其是用于图像的AVIF和用于视频的AV1/AV2——以减少存储和带宽使用。AVIF通常比WebP压缩更好,同时保持相近的图像质量,但编码CPU密集,因此用户可在上传前转换图像。Mastodon、Bluesky、网络托管商和手机制造商等平台应支持AVIF(以及HEIC),而不是强制定期转换。即使硬件短缺最终缓解,更好的格式支持也有助于长期更高效地利用资源。

Hacker News 上一篇题为“Isn’t It Time for AVIF Everywhere?”(18 点,9 条评论)的帖子引发了关于网页图片格式的辩论。支持者提到 AVIF 在摄影作品集中的质量与速度;批评者指出其与 WebP 等格式存在兼容性问题。其他人认为 JPEG XL 因支持无损 JPEG 转换且限制更少,更适合做通用格式,尽管 AVIF 在有损质量方面可能占优。评论者还说改进的 JPEG 压缩不如视频重要;还有一条离题评论提到了内存行业定价。总体而言,讨论围绕 AVIF 是否应占主导,还是应与其他格式共存。
相关文章

原文
https://www.michaelponders.com/2026/11/isnt-it-time-for-avif-everywhere.html

Isn't It Time for AVIF Everywhere?

Storage devices such as hard disk drives (HDDs), solid-state drives (SSDs), and NVMe drives are reaching increasingly ridiculous prices and becoming more difficult to obtain. With hosting services raising prices throughout 2026 and possibly more increases coming in 2027, I have to ask: why aren't hosting providers doing more to support newer and more efficient formats such as AVIF and WebP for images and AV1 and AV2 for video?

Hetzner, for example, has already raised prices multiple times in 2026, citing rising hardware costs, and other hosting providers have also increased their prices. With the growing demand for hardware driven in part by the AI boom, I don't see these problems disappearing overnight. Even if prices eventually come back down, it could take some time for supplies to return to normal.

I think AVIF would be one of the best choices for image storage, and services such as Mastodon, Bluesky, and web hosting providers should be doing more to support it wherever possible. AVIF generally offers better compression than WebP while maintaining comparable image quality, which means smaller files without sacrificing how an image looks. When you consider how many images are uploaded and stored across the internet every day, even modest savings could add up to something substantial.

I know that encoding AVIF images is more CPU-intensive, but why not encourage people to use their own hardware to convert images before uploading them? That would reduce the processing burden on hosting services, especially if they preserved the original format instead of converting it back into something less efficient. Some processing will still be necessary for thumbnails and compatibility, but surely we can make better use of the formats we already have. I have already switched to AVIF on every platform I use that supports it, and WebP where AVIF isn't supported. Personally, I would rather standardize on AVIF because I don't see much sense in continuing to use larger files when smaller ones can accomplish the same thing.

Even YouTube is preparing to move beyond AV1 and begin streaming video using AV2, potentially as early as 2027. If a company handling the enormous amount of video that YouTube does sees the benefits of a more efficient format, shouldn't the rest of the internet be taking a closer look at what we can do with images and video too?

As an internet community, we need to work collectively to counterbalance these ridiculous hardware shortages and rising prices. Supporting more efficient formats could reduce unnecessary storage and bandwidth consumption, benefiting hosting providers, independent websites, and the people who use them. Switching formats won't solve the hardware shortages, but it could help us make better use of the resources we already have, especially for smaller hosting providers and independent services that don't have the financial resources of larger companies.

Is it really that hard for everyone to come together on something that could benefit all of us? WebP is fine, but AVIF generally offers better compression, so let's work toward supporting it wherever it makes sense. And phone manufacturers, please do your part too. I would love to see AVIF become a more widely supported option for taking and storing photos directly on our phones. While we're improving compatibility, let's also have better native support for Apple's HEIC format, not instead of AVIF, but alongside it. I get so tired of having to convert images back and forth just to use them on different devices, browsers, or websites.

Even if the AI hardware boom eventually goes bust, I still think these improvements would benefit the internet long after the current shortages are over. We should be making better use of what we have, regardless of what happens to hardware prices.

Just my 2 cents.

'; } return; } var likes = []; var reposts = []; var replies = []; mentions.forEach(function(mention) { var type = mention['wm-property']; if (type === 'like-of') { likes.push(mention); } else if (type === 'repost-of') { reposts.push(mention); } else if (type === 'in-reply-to' || type === 'mention-of') { replies.push(mention); } }); // Update counts if (likes.length > 0) { var likesEl = document.getElementById('likes-count'); if (likesEl) { likesEl.style.display = 'block'; likesEl.innerHTML = '' + likes.length + ' Like' + (likes.length !== 1 ? 's' : ''); } } if (reposts.length > 0) { var retweetsEl = document.getElementById('retweets-count'); if (retweetsEl) { retweetsEl.style.display = 'block'; retweetsEl.innerHTML = '' + reposts.length + ' Repost' + (reposts.length !== 1 ? 's' : ''); } } if (replies.length > 0) { var repliesCountEl = document.getElementById('replies-count'); if (repliesCountEl) { repliesCountEl.style.display = 'block'; repliesCountEl.innerHTML = '' + replies.length + ' Repl' + (replies.length !== 1 ? 'ies' : 'y'); } } // Webmention.io reports every reply's in-reply-to as the page it was sent // to, so a reply to another reply arrives looking top-level. Michael's own // reply pages live on this site and name their real parent, so read it. function replyKey(u) { try { var x = new URL(String(u || ''), window.location.href); return x.hostname.toLowerCase().replace(/^www\./, '') + x.pathname.replace(/\/+$/, '') + x.search; } catch (error) { return ''; } } function isOwnReplyPage(u) { try { var x = new URL(String(u || '')); return x.origin === window.location.origin && x.protocol === 'https:' && replyKey(x.href) !== replyKey(window.location.href); } catch (error) { return false; } } // Oldest first, and a reply to another reply sits right under it. function orderReplies(list) { list.sort(function(a, b) { return new Date(a.published || a['wm-received']) - new Date(b.published || b['wm-received']); }); var keys = list.map(function(r) { return replyKey(r.url); }); function parentKey(r) { var own = replyKey(r.url); return [].concat(r.declaredParents || [], r['in-reply-to'] || []).map(replyKey).filter(function(k) { return k && k !== own && keys.indexOf(k) !== -1; })[0]; } var ordered = []; list.forEach(function(r) { if (parentKey(r)) return; ordered.push(r); list.forEach(function(c) { if (parentKey(c) === replyKey(r.url)) { c.isChild = true; ordered.push(c); } }); }); list.forEach(function(r) { if (ordered.indexOf(r) === -1) ordered.push(r); }); return ordered; } function readDeclaredParents(list) { var own = list.filter(function(r) { return isOwnReplyPage(r.url); }).slice(0, 5); return Promise.all(own.map(function(r) { var controller = window.AbortController ? new AbortController() : null; var timer = controller ? setTimeout(function() { controller.abort(); }, 5000) : null; return fetch(r.url, {credentials: 'omit', signal: controller ? controller.signal : undefined}) .then(function(res) { if (!res.ok) throw new Error('reply page ' + res.status); return res.text(); }) .then(function(text) { var doc = new DOMParser().parseFromString(text, 'text/html'); r.declaredParents = Array.prototype.map.call( doc.querySelectorAll('.u-in-reply-to[href]'), function(a) { return a.getAttribute('href'); }); }) .catch(function() {}) .then(function() { if (timer) clearTimeout(timer); }); })); } // Display replies return readDeclaredParents(replies).then(function() { if (replies.length > 0) { var repliesEl = document.getElementById('webmention-replies'); if (repliesEl) { var repliesHTML = ''; replies = orderReplies(replies); // Show each reply with its real formatting (paragraphs, quotes, links), // keeping only safe tags. Titles, signatures and timestamps that some // sites put inside the reply are left out. var KEEP = {P:1, BR:1, BLOCKQUOTE:1, A:1, EM:1, STRONG:1, B:1, I:1, U:1, S:1, DEL:1, Q:1, CITE:1, CODE:1, PRE:1, UL:1, OL:1, LI:1, SUP:1, SUB:1}; var DROP = {SCRIPT:1, STYLE:1, IFRAME:1, OBJECT:1, EMBED:1, FORM:1, INPUT:1, BUTTON:1, TEXTAREA:1, SELECT:1, SVG:1, MATH:1, TEMPLATE:1, NOSCRIPT:1}; function hasClass(n, name) { return (' ' + (n.getAttribute('class') || '') + ' ').indexOf(' ' + name + ' ') !== -1; } function copySafe(from, to) { Array.prototype.forEach.call(from.childNodes, function(n) { if (n.nodeType === 3) { to.appendChild(document.createTextNode(n.nodeValue)); return; } if (n.nodeType !== 1) return; var tag = n.tagName.toUpperCase(); var heading = /^H[1-6]$/.test(tag); if (DROP[tag] || hasClass(n, 'p-author') || hasClass(n, 'dt-published')) return; if (heading && hasClass(n, 'p-name')) return; if (heading) tag = 'P'; if (!KEEP[tag]) { copySafe(n, to); return; } var el = document.createElement(tag); if (tag === 'A') { var href = n.getAttribute('href') || ''; if (!/^https?:\/\//i.test(href)) { copySafe(n, to); return; } el.setAttribute('href', href); el.setAttribute('target', '_blank'); el.setAttribute('rel', 'nofollow ugc noopener noreferrer'); } copySafe(n, el); to.appendChild(el); }); } function cleanReplyHtml(html) { var doc = new DOMParser().parseFromString(String(html), 'text/html'); var box = document.createElement('div'); copySafe(doc.body, box); return box.textContent.trim() ? box.innerHTML : ''; } function textToHtml(text) { var box = document.createElement('div'); String(text).split(/\n\s*\n/).forEach(function(para) { para = para.trim(); if (!para) return; var p = document.createElement('p'); para.split('\n').forEach(function(line, i) { if (i) p.appendChild(document.createElement('br')); p.appendChild(document.createTextNode(line.trim())); }); box.appendChild(p); }); return box.innerHTML; } function esc(s) { var d = document.createElement('div'); d.textContent = String(s); return d.innerHTML.replace(/"/g, '"'); } // A display name is not proof of identity. Mark Michael only when // both the parsed h-card and the reply itself are on his site. function isSiteAuthor(author, sourceUrl) { try { var profile = new URL(String((author && author.url) || '')); var source = new URL(String(sourceUrl || '')); var profileHost = profile.hostname.toLowerCase().replace(/^www\./, ''); var sourceHost = source.hostname.toLowerCase().replace(/^www\./, ''); return profile.protocol === 'https:' && source.protocol === 'https:' && profileHost === 'michaelponders.com' && sourceHost === 'michaelponders.com' && profile.pathname === '/' && !profile.username && !profile.password && !profile.port && !profile.search && !profile.hash && !source.username && !source.password && !source.port; } catch (error) { return false; } } replies.forEach(function(reply) { var author = reply.author || {}; var authorName = author.name || 'Someone'; var sourceUrl = reply.url || reply['wm-source'] || '#'; if (!/^https?:\/\//i.test(sourceUrl)) sourceUrl = '#'; var authorPhoto = /^https:\/\//i.test(author.photo || '') ? author.photo : ''; if (!authorPhoto && /^https?:\/\/(www\.)?michaelponders\.com\//i.test(author.url || '')) { authorPhoto = 'https://media.mitchelltribe.xyz/profile_stipple_images/mestipple1.png'; } var content = ''; if (reply.content && reply.content.html) content = cleanReplyHtml(reply.content.html); if (!content && reply.content && reply.content.text) content = textToHtml(reply.content.text); var published = reply.published ? new Date(reply.published) : null; var dateStr = ''; if (published) { var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']; var hours = published.getHours(); var minutes = published.getMinutes(); var ampm = hours >= 12 ? 'PM' : 'AM'; hours = hours % 12 || 12; dateStr = published.getDate() + ' ' + months[published.getMonth()] + ' ' + published.getFullYear() + ' at ' + (hours < 10 ? '0' : '') + hours + ':' + (minutes < 10 ? '0' : '') + minutes + ampm; } repliesHTML += '
'; }); repliesEl.innerHTML = repliesHTML; } } }); }) .catch(function(error) { console.error('Error fetching webmentions:', error); var repliesEl = document.getElementById('webmention-replies'); if (repliesEl) { repliesEl.innerHTML = '

Unable to load webmentions at this time.

'; } }); })(); //]]>
联系我们 contact @ memedata.com