Video Creative Ingest API

Video Creative Ingest API ช่วยให้ระบบโฆษณาของบุคคลที่สามส่งผ่านข้อมูลครีเอทีฟโฆษณาไปยังผลิตภัณฑ์ YouTube และ DAI ได้ กระบวนการนี้ช่วยให้มั่นใจได้ว่าเมื่อมีการตัดสินโฆษณาจากเซิร์ฟเวอร์โฆษณาที่ไม่ใช่ของ Google ครีเอทีฟโฆษณาที่แสดงจะพร้อมและพร้อมที่จะแสดงในสตรีมวิดีโอ YouTube หรือ DAI

ขั้นตอนการนำเข้าครีเอทีฟโฆษณาจากระบบโฆษณาของบุคคลที่สามอย่างสม่ำเสมอประกอบด้วย 2 ส่วนหลักๆ ส่วนแรกช่วยให้ระบบโฆษณาของบุคคลที่สามส่งครีเอทีฟโฆษณาไปยัง Google และตรวจสอบความคืบหน้าของครีเอทีฟโฆษณาขณะที่ส่งผ่านไปยังโครงสร้างพื้นฐานวิดีโอของ Google เมื่อนำเข้าครีเอทีฟโฆษณาเรียบร้อยแล้ว ระบบจะส่งตัวระบุกลับไปยังระบบโฆษณา

ขั้นตอนที่ 2 คือระบบโฆษณาจะนำตัวระบุเหล่านั้นไปรวมไว้ในเอกสาร VAST ที่อ้างอิงครีเอทีฟโฆษณาที่ส่งโดยใช้รหัสโฆษณา Universal (VAST 4.0 ขึ้นไป) หรือชิ้นงานครีเอทีฟโฆษณาประเภท "UniversalAdId" เมื่อพบเอกสาร VAST จากระบบโฆษณา ณ เวลาตัดสินใจใน DAI หรือ YouTube ระบบครีเอทีฟโฆษณาจะดึงข้อมูลระบุเหล่านั้นจาก VAST และดึงข้อมูลครีเอทีฟโฆษณาที่เหมาะสมจากโครงสร้างพื้นฐานวิดีโอของ Google เพื่อแทรกสำหรับการเล่น

ข้อกำหนดเกี่ยวกับสื่อ

สื่อครีเอทีฟโฆษณาที่ส่งไปยัง API ควรเป็นไปตามเกณฑ์ต่อไปนี้เพื่อให้ระบบประมวลผลได้สําเร็จ

ประเภทสื่อ

Google ยอมรับสื่อประเภทต่อไปนี้ ระบบอาจปฏิเสธสื่อประเภทอื่นๆ เมื่อส่งเข้ามา

  • video/mp4
  • video/webm
  • video/quicktime
  • video/avi
  • video/mpeg
  • video/x-flv
  • flv-application/octet-stream
  • application/octet-stream
  • video/3gpp
  • video/ogg
  • audio/mp4
  • audio/mpeg

พร็อพเพอร์ตี้สื่อ

สื่อที่ส่งต้องเป็นไปตามเกณฑ์ต่อไปนี้

  • สื่อต้องมีแทร็กเสียงหรือวิดีโออย่างน้อย 1 แทร็ก
  • สื่อต้องมีระยะเวลาที่เหมาะสม วิดีโอไม่มีความยาวเกินหลายนาที
  • สื่อต้องมีเสียงหรือวิดีโอที่มีความยาวมากกว่า 1 วินาที
  • หากสื่อมีเสียง สื่อนั้นต้องมีการกำหนดค่าช่องเสียงมาตรฐาน เช่น โมโน ส stereo หรือเสียงเซอร์ราวด์

ส่งครีเอทีฟโฆษณาเพื่อนำเข้า

โฟลว์ชาร์ตของกระบวนการส่งผ่านข้อมูล

  1. ระบบโฆษณาของบุคคลที่สามจะส่งคําขอ HTTP ไปยัง Video Creative Ingest API พร้อมรายการไฟล์สื่อที่เชื่อมโยงกับครีเอทีฟโฆษณา
  2. Video Creative Ingest API จะเลือกครีเอทีฟโฆษณาที่มีคุณภาพสูงสุดจากรายการที่ระบุและดาวน์โหลดจาก CDN
  3. Video Creative Ingest API จะส่งผ่านครีเอทีฟโฆษณาที่ดาวน์โหลดไปยังโครงสร้างพื้นฐานวิดีโอของ Google เพื่อให้ทั้งผลิตภัณฑ์ YouTube และ DAI ใช้งานได้
  4. ระบบจะส่งการแจ้งเตือน Pub/Sub กลับไปยังระบบโฆษณาของบุคคลที่สามพร้อมสถานะของครีเอทีฟโฆษณา การแจ้งเตือนจะระบุว่าอัปโหลดสำหรับทั้ง YouTube และ DAI สำเร็จหรือไม่ หากการโหลดครีเอทีฟโฆษณาไม่สําเร็จ การแจ้งเตือนจะระบุสาเหตุของความล้มเหลว

โปรดทำตามหลักเกณฑ์เหล่านี้เมื่อส่งครีเอทีฟโฆษณา

การตรวจสอบสิทธิ์

คุณต้องเข้าถึง API โดยใช้บัญชีบริการ Google Cloud คุณต้องให้ข้อมูลบัญชีแก่ Google เพื่อรับการให้สิทธิ์ที่เหมาะสม ณ เวลาผสานรวม

เมื่อคุณให้ข้อมูลบัญชีแก่ Google ผ่าน creativeingestion@google.com แล้ว ระบบจะให้สิทธิ์เข้าถึงปลายทาง API และหัวข้อ Cloud PubSub ที่ใช้เพื่อเผยแพร่การแจ้งเตือน

หากต้องการเริ่มกระบวนการตรวจสอบสิทธิ์ ให้ทำตามขั้นตอนต่อไปนี้

  1. สร้างบัญชี Google Cloud
  2. ตั้งค่าโปรเจ็กต์ด้วยบัญชีสําหรับส่งคําขอไปยัง DAI API
  3. ภายในโปรเจ็กต์ ให้ไปที่แท็บ IAM & Admin ทางด้านซ้าย แล้วสร้างบัญชีบริการใหม่ ระบบจะส่งคําขอโดยใช้บัญชีบริการดังกล่าว
  4. เปิดใช้ PubSub API และสร้างหัวข้อการแจ้งเตือนพาร์ทเนอร์ที่ไม่ซ้ำกันหัวข้อเดียวซึ่ง API จะเผยแพร่การแจ้งเตือนการนำเข้าที่สำเร็จและไม่สำเร็จทั้งหมด

    หากมีนโยบายองค์กรเกี่ยวกับการจำกัดโดเมน คุณต้องเพิ่มรหัสลูกค้า Google ลงในรายการลูกค้าที่อนุญาต โปรดติดต่อ creativeingestion@google.com เพื่อขอรหัส เมื่อดำเนินการเสร็จแล้ว คุณจะเพิ่มผู้ใช้หลัก (บัญชีหุ่นยนต์ของเรา) จากรายการลูกค้าที่อนุญาต (รหัสลูกค้าของ API) ไปยังนโยบาย IAM (PubSub ของผู้เผยแพร่โฆษณา) ได้

    เพิ่ม video-creative-library-discovery@system.gserviceaccount.com เป็นผู้เผยแพร่ PubSub ในหัวข้อ

  5. ระบุ creativeingestion@google.com ด้วยอีเมลบัญชีบริการและหัวข้อ PubSub เพื่อลงทะเบียนข้อมูลนี้กับ API

  6. เปิดใช้ DAI API หลังจากที่เพิ่มบัญชีเป็นผู้ใช้บริการแล้ว

  7. วิธีตั้งค่าข้อมูลเข้าสู่ระบบเพื่อเข้าถึง API

    • ดาวน์โหลดข้อมูลเข้าสู่ระบบจากบัญชีบริการ โดยคลิกบัญชีบริการในส่วนบัญชีบริการของแท็บ IAM และผู้ดูแลระบบ คลิกสร้างคีย์ แล้วจัดเก็บข้อมูลเข้าสู่ระบบ

    • ตรวจสอบสิทธิ์ API ของผู้เรียก ตั้งค่า GOOGLE_APPLICATION_CREDENTIALS เป็นเส้นทางของไฟล์ JSON ดูตัวอย่างโค้ดสำหรับการตรวจสอบสิทธิ์ไคลเอ็นต์ gRPC ในภาษาทั่วไป

การส่งผ่านข้อมูลครีเอทีฟโฆษณา

ทุกครั้งที่ครีเอทีฟโฆษณาใหม่พร้อมใช้งานในระบบโฆษณาของพาร์ทเนอร์ ระบบของพาร์ทเนอร์ควรส่งครีเอทีฟโฆษณาไปยัง Creative Ingest API

เมื่อส่งครีเอทีฟโฆษณาใหม่ไปยัง Google เพื่อโหลดลงในโครงสร้างพื้นฐานวิดีโอ คุณควรระบุข้อมูลครีเอทีฟโฆษณาเดียวกันกับที่รวมอยู่ในเอกสาร VAST ที่ระบบโฆษณาสร้างขึ้น วิธีนี้ช่วยให้มั่นใจได้ว่าลักษณะการนำเข้าครีเอทีฟโฆษณาไปยัง Google อย่างสม่ำเสมอจะมีลักษณะการทํางานเหมือนกับการโหลดครีเอทีฟโฆษณาเมื่อค้นพบครั้งแรกในการตอบกลับโฆษณา

ครีเอทีฟโฆษณาที่ส่งแต่ละรายการจะสร้างการดำเนินการส่งผ่านข้อมูลแบบต่อเนื่องในเซิร์ฟเวอร์ ซึ่งสามารถค้นหาสถานะได้ เมื่อดำเนินการเสร็จสมบูรณ์แล้ว ระบบจะสร้างแหล่งข้อมูลครีเอทีฟโฆษณาภายในระบบ การตอบกลับการส่งครีเอทีฟโฆษณาจะมีรหัสของการดำเนินการที่เกิดจากคำขอ รหัสการดำเนินการที่ได้จะรวมอยู่ในการแจ้งเตือน Cloud PubSub ที่ส่งเมื่อการดำเนินการเสร็จสมบูรณ์เพื่อจับคู่กับครีเอทีฟโฆษณาต้นฉบับที่ส่ง นอกจากนี้ คุณยังใช้รหัสการดำเนินการเพื่อตรวจสอบความคืบหน้าของการดำเนินการได้ทุกเมื่อ

คำขอครีเอทีฟโฆษณา

ระบบจะส่งข้อมูลไปยัง API เป็น Protocol Buffers หรือออบเจ็กต์ JSON เราขอแนะนำให้ใช้ Protocol Buffers ที่ส่งโดยใช้ gRPC เนื่องจากจำเป็นต่อการใช้การแจ้งเตือน PubSub และการปรับรูปแบบ JSON มีความซับซ้อนมากขึ้นเนื่องจากช่อง google.protobuf.Any ในการตอบกลับ

การตอบกลับครีเอทีฟโฆษณา

หากดำเนินการสำเร็จ เซิร์ฟเวอร์จะแสดงการตอบกลับ Protocol Buffer หรือการตอบกลับ JSON ทั้งนี้ขึ้นอยู่กับประเภทคำขอ การตอบกลับจะมีชื่อการดำเนินการนำเข้าที่สร้างใหม่และรายละเอียดของการดำเนินการ

เมื่อส่งครั้งแรก เมตาดาต้าบางอย่างที่เชื่อมโยงกับการดำเนินการอาจว่างเปล่าและผลลัพธ์อาจไม่ปรากฏ เมื่อดำเนินการเสร็จแล้ว ระบบจะป้อนข้อมูลผลลัพธ์ด้วยทรัพยากรครีเอทีฟโฆษณา (หรือข้อผิดพลาด) และข้อมูลเมตาจะมีข้อมูลเกี่ยวกับสถานะการส่งผ่านข้อมูล

โปรดทราบว่าต้องแยกข้อมูลเมตาจากโปรโต Any ไปยังโปรโต CreateCreativeOperationMetadata และต้องแยกการตอบกลับ (หากมี) ไปยังโปรโต Creative

ไลบรารีของไคลเอ็นต์เพื่อเข้าถึง API

ทําตามขั้นตอนต่อไปนี้เพื่อผสานรวมกับ API

  1. ดาวน์โหลดรายการที่เกี่ยวข้องของ Protocol Buffer แล้วย้ายทั้งโฟลเดอร์ google ไปยังไดเรกทอรี src ขั้นตอนนี้ข้ามได้หากใช้ Google Cloud App Engine
  2. ใช้ปลั๊กอิน protoc เพื่อสร้างโค้ด gRPC จากไฟล์ proto และวางโค้ดที่สร้างขึ้นไว้ในไดเรกทอรีที่เกี่ยวข้อง
  3. สร้างไฟล์โปรโตคอลใหม่สำหรับโปรโตคอลที่แสดงในการแจ้งเตือน PubSub แล้วทำตามขั้นตอนก่อนหน้าซ้ำเพื่อสร้างโค้ดจากโปรโตคอล
  4. ใช้ gRPC เพื่อส่งคําขอไปยัง API

    1. รับข้อมูลเข้าสู่ระบบเริ่มต้นที่มีขอบเขตต่อไปนี้

    https://www.googleapis.com/auth/video-ads

    https://www.googleapis.com/auth/pubsub

    1. ส่งคำขอไปยัง Creative Ingest
    • เชื่อมต่อกับ dai.googleapis.com:443 โดยใช้ข้อมูลเข้าสู่ระบบเริ่มต้น
    • สร้างสแต็บไคลเอ็นต์สำหรับบริการส่งผ่านข้อมูลครีเอทีฟโฆษณาโดยใช้โค้ดที่ gRPC สร้างขึ้นจากโปรโตคอล
    • โทรหา CreateCreative โดยใช้สตับไคลเอ็นต์

    (ไม่บังคับ) สร้างสแต็บสำหรับบริการการดำเนินการโดยใช้โค้ด gRPC ของการดำเนินการแบบต่อเนื่อง ซึ่งรวมอยู่ในไดเรกทอรี googleapis ที่ดาวน์โหลดในขั้นตอนที่ 2 ซึ่งสามารถใช้เพื่อดูสถานะของการดำเนินการหนึ่งๆ (GetOperation)

  5. ตรวจสอบการแจ้งเตือนใน PubSub

    1. ใช้คลังไลบรารีไคลเอ็นต์ PubSub หรือ gRPC เพื่อเชื่อมต่อกับบริการ PubSub และทำการสำรวจการแจ้งเตือน PubSub ที่เผยแพร่ไปยังหัวข้อที่ระบุ

    2. Unmarshal ข้อความ PubSub เป็นโปรโตจากขั้นตอนที่ 4

    3. เมื่อใดก็ตามที่มีการเรียกใช้ CreateCreative, GetOperation หรือมีการแจ้งเตือน PubSub ให้แปลงข้อมูลเมตาเป็น CreateCreativeOperationMetadata ใน discovery.proto จากโปรโตคอล google.protobuf.Any และแปลงการตอบกลับเป็น Creative ใน discovery.proto

ตัวอย่างโค้ดไคลเอ็นต์ Go

// Copyright 2024 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package main

import (
  dai "google.golang.org/genproto/googleapis/ads/dai/v1"
  psnotif "protos/dai"
  "google.golang.org/genproto/googleapis/longrunning"
  "cloud.google.com/go/pubsub"
  "golang.org/x/net/context"
  "google.golang.org/grpc"
  "google.golang.org/grpc/credentials"
  "google.golang.org/grpc/credentials/oauth"
  "github.com/golang/protobuf/proto"
  anypb "github.com/golang/protobuf/ptypes/any"
)

var scopes = []string{"https://www.googleapis.com/auth/video-ads", "https://www.googleapis.com/auth/pubsub"}

const (
  subID = "sub-id" // The ID for the subscription to the topic you provided us (projects/<project ID>/subscriptions/<subscription ID>)
  project = "your-project-id" // Your Google Cloud Project ID
)

func main() {
  ctx := context.Background()
  crpc, err := oauth.NewApplicationDefault(ctx, scopes...)
  if err != nil {
    // TODO: Handle error
  }

  conn, err := grpc.Dial("dai.googleapis.com:443",
    grpc.WithTransportCredentials(credentials.NewClientTLSFromCert(nil, "")),
    grpc.WithPerRPCCredentials(crpc))
  if err != nil {
    // TODO: Handle error 
  }

  apiclient := dai.NewPartnerDiscoveryServiceClient(conn)
  opclient := longrunning.NewOperationsClient(conn)

  op, err := apiclient.CreateCreative(ctx, &dai.CreateCreativeRequest{
    // TODO: Add Creative with metadata and media files.
  })
  if err != nil {
    // TODO: Handle error
  }

  pubsubClient, err := pubsub.NewClient(ctx, project)
  if err != nil {
    // TODO: Handle error
  }
  sub := pubsubClient.Subscription(subID)

  // TODO: Pull from Pub/Sub subscription to receive messages, and acknowledge them
  var msg *pubsub.Message // Assume msg = a received Pub/Sub message

  // Unmarshal the Pub/Sub message into the proto created in step 9a of guide
  var n psnotif.CreateCreativeStatus
  if err := proto.Unmarshal(msg.Data, &n); err != nil {
    // TODO: Handle error
  }
  op = n.GetDetails()
  md, err = anyToMetadata(op.GetMetadata())
  if err != nil {
    // TODO: Handle error
  }
  // TODO: Check if ingest was successful and get Google Video ID from md.GetGvRegistryId()
  // TODO: Enable serving of creative using Google Video ID in VAST document

  // Optionally check the status of an ingest request using the status endpoint
  op, err = opclient.GetOperation(ctx, &longrunning.GetOperationRequest{Name:   op.Name})
  if err != nil {
    // TODO: Handle error
  }
}

// anyToMetadata converts the metadata Any field in an Operation message to
// CreateCreativeOperationMetadata.
func anyToMetadata(msg *anypb.Any) (*dai.CreateCreativeOperationMetadata, error) {
  var md dai.CreateCreativeOperationMetadata
  return &md, proto.Unmarshal(msg.Value, &md)
}

// anyToCreative converts the response Any field in an Operation message to
// Creative.
func anyToCreative(msg *anypb.Any) (*dai.Creative, error) {
  var cr dai.Creative
  return &cr, proto.Unmarshal(msg.Value, &cr)
}

การค้นหาครีเอทีฟโฆษณาระหว่างการเล่น

แผนภาพขั้นตอนการค้นหาครีเอทีฟโฆษณา

  1. คำขอของผู้ใช้ที่ต้องการดูเนื้อหาใน YouTube หรือ DAI
  2. YouTube / DAI ได้รับการตอบกลับ VAST จากระบบโฆษณาของบุคคลที่สามเพื่อแทรกโฆษณาลงในเนื้อหา
  3. ระบบจะแมปโฆษณาที่แสดงผลกับครีเอทีฟโฆษณาที่นำเข้าก่อนหน้านี้ ครีเอทีฟโฆษณาเหล่านั้นพร้อมสําหรับการเล่นแล้ว ระบบจะดึงข้อมูลครีเอทีฟโฆษณาจากโครงสร้างพื้นฐานวิดีโอของ Google และเล่นให้ผู้ใช้ดู

เอกสาร VAST ที่แก้ไขโดยพาร์ทเนอร์

เมื่อระบบโฆษณาแสดงการตอบกลับ VAST หลังจากที่โหลดครีเอทีฟโฆษณาลงในโครงสร้างพื้นฐานวิดีโอของ Google เรียบร้อยแล้ว เอกสารควรมีการอ้างอิงครีเอทีฟโฆษณาที่ประมวลผลแล้ว เอกสาร VAST ควรรวมไฟล์สื่อสำหรับครีเอทีฟโฆษณาหนึ่งๆ ต่อไป แต่ไม่มีการรับประกันว่าระบบจะใช้ไฟล์สื่อเหล่านี้

การอ้างอิงครีเอทีฟโฆษณาที่ประมวลผลแล้วในเอกสาร VAST ทําได้ 2 วิธี ได้แก่ การเพิ่มองค์ประกอบ UniversalAdId ใหม่ลงในเอกสาร VAST 4 ขึ้นไป หรือการเพิ่มส่วนขยายที่กําหนดเอง

รหัสโฆษณาสากล

gvRegistryID ที่ Video Creative Ingest API แสดงผลเป็นรหัสสากลที่แสดงต่อสาธารณะซึ่งใช้เพื่อระบุครีเอทีฟโฆษณาวิดีโอที่ไม่ซ้ำกันในทุกระบบโฆษณา คุณควรเพิ่มรหัสนี้ลงในเอกสาร VAST 4 ขึ้นไปของระบบโฆษณาเพื่อให้ YouTube หรือ DAI ใช้รหัสนี้เพื่อแมปกับครีเอทีฟโฆษณาที่ส่งมาครั้งแรกได้เมื่อได้รับเอกสาร VAST

ระบบโฆษณาควรเพิ่มองค์ประกอบ UniversalAdId ใหม่ลงในเอกสาร VAST 4 ขึ้นไปภายใต้โหนดครีเอทีฟโฆษณา คุณควรตั้งค่าแอตทริบิวต์ idRegistry เป็น "googlevideo" และค่าควรเป็นค่าที่ระบุไว้ในสถานะของการแจ้งเตือนครีเอทีฟโฆษณาที่ประมวลผลเรียบร้อยแล้ว

ต่อไปนี้คือตัวอย่างเอกสาร VAST 4 ที่มีการเพิ่มรหัสโฆษณา Universal ใหม่

<VAST xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="vast.xsd" version="4.0">
  <Ad id="318230556">
    <InLine>
      <AdSystem>DCM</AdSystem>
      <AdTitle>In-Stream Video</AdTitle>
      <Creatives>
        <Creative id="79534759" AdID="" sequence="1">
          <UniversalAdId idRegistry="googlevideo">dQw4w9WgXcQ</UniversalAdId>
          <Linear>
            <Duration>00:00:15</Duration>
            <MediaFiles>
              <Mezzanine>
                <![CDATA[https://cdn.com/media.mp4]]>
              </Mezzanine>
              <MediaFile delivery="progressive" width="640" height="360" type="video/mp4" bitrate="313">
                <![CDATA[https://cdn.com/low-res-media.mp4]]>
              </MediaFile>
            </MediaFiles>
          </Linear>
        </Creative>
      </Creatives>
    </InLine>
  </Ad>
</VAST>

CreativeExtension

เนื่องจากองค์ประกอบรหัสโฆษณาแบบ Universal เพิ่งเปิดตัวใน VAST 4.0 ข้อมูลเดียวกันจึงต้องใช้ส่วนขยายที่กําหนดเองจึงจะแสดงในเอกสาร VAST ที่มีเวอร์ชันต่ำกว่า 4.0 ได้ ซึ่งทำได้โดยใช้องค์ประกอบ CreativeExtension ในส่วนองค์ประกอบครีเอทีฟโฆษณาของข้อกําหนด VAST

ส่วนขยายใหม่ที่เปิดตัวเป็นส่วนขยายทั่วไปที่เปิดใช้เพื่อให้ป้อนค่า Universal AD ID ใดก็ได้ ในกรณีนี้ รหัสโฆษณาสากลจะอยู่ในรีจิสทรี googlevideo และรหัสจะเป็นรหัส google video

<VAST version="3.0">
  <Ad id="318230556">
    <InLine>
      <AdSystem>My Ad Server</AdSystem>
      <AdTitle>Car Company</AdTitle>
      <Creatives>
        <Creative id="79534759" AdID="" sequence="1">
          <Linear>...</Linear>
          <CreativeExtensions>
            <CreativeExtension type="UniversalAdId">
              <UniversalAdId idRegistry="googlevideo">dQw4w9WgXcQ</UniversalAdId>
            </CreativeExtension>
          </CreativeExtensions>
        </Creative>
      </Creative>
    </InLine>
  </Ad>
</VAST>

นอกจากนี้ คุณยังใช้แนวทาง CreativeExtension ใน VAST 4 ขึ้นไปได้ในกรณีที่มีการป้อนข้อมูล UniversalAdId ด้วยรหัสสำหรับรีจิสทรี UniversalAdId อื่นแล้ว

<VAST xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="vast.xsd" version="4.0">
  <Ad id="318230556">
    <InLine>
      <AdSystem>DCM</AdSystem>
      <AdTitle>In-Stream Video</AdTitle>
      <Creatives>
        <Creative id="79534759" AdID="" sequence="1">
          <UniversalAdId idRegistry="other-registry">other-id</UniversalAdId>
          <Linear>
            <Duration>00:00:15</Duration>
            <MediaFiles>
              <Mezzanine>
                <![CDATA[https://cdn.com/media.mp4]]>
              </Mezzanine>
              <MediaFile delivery="progressive" width="640" height="360" type="video/mp4" bitrate="313">
                <![CDATA[https://cdn.com/low-res-media.mp4]]>
              </MediaFile>
            </MediaFiles>
          </Linear>
          <CreativeExtensions>
            <CreativeExtension type="UniversalAdId">
              <UniversalAdId idRegistry="googlevideo">dQw4w9WgXcQ</UniversalAdId>
            </CreativeExtension>
          </CreativeExtensions>
        </Creative>
      </Creatives>
    </InLine>
  </Ad>
</VAST>