Appearance
Google Ad Manager AV1 Video Warning (DV360)
Investigation started 2026-08-18. Status: warning persists, but creative is approved and serving.
The Problem
Two creatives with video (Insidious campaign, 320x400) bought programmatically by OMD via DV360 show a "Video ad requirements" warning in DV360's creative review: "Ads that violate Google's policies aren't allowed and won't run."
Affected creatives:
https://my.cavai.com/creatives/51784-53814-55643-95722/build#designhttps://my.cavai.com/creatives/51784-53814-55646-95724/build#design
Two URLs flagged as problematic:
https://delivery-6.cavai.com/4613267d-df10-4d49-88d0-0e0cf330da6f/audio/init.mp4https://delivery-6.cavai.com/4613267d-df10-4d49-88d0-0e0cf330da6f/av1_240p/init.mp4
Both are DASH streaming initialization segments. The first is a separate audio track, the second is an AV1-encoded video track. Google found these through "automated checks" (decision type: "Google investigation").
Exchange status in DV360
| Exchange | ID | Status | Feedback | Last sync |
|---|---|---|---|---|
| Google Ad Manager | 742894974 | Approved (green) | "Video ad requirements" warning with problematic URLs | N/A |
| Microsoft Monetize | 770902979 | Approved (SSL) | None | Aug 17, 2026 3:17 PM |
Actual delivery behavior
- The warning appears ONLY on the Google Ad Manager exchange, not Microsoft Monetize
- Despite the warning, the creative IS approved on both exchanges
- Impressions ARE being delivered on publishers with GAM as adserver
- Preview works fine on VG (publisher site)
- Unknown: Whether DV360 throttles bidding or excludes certain GAM inventory because of this warning. The warning might reduce reach even though status says "Approved."
Timeline (from Kai Lu, 2026-08-18)
- Kai reported the warning to Nicolay
- Nicolay confirmed streaming was recently enabled for all videos >= 4 seconds (3-4 months ago, no issues until now)
- Streaming was toggled OFF on the creative and republished
- Warning persists after republish -- Google has not re-scanned or the warning is sticky
The Creative
- Creative ID path:
51784-53814-55643-95722 - Stream ID:
4613267d-df10-4d49-88d0-0e0cf330da6f - Video file:
INSIDIOUS6_TWOWEEKS_ANIM_1_1.mp4 - Duration: 4.167 seconds (just over 4 sec)
- Resolution: 1200x1500 (portrait, 0.8 aspect ratio)
- Has a ChangeVideo operator in the flow
- Has a custom script that plays the video and pauses on last frame
What We Tested
1. Streaming is OFF in the creative
The builder shows streaming: false and forceStreaming: false on the video block. The Streaming toggle in the Playback section is off.
2. Standalone preview confirms no streaming
Network tab in standalone preview (/banner/{hash}) shows:
- Only ONE media request:
https://delivery-6.cavai.com/.../original(direct MP4, 5.6 MB, status 206) - No DASH segments (no
init.mp4, novideo*.m4s, noaudio/*.m4a) - The creative does NOT stream at runtime
3. H264 playlist exists and works
https://delivery-6.cavai.com/4613267d-df10-4d49-88d0-0e0cf330da6f/playlist_h264.m3u8 returns a valid playlist (verified in browser).
4. PR #1929 is unrelated
That PR fixes an infinite loop bug in ChangeImageOp/ChangeVideoOp (cycle detection with visited Set). No streaming changes.
5. Recent backend changes are unrelated
The recent backend commits (pulled 2026-08-18) are analytics/export work: DailyExportService, DuckDB, CSV streaming. No video/streaming changes.
Root Cause Analysis
The creative JSON embeds a streamData object containing all available video tracks from Bunny CDN, including AV1 tracks:
json
"streamData": {
"baseUrl": "https://delivery-6.cavai.com/4613267d-...",
"audio": {
"codecs": "mp4a.40.2",
"init": "init.mp4",
"media": "audio$Number$.m4a"
},
"video": [
{ "codecs": "av01.0.00M.10.0.110.01.01.01", "init": "av1_240p/init.mp4" },
{ "codecs": "av01.0.04M.10.0.110.01.01.01", "init": "av1_360p/init.mp4" },
{ "codecs": "avc1.64000d", "init": "240p/init.mp4" },
{ "codecs": "av01.0.04M.10.0.110.01.01.01", "init": "av1_480p/init.mp4" },
{ "codecs": "avc1.64001e", "init": "360p/init.mp4" },
...
]
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Even with streaming disabled, this data is embedded in the published creative. Google's scanner likely either:
- Static analysis: Scans the creative's JS/JSON for video URLs and flags AV1 content
- Previous scan: The creative may have been published with streaming ON previously, Google scanned it then and saw the AV1 DASH requests, and the rejection persists
Why AV1 specifically is a problem
The minimal-video player (@cavai/minimal-video, source in CE node_modules) has AV1 preference logic:
ts
// player.ts lines 226-242
const hasAv1 = stream.video.find(v => v.codecs.startsWith('av01'))
if (hasAv1 && canPlayType('av01.0.05M.08') === 'probably') {
// Filter out ALL non-AV1 codecs - only use AV1
stream.video = stream.video.filter(v => v.codecs.startsWith('av01'))
}1
2
3
4
5
6
2
3
4
5
6
On Chrome (which Google's scanner uses), AV1 is supported, so the player would exclusively use AV1 tracks. Google Ad Manager likely doesn't approve AV1 for video ads.
Audio Track Investigation
The original video file (INSIDIOUS6_TWOWEEKS_ANIM_1_1.mp4) has a silent audio track:
Video: H.264, 1200x1500, 15.5 Mbps, 4.167s
Audio: AAC, 2 channels, 316 kbps, 4.167s
mean_volume: -91.0 dB (effectively silent)
max_volume: -91.0 dB1
2
3
4
2
3
4
This silent audio track is why Bunny CDN generates a separate audio/init.mp4 DASH segment. Google flags it as problematic.
Test: re-upload without audio
Stripped the audio track with ffmpeg (-an -c:v copy) and saved as original_no_audio.mp4 (7.9 MB, video-only). Nicolay will re-upload this to the creative and republish.
Expected outcome: Bunny CDN won't generate audio DASH segments, removing audio/init.mp4 from the equation. If the AV1 warning also clears, the silent audio was the root trigger for Google's scan flagging the entire stream.
Status: Pending -- awaiting re-upload and DV360 re-scan.
What to Try Next
Immediate
- Re-upload video without audio track (file ready:
~/Downloads/original_no_audio.mp4) - Republish creative
- Wait for DV360 re-scan and check if warning clears
If warning persists (AV1 still flagged)
The streamData with AV1 URLs is still in the published JSON even with streaming off. Options:
- Strip
streamDataon publish whenstreaming === false-- since it's never used at runtime, no reason to include it. This would be a backend or AF change at publish time. - Strip AV1 tracks from
streamDataalways -- filter outav01entries fromstreamData.videowhen saving. This removes the problematic URLs from the creative payload entirely. - Strip AV1 tracks in StreamParser.ts -- filter at the backend level when parsing Bunny's HLS playlist, so AV1 never enters
streamDatain the first place.
Systemic improvement
Consider generating playlist_h264.m3u8 automatically on video upload rather than requiring a manual API call (POST /videos/:streamId/generate_h264_playlist). This ensures H264-only playlists always exist for VAST tag compatibility.
Key Code Locations
| What | Where |
|---|---|
| VAST tag generator | AF/src/utils/TagGenerator.ts (lines 265-306) |
| Streaming player | CE/node_modules/@cavai/minimal-video/player.ts |
| AV1 preference logic | player.ts lines 226-242 |
| Video block component | CE/src/components/creative/CreativeVideoBlock/CreativeVideoBlock.vue |
| H264 playlist generator | AB/app/Services/Bunny.ts generateH264Playlist() (lines 379-423) |
| Stream parser | AB/app/Services/StreamParser.ts |
| Video block types | AF/src/pages/Chatbots/components/BuilderVisuals/Blocks/data/types.ts |
Related Documentation
video-system-overview.md-- general video architecturevast-tag-generation.md-- VAST tag detailsvideo-playback-engine.md-- playback engine detailsav1-android-issue.md-- previous AV1 compatibility issue