Appearance
AV1 on Android -- The Streaming Problem
Problem (discovered June/July 2026)
Low view-through rates (VTR) on Android devices in VAST video campaigns.
Root Cause (theory, hard to confirm)
Bunny CDN transcodes uploaded videos into multiple renditions in both H.264 (avc1) and AV1 (av01) codecs. The master HLS playlist (playlist.m3u8) includes all variants.
When a VAST player on Android selects the streaming MediaFile, it fetches the master playlist and sees AV1 variants. Since AV1 is a superior codec (better quality per bitrate), the player's adaptive bitrate algorithm selects it. However, many Android devices -- especially older ones -- lack hardware AV1 decoders and fall back to software decoding. Software AV1 decoding is extremely CPU-intensive, causing:
- CPU usage spikes
- The ad container (DSP/SSP SDK) detects excessive CPU usage
- The ad is killed to protect user experience
- The view counts as incomplete, lowering VTR
Evidence
Limited -- we only see "low view % on Android" in analytics. There's no direct telemetry showing AV1 selection or CPU-caused termination. The theory fits the symptoms.
Solution Applied (PR #1899)
Instead of referencing the master playlist.m3u8, the VAST tag now lists individual H.264 rendition playlists:
Before:
xml
<MediaFile delivery="streaming" type="application/x-mpegURL" ...>
https://delivery-6.cavai.com/{streamId}/playlist.m3u8
</MediaFile>After:
xml
<!-- One per H.264 rendition -->
<MediaFile delivery="streaming" type="application/x-mpegURL" bitrate="300" ...>
https://delivery-6.cavai.com/{streamId}/avc1_300k/video.m3u8
</MediaFile>
<MediaFile delivery="streaming" type="application/x-mpegURL" bitrate="800" ...>
https://delivery-6.cavai.com/{streamId}/avc1_800k/video.m3u8
</MediaFile>
<!-- ... more renditions -->Each per-rendition video.m3u8 contains only H.264 segments, so AV1 is never offered.
Trade-offs
- Streaming is preserved (chunked loading, lower initial payload)
- Bitrate adaptation still works across H.264 renditions (player picks based on
bitrateattribute) - AV1's superior compression is lost -- slightly higher bandwidth usage
- Not a proper adaptive stream (no mid-playback quality switching within a single MediaFile)
Ideal Solution
Generate a separate master playlist that only includes H.264 variants. This would give proper adaptive streaming without AV1. However, Bunny CDN generates playlists automatically, and it's unclear if custom playlist files can be added to their output. This needs further investigation.
Non-VAST Playback
This issue only affects VAST delivery. In standalone creative playback (builder preview, embedded creatives), the engine's @cavai/minimal-video player handles the master playlist directly. The streaming toggle in the builder (streaming property) controls whether HLS is used at all. No AV1 filtering is applied in non-VAST contexts -- if this becomes a problem there too, similar filtering would need to be added to the engine's stream handling.
Error Reporting
PR #1899 also added a VAST <Error> element with the [ERRORCODE] macro. This sends error codes to our analytics pipeline, which should help diagnose whether the AV1 theory is correct and catch other VAST playback issues.