管理实时会话

使用 Video Stitcher API,您可以在每次开始播放直播时创建一个直播会话,以便在广告插播期间动态拼接广告。响应包含播放网址和直播会话的配置。

本页面介绍了如何创建和管理通过 Google Ad Manager 启用的直播会话。如需详细了解这些类型的直播会话,请参阅管理由 Google Ad Manager 启用的直播会话

准备工作

创建实时会话

如需创建直播会话,请使用 projects.locations.liveSessions.create 方法。

创建直播会话时,以下字段是可选的:

REST

在使用任何请求数据之前,请先进行以下替换:

  • PROJECT_NUMBERIAM 设置页面上项目编号字段中显示的 Google Cloud 项目编号
  • LOCATION:用于创建会话的位置;请使用某个受支持的地区
    显示位置
    • us-central1
    • us-east1
    • us-west1
    • asia-east1
    • asia-south1
    • asia-southeast1
    • europe-west1
    • southamerica-east1
  • LIVE_CONFIG_ID:实时配置的用户定义标识符

如需发送您的请求,请展开以下选项之一:

您应该收到类似以下内容的 JSON 响应:

 {   "name": "projects/PROJECT_NUMBER/locations/LOCATION/liveSessions/SESSION_ID",   "playUri": "PLAY_URI",   "liveConfig": "projects/PROJECT_NUMBER/locations/LOCATION/liveConfigs/LIVE_CONFIG_ID", } 

C#

在试用此示例之前,请按照《Video Stitcher API 快速入门:使用客户端库》中的 C# 设置说明进行操作。 如需了解详情,请参阅 Video Stitcher API C# API 参考文档

如需向 Video Stitcher API 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证

 using Google.Cloud.Video.Stitcher.V1;  public class CreateLiveSessionSample {     public LiveSession CreateLiveSession(         string projectId, string location, string liveConfigId)     {         // Create the client.         VideoStitcherServiceClient client = VideoStitcherServiceClient.Create();          CreateLiveSessionRequest request = new CreateLiveSessionRequest         {             Parent = $"projects/{projectId}/locations/{location}",             LiveSession = new LiveSession             {                 LiveConfig = LiveConfigName.FormatProjectLocationLiveConfig(projectId, location, liveConfigId)             }         };          // Call the API.         LiveSession session = client.CreateLiveSession(request);          // Return the result.         return session;     } } 

Go

在试用此示例之前,请按照《Video Stitcher API 快速入门:使用客户端库》中的 Go 设置说明进行操作。 如需了解详情,请参阅 Video Stitcher API Go API 参考文档

如需向 Video Stitcher API 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证

import ( 	"context" 	"fmt" 	"io"  	stitcher "cloud.google.com/go/video/stitcher/apiv1" 	"cloud.google.com/go/video/stitcher/apiv1/stitcherpb" )  // createLiveSession creates a livestream session in which to insert ads. // Live sessions are ephemeral resources that expire after a few minutes. func createLiveSession(w io.Writer, projectID, liveConfigID string) error { 	// projectID := "my-project-id" 	// liveConfigID := "my-live-config" 	location := "us-central1" 	ctx := context.Background() 	client, err := stitcher.NewVideoStitcherClient(ctx) 	if err != nil { 		return fmt.Errorf("stitcher.NewVideoStitcherClient: %w", err) 	} 	defer client.Close()  	req := &stitcherpb.CreateLiveSessionRequest{ 		Parent: fmt.Sprintf("projects/%s/locations/%s", projectID, location), 		LiveSession: &stitcherpb.LiveSession{ 			LiveConfig: fmt.Sprintf("projects/%s/locations/%s/liveConfigs/%s", projectID, location, liveConfigID), 		}, 	} 	// Creates the live session. 	response, err := client.CreateLiveSession(ctx, req) 	if err != nil { 		return fmt.Errorf("client.CreateLiveSession: %w", err) 	}  	fmt.Fprintf(w, "Live session: %v\n", response.GetName()) 	fmt.Fprintf(w, "Play URI: %v", response.GetPlayUri()) 	return nil } 

Java

在试用此示例之前,请按照《Video Stitcher API 快速入门:使用客户端库》中的 Java 设置说明进行操作。 如需了解详情,请参阅 Video Stitcher API Java API 参考文档

如需向 Video Stitcher API 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证

 import com.google.cloud.video.stitcher.v1.CreateLiveSessionRequest; import com.google.cloud.video.stitcher.v1.LiveConfigName; import com.google.cloud.video.stitcher.v1.LiveSession; import com.google.cloud.video.stitcher.v1.LocationName; import com.google.cloud.video.stitcher.v1.VideoStitcherServiceClient; import java.io.IOException;  public class CreateLiveSession {    public static void main(String[] args) throws Exception {     // TODO(developer): Replace these variables before running the sample.     String projectId = "my-project-id";     String location = "us-central1";     String liveConfigId = "my-live-config-id";      createLiveSession(projectId, location, liveConfigId);   }    // Creates a live session given the parameters in the supplied live config.   // For more information, see   // https://cloud.google.com/video-stitcher/docs/how-to/managing-live-sessions.   public static LiveSession createLiveSession(       String projectId, String location, String liveConfigId) throws IOException {     // Initialize client that will be used to send requests. This client only needs to be created     // once, and can be reused for multiple requests.     try (VideoStitcherServiceClient videoStitcherServiceClient =         VideoStitcherServiceClient.create()) {       CreateLiveSessionRequest createLiveSessionRequest =           CreateLiveSessionRequest.newBuilder()               .setParent(LocationName.of(projectId, location).toString())               .setLiveSession(                   LiveSession.newBuilder()                       .setLiveConfig(LiveConfigName.format(projectId, location, liveConfigId)))               .build();        LiveSession response = videoStitcherServiceClient.createLiveSession(createLiveSessionRequest);       System.out.println("Created live session: " + response.getName());       System.out.println("Play URI: " + response.getPlayUri());       return response;     }   } }

Node.js

在试用此示例之前,请按照《Video Stitcher API 快速入门:使用客户端库》中的 Node.js 设置说明进行操作。 如需了解详情,请参阅 Video Stitcher API Node.js API 参考文档

如需向 Video Stitcher API 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证

/**  * TODO(developer): Uncomment these variables before running the sample.  */ // projectId = 'my-project-id'; // location = 'us-central1'; // liveConfigId = 'my-live-config-id';  // Imports the Video Stitcher library const {VideoStitcherServiceClient} =   require('@google-cloud/video-stitcher').v1; // Instantiates a client const stitcherClient = new VideoStitcherServiceClient();  async function createLiveSession() {   // Construct request   const request = {     parent: stitcherClient.locationPath(projectId, location),     liveSession: {       liveConfig: stitcherClient.liveConfigPath(         projectId,         location,         liveConfigId       ),     },   };    const [session] = await stitcherClient.createLiveSession(request);   console.log(`Live session: ${session.name}`);   console.log(`Play URI: ${session.playUri}`); }  createLiveSession().catch(err => {   console.error(err.message);   process.exitCode = 1; });

PHP

在试用此示例之前,请按照《Video Stitcher API 快速入门:使用客户端库》中的 PHP 设置说明进行操作。 如需了解详情,请参阅 Video Stitcher API PHP API 参考文档

如需向 Video Stitcher API 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证

use Google\Cloud\Video\Stitcher\V1\Client\VideoStitcherServiceClient; use Google\Cloud\Video\Stitcher\V1\CreateLiveSessionRequest; use Google\Cloud\Video\Stitcher\V1\LiveSession;  /**  * Creates a live session. Live sessions are ephemeral resources that expire  * after a few minutes.  *  * @param string $callingProjectId     The project ID to run the API call under  * @param string $location             The location of the session  * @param string $liveConfigId         The live config ID to use to create the  *                                     live session  */ function create_live_session(     string $callingProjectId,     string $location,     string $liveConfigId ): void {     // Instantiate a client.     $stitcherClient = new VideoStitcherServiceClient();      $parent = $stitcherClient->locationName($callingProjectId, $location);     $liveConfig = $stitcherClient->liveConfigName($callingProjectId, $location, $liveConfigId);     $liveSession = new LiveSession();     $liveSession->setLiveConfig($liveConfig);      // Run live session creation request     $request = (new CreateLiveSessionRequest())         ->setParent($parent)         ->setLiveSession($liveSession);     $response = $stitcherClient->createLiveSession($request);      // Print results     printf('Live session: %s' . PHP_EOL, $response->getName()); }

Python

在试用此示例之前,请按照《Video Stitcher API 快速入门:使用客户端库》中的 Python 设置说明进行操作。 如需了解详情,请参阅 Video Stitcher API Python API 参考文档

如需向 Video Stitcher API 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证

 import argparse  from google.cloud.video import stitcher_v1 from google.cloud.video.stitcher_v1.services.video_stitcher_service import (     VideoStitcherServiceClient, )   def create_live_session(     project_id: str, location: str, live_config_id: str ) -> stitcher_v1.types.LiveSession:     """Creates a live session. Live sessions are ephemeral resources that expire     after a few minutes.     Args:         project_id: The GCP project ID.         location: The location in which to create the session.         live_config_id: The user-defined live config ID.      Returns:         The live session resource.     """      client = VideoStitcherServiceClient()      parent = f"projects/{project_id}/locations/{location}"     live_config = (         f"projects/{project_id}/locations/{location}/liveConfigs/{live_config_id}"     )      live_session = stitcher_v1.types.LiveSession(live_config=live_config)      response = client.create_live_session(parent=parent, live_session=live_session)     print(f"Live session: {response.name}")     return response  

Ruby

在试用此示例之前,请按照《Video Stitcher API 快速入门:使用客户端库》中的 Ruby 设置说明进行操作。 如需了解详情,请参阅 Video Stitcher API Ruby API 参考文档

如需向 Video Stitcher API 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证

require "google/cloud/video/stitcher"  ## # Create a live stream session. Live sessions are ephemeral resources # that expire after a few minutes. # # @param project_id [String] Your Google Cloud project (e.g. `my-project`) # @param location [String] The location (e.g. `us-central1`) # @param live_config_id [String] Your live config name (e.g. `my-live-config`) # def create_live_session project_id:, location:, live_config_id:   # Create a Video Stitcher client.   client = Google::Cloud::Video::Stitcher.video_stitcher_service    # Build the resource name of the parent.   parent = client.location_path project: project_id, location: location    # Build the resource name of the live config.   live_config_name = client.live_config_path project: project_id,                                              location: location,                                              live_config: live_config_id    # Set the session fields.   new_live_session = {     live_config: live_config_name   }    response = client.create_live_session parent: parent,                                         live_session: new_live_session    # Print the live session name.   puts "Live session: #{response.name}" end

响应是一个实时会话对象playUri 是客户端设备用于播放相应直播会话的拼接广告视频流的网址。

Video Stitcher API 会为每个请求生成唯一的会话 ID。如果过去 5 分钟内未请求 playUri,会话就会过期。

广告必须先经过编码,然后才能拼接至直播会话中。当您为拼接广告的视频创建会话时,Video Stitcher API 会确定广告是否已在之前的会话中编码。该 API 仅查找与您的 Google Cloud 项目关联的会话所创建的已编码广告。如需详细了解此流程,请参阅概览

如果您要代表客户的设备生成会话,可以使用 HTTP 标头设置以下参数:

参数 HTTP 标头
CLIENT_IP x-forwarded-for
REFERRER_URL referer
USER_AGENT user-agent

您可以向上述 curl 请求添加以下标头:

-H "x-forwarded-for: CLIENT_IP" \ -H "referer: REFERRER_URL" \ -H "user-agent: USER_AGENT" \

如果未提供 x-forwarded-for 标头,Video Stitcher API 会在广告元数据请求中使用客户端的 IP 地址。请注意,如果会话是代表客户的设备生成的,那么客户端的 IP 地址可能与客户设备的 IP 地址不一致。

广告代码宏

广告代码可以包含宏,这些宏可以为每个会话生成不同的广告代码。宏在广告代码中用方括号表示,如以下示例所示:

AD_TAG_URI&macro=[my-key]

adTagUri实时配置中定义。

如需替换广告代码宏中的值,请在 adTagMacros 字段中提供映射。例如,如果您想将 [my-key] 宏替换为字符串 my-value,则需要提供以下内容:

{   ...   "adTagMacros": {     "my-key": "my-value"   },   ... }

当 Video Stitcher API 请求广告元数据时,它会使用以下广告代码:

AD_TAG_URI&macro=my-value

获取会话

如需获取直播会话,请使用 projects.locations.liveSessions.get 方法。

REST

在使用任何请求数据之前,请先进行以下替换:

  • PROJECT_NUMBERIAM 设置页面上项目编号字段中显示的 Google Cloud 项目编号
  • LOCATION:用于创建会话的位置;请使用某个受支持的地区
    显示位置
    • us-central1
    • us-east1
    • us-west1
    • asia-east1
    • asia-south1
    • asia-southeast1
    • europe-west1
    • southamerica-east1
  • SESSION_ID:直播会话的标识符

如需发送您的请求,请展开以下选项之一:

您应该收到类似以下内容的 JSON 响应:

 {   "name": "projects/PROJECT_NUMBER/locations/LOCATION/liveSessions/SESSION_ID",   "playUri": "ad-stitched-live-stream-uri",   "liveConfig": "projects/PROJECT_NUMBER/locations/LOCATION/liveConfigs/LIVE_CONFIG_ID", } 

C#

在试用此示例之前,请按照《Video Stitcher API 快速入门:使用客户端库》中的 C# 设置说明进行操作。 如需了解详情,请参阅 Video Stitcher API C# API 参考文档

如需向 Video Stitcher API 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证

 using Google.Cloud.Video.Stitcher.V1;  public class GetLiveSessionSample {     public LiveSession GetLiveSession(         string projectId, string location, string sessionId)     {         // Create the client.         VideoStitcherServiceClient client = VideoStitcherServiceClient.Create();          GetLiveSessionRequest request = new GetLiveSessionRequest         {             LiveSessionName = LiveSessionName.FromProjectLocationLiveSession(projectId, location, sessionId)         };          // Call the API.         LiveSession session = client.GetLiveSession(request);          // Return the result.         return session;     } } 

Go

在试用此示例之前,请按照《Video Stitcher API 快速入门:使用客户端库》中的 Go 设置说明进行操作。 如需了解详情,请参阅 Video Stitcher API Go API 参考文档

如需向 Video Stitcher API 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证

import ( 	"context" 	"fmt" 	"io"  	stitcher "cloud.google.com/go/video/stitcher/apiv1" 	"cloud.google.com/go/video/stitcher/apiv1/stitcherpb" )  // getLiveSession gets a livestream session by ID. func getLiveSession(w io.Writer, projectID, sessionID string) error { 	// projectID := "my-project-id" 	// sessionID := "123-456-789" 	location := "us-central1" 	ctx := context.Background() 	client, err := stitcher.NewVideoStitcherClient(ctx) 	if err != nil { 		return fmt.Errorf("stitcher.NewVideoStitcherClient: %w", err) 	} 	defer client.Close()  	req := &stitcherpb.GetLiveSessionRequest{ 		Name: fmt.Sprintf("projects/%s/locations/%s/liveSessions/%s", projectID, location, sessionID), 	} 	// Gets the session. 	response, err := client.GetLiveSession(ctx, req) 	if err != nil { 		return fmt.Errorf("client.GetLiveSession: %w", err) 	}  	fmt.Fprintf(w, "Live session: %+v", response) 	return nil } 

Java

在试用此示例之前,请按照《Video Stitcher API 快速入门:使用客户端库》中的 Java 设置说明进行操作。 如需了解详情,请参阅 Video Stitcher API Java API 参考文档

如需向 Video Stitcher API 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证

 import com.google.cloud.video.stitcher.v1.GetLiveSessionRequest; import com.google.cloud.video.stitcher.v1.LiveSession; import com.google.cloud.video.stitcher.v1.LiveSessionName; import com.google.cloud.video.stitcher.v1.VideoStitcherServiceClient; import java.io.IOException;  public class GetLiveSession {    public static void main(String[] args) throws Exception {     // TODO(developer): Replace these variables before running the sample.     String projectId = "my-project-id";     String location = "us-central1";     String sessionId = "my-session-id";      getLiveSession(projectId, location, sessionId);   }    // Gets a live session.   public static LiveSession getLiveSession(String projectId, String location, String sessionId)       throws IOException {     // Initialize client that will be used to send requests. This client only needs to be created     // once, and can be reused for multiple requests.     try (VideoStitcherServiceClient videoStitcherServiceClient =         VideoStitcherServiceClient.create()) {       GetLiveSessionRequest getLiveSessionRequest =           GetLiveSessionRequest.newBuilder()               .setName(LiveSessionName.of(projectId, location, sessionId).toString())               .build();        LiveSession response = videoStitcherServiceClient.getLiveSession(getLiveSessionRequest);       System.out.println("Live session: " + response.getName());       return response;     }   } }

Node.js

在试用此示例之前,请按照《Video Stitcher API 快速入门:使用客户端库》中的 Node.js 设置说明进行操作。 如需了解详情,请参阅 Video Stitcher API Node.js API 参考文档

如需向 Video Stitcher API 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证

/**  * TODO(developer): Uncomment these variables before running the sample.  */ // projectId = 'my-project-id'; // location = 'us-central1'; // sessionId = 'my-session-id';  // Imports the Video Stitcher library const {VideoStitcherServiceClient} =   require('@google-cloud/video-stitcher').v1; // Instantiates a client const stitcherClient = new VideoStitcherServiceClient();  async function getLiveSession() {   // Construct request   const request = {     name: stitcherClient.liveSessionPath(projectId, location, sessionId),   };   const [session] = await stitcherClient.getLiveSession(request);   console.log(`Live session: ${session.name}`); }  getLiveSession().catch(err => {   console.error(err.message);   process.exitCode = 1; });

PHP

在试用此示例之前,请按照《Video Stitcher API 快速入门:使用客户端库》中的 PHP 设置说明进行操作。 如需了解详情,请参阅 Video Stitcher API PHP API 参考文档

如需向 Video Stitcher API 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证

use Google\Cloud\Video\Stitcher\V1\Client\VideoStitcherServiceClient; use Google\Cloud\Video\Stitcher\V1\GetLiveSessionRequest;  /**  * Gets a live session.  *  * @param string $callingProjectId     The project ID to run the API call under  * @param string $location             The location of the session  * @param string $sessionId            The ID of the session  */ function get_live_session(     string $callingProjectId,     string $location,     string $sessionId ): void {     // Instantiate a client.     $stitcherClient = new VideoStitcherServiceClient();      $formattedName = $stitcherClient->liveSessionName($callingProjectId, $location, $sessionId);     $request = (new GetLiveSessionRequest())         ->setName($formattedName);     $session = $stitcherClient->getLiveSession($request);      // Print results     printf('Live session: %s' . PHP_EOL, $session->getName()); }

Python

在试用此示例之前,请按照《Video Stitcher API 快速入门:使用客户端库》中的 Python 设置说明进行操作。 如需了解详情,请参阅 Video Stitcher API Python API 参考文档

如需向 Video Stitcher API 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证

 import argparse  from google.cloud.video import stitcher_v1 from google.cloud.video.stitcher_v1.services.video_stitcher_service import (     VideoStitcherServiceClient, )   def get_live_session(     project_id: str, location: str, session_id: str ) -> stitcher_v1.types.LiveSession:     """Gets a live session. Live sessions are ephemeral resources that expire     after a few minutes.     Args:         project_id: The GCP project ID.         location: The location of the session.         session_id: The ID of the live session.      Returns:         The live session resource.     """      client = VideoStitcherServiceClient()      name = client.live_session_path(project_id, location, session_id)     response = client.get_live_session(name=name)     print(f"Live session: {response.name}")     return response  

Ruby

在试用此示例之前,请按照《Video Stitcher API 快速入门:使用客户端库》中的 Ruby 设置说明进行操作。 如需了解详情,请参阅 Video Stitcher API Ruby API 参考文档

如需向 Video Stitcher API 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证

require "google/cloud/video/stitcher"  ## # Get a live session. Live sessions are ephemeral resources # that expire after a few minutes. # # @param project_id [String] Your Google Cloud project (e.g. `my-project`) # @param location [String] The location (e.g. `us-central1`) # @param session_id [String] The live session ID (e.g. `my-live-session-id`) # def get_live_session project_id:, location:, session_id:   # Create a Video Stitcher client.   client = Google::Cloud::Video::Stitcher.video_stitcher_service    # Build the resource name of the live session.   name = client.live_session_path project: project_id, location: location,                                   live_session: session_id    # Get the live session.   session = client.get_live_session name: name    # Print the live session name.   puts "Live session: #{session.name}" end

示例插播广告的播放列表

以下示例展示了广告拼接之前的源直播播放列表:

#EXTM3U #EXT-X-TARGETDURATION:10 #EXT-X-VERSION:4 #EXT-X-MEDIA-SEQUENCE:5 #EXTINF:10.010 segment_00005.ts #EXTINF:10.010 segment_00006.ts #EXT-X-DATERANGE:ID="2415919105",START-DATE="2021-06-22T08:32:00Z",DURATION=60,SCTE35-OUT=0xF... #EXTINF:10.010 segment_00007.ts #EXTINF:10.010 segment_00008.ts #EXT-X-DATERANGE:ID="2415919105",START-DATE="2021-06-22T08:39:20Z",SCTE35-IN=0xF... #EXTINF:10.010 segment_00009.ts 

以下示例展示了广告拼接后的源直播播放列表:

#EXTM3U #EXT-X-TARGETDURATION:10 #EXT-X-VERSION:4 #EXT-X-MEDIA-SEQUENCE:5 #EXTINF:10.010 segment_00005.ts #EXTINF:10.010 segment_00006.ts #EXT-X-DISCONTINUITY #EXTINF:6.000 https://ads.us-west1.cdn.videostitcher.goog/ad-1/seg-1.ts #EXTINF:5.000 https://ads.us-west1.cdn.videostitcher.goog/ad-1/seg-2.ts #EXT-X-DISCONTINUITY #EXTINF:6.000 https://ads.us-west1.cdn.videostitcher.goog/ad-2/seg-1.ts #EXTINF:5.000 https://ads.us-west1.cdn.videostitcher.goog/ad-2/seg-2.ts #EXT-X-DISCONTINUITY #EXTINF:10.010 segment_00009.ts 

处理客户端广告跟踪

启用客户端广告跟踪后,播放器负责触发广告跟踪事件。Video Stitcher API 提供的广告元数据包括广告跟踪和随播广告信息。Video Stitcher API 会从广告代码响应中解析此信息。

从清单中获取 HLS 广告元数据 URI

在 HLS 媒体文件清单中,AdMetadataURI 编码在 #EXT-X-DATERANGE 标记的 X-VAST-META 属性中。#EXT-X-DATERANGE 标记位于每个广告的第一个拼接片段之前。

以下是一个 HLS 定时元数据标记示例:

#EXT-X-DATERANGE:ID="id123",START-DATE=2014-03-05T11:15:00Z,DURATION=15,X-VAST-META="eyJBZE1ldGFkYXRhVXJpIjogImh0dHBzOi8vZXhhbXBsZS5jb20vdjFhbHBoYS9wcm9qZWN0cy8xMjMvbG9jYXRpb25zL3VzLWNlbnRyYWwxL2xpdmVTZXNzaW9ucy9hYmMzMjEvYWRNZXRhZGF0YS9pZDEyMyJ9" 

X-VAST-META 属性的值是 base64 编码的 JSON 字符串。解码后,您可以从 JSON 中提取 AdMetadataURI

以下示例展示了解码后的 X-VAST-META

{   "AdMetadataUri": "https://example.com/v1/projects/123/locations/us-central1/liveSessions/abc321/adMetadata/id123" } 

从清单中获取 DASH 广告元数据 URI

在 DASH 清单中,每个拼接的广告时段都包含一个 VAST 广告,并且其广告元数据 URI 可以从 EventStream 标记中提取。AdMetadataURI 编码在 Event 元素的 messageData 属性中。Event 是标记 EventStream 内的元素,其 schemeIdUriurn:videostitcher:admetadata:202008

以下是 DASH 事件流标记的示例:

<EventStream schemeIdUri="urn:videostitcher:admetadata:202008" timescale="1000">   <Event duration="5000" messageData="eyJBZE1ldGFkYXRhVXJpIjogImh0dHBzOi8vZXhhbXBsZS5jb20vdjFhbHBoYS9wcm9qZWN0cy8xMjMvbG9jYXRpb25zL3VzLWNlbnRyYWwxL2xpdmVTZXNzaW9ucy9hYmMzMjEvYWRNZXRhZGF0YS9pZDEyMyJ9"></Event> </EventStream> 

使用 base64 将 messageData 解码为 JSON。

以下示例展示了解码后的 messageData

{   "AdMetadataUri": "https://example.com/v1/projects/123/locations/us-central1/liveSessions/abc321/adMetadata/id123" } 

检索和处理广告跟踪事件

获取 AdMetadataURI 后,您可以提取广告元数据。

以下示例展示了广告元数据:

{   "activityEvents": [     {       "type": "PAUSE",       "uri": "https://example.com/pause"     }   ],   "progressiveEvents": [     {       "timeOffset": "0s",       "events": [         {           "type": "IMPRESSION",           "uri": "https://example.com/impression"         },         {           "type": "START",           "uri": "https://example.com/start"         }       ]     },     {       "timeOffset": "2.500s",       "events": [         {           "type": "FIRST_QUARTILE",           "uri": "https://example.com/firstquartile"         }       ]     }   ],   "adDuration": "10s" } 

在上述示例中,客户端应执行以下操作:

  • 在广告视频开始时请求 https://example.com/start
  • 在广告视频开始时请求 https://example.com/impression
  • 每当观看者暂停广告视频时,都发送 https://example.com/pause 请求
  • 在广告视频播放 2.5 秒后请求 https://example.com/firstQuartile

检查实时会话

本部分介绍了如何检查直播会话以及指定直播会话的广告代码详情。如需了解详情,请参阅 REST 文档

Video Stitcher API 会向直播会话请求正文中广告代码中指定的广告提供方发送请求。这些请求的请求和响应元数据会保存 14 天,并且可以通过检查实时会话来查看。

Video Stitcher API 使用以下信息构成广告代码详细信息:

  • 指定广告插播时间点中请求的广告代码网址(或未指定时的默认广告代码)
  • 直播会话请求中配置的广告代码宏
  • 其他用户元数据

此信息以及响应的正文和元数据可帮助您深入了解 Video Stitcher API 的行为。

列出广告代码详情

如需列出直播会话的广告代码详细信息,请使用 projects.locations.liveSessions.liveAdTagDetails.list 方法。

请看以下针对之前创建的直播会话的响应(省略了一些字段):

{   "name": "projects/PROJECT_NUMBER/locations/LOCATION/liveSessions/SESSION_ID",   ... }

REST

在使用任何请求数据之前,请先进行以下替换:

  • PROJECT_NUMBERIAM 设置页面上项目编号字段中显示的 Google Cloud 项目编号
  • LOCATION:会话的位置;请使用某个受支持的地区
    显示位置
    • us-central1
    • us-east1
    • us-west1
    • asia-east1
    • asia-south1
    • asia-southeast1
    • europe-west1
    • southamerica-east1
  • SESSION_ID:直播会话的标识符

如需发送您的请求,请展开以下选项之一:

您应该收到类似以下内容的 JSON 响应:

 {   "liveAdTagDetails" : [     {       "name": "projects/PROJECT_NUMBER/locations/LOCATION/liveSessions/SESSION_ID/liveAdTagDetails/LIVE_AD_TAG_DETAILS_ID",       "adRequests": [         {           "uri": "REQUEST_URL",           "requestMetadata": "AD_TAG_REQUEST_METADATA",           "responseMetadata": "AD_TAG_RESPONSE_METADATA"         }       ]     }   ] } 

复制返回的 LIVE_AD_TAG_DETAILS_ID。您需要使用此方法来获取单个广告代码的详细信息。

C#

在试用此示例之前,请按照《Video Stitcher API 快速入门:使用客户端库》中的 C# 设置说明进行操作。 如需了解详情,请参阅 Video Stitcher API C# API 参考文档

如需向 Video Stitcher API 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证

 using Google.Api.Gax; using Google.Cloud.Video.Stitcher.V1; using System;  public class ListLiveAdTagDetailsSample {     public PagedEnumerable<ListLiveAdTagDetailsResponse, LiveAdTagDetail> ListLiveAdTagDetails(         string projectId, string regionId, string sessionId)     {         // Create the client.         VideoStitcherServiceClient client = VideoStitcherServiceClient.Create();          ListLiveAdTagDetailsRequest request = new ListLiveAdTagDetailsRequest         {             ParentAsLiveSessionName = LiveSessionName.FromProjectLocationLiveSession(projectId, regionId, sessionId)         };          // Make the request.         PagedEnumerable<ListLiveAdTagDetailsResponse, LiveAdTagDetail> response = client.ListLiveAdTagDetails(request);         foreach (LiveAdTagDetail liveAdTagDetail in response)         {             Console.WriteLine($"{liveAdTagDetail.Name}");         }          // Return the result.         return response;     } } 

Go

在试用此示例之前,请按照《Video Stitcher API 快速入门:使用客户端库》中的 Go 设置说明进行操作。 如需了解详情,请参阅 Video Stitcher API Go API 参考文档

如需向 Video Stitcher API 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证

import ( 	"context" 	"fmt" 	"io"  	stitcher "cloud.google.com/go/video/stitcher/apiv1" 	stitcherstreampb "cloud.google.com/go/video/stitcher/apiv1/stitcherpb" 	"google.golang.org/api/iterator" )  // listLiveAdTagDetails lists the ad tag details for the specified live session. func listLiveAdTagDetails(w io.Writer, projectID, sessionID string) error { 	// projectID := "my-project-id" 	// sessionID := "my-session-id" 	location := "us-central1" 	ctx := context.Background() 	client, err := stitcher.NewVideoStitcherClient(ctx) 	if err != nil { 		return fmt.Errorf("stitcher.NewVideoStitcherClient: %w", err) 	} 	defer client.Close()  	req := &stitcherstreampb.ListLiveAdTagDetailsRequest{ 		Parent: fmt.Sprintf("projects/%s/locations/%s/liveSessions/%s", projectID, location, sessionID), 	}  	it := client.ListLiveAdTagDetails(ctx, req) 	fmt.Fprintln(w, "Live ad tag details:") 	for { 		response, err := it.Next() 		if err == iterator.Done { 			break 		} 		if err != nil { 			return fmt.Errorf("it.Next(): %w", err) 		} 		fmt.Fprintln(w, response.GetName()) 	} 	return nil } 

Java

在试用此示例之前,请按照《Video Stitcher API 快速入门:使用客户端库》中的 Java 设置说明进行操作。 如需了解详情,请参阅 Video Stitcher API Java API 参考文档

如需向 Video Stitcher API 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证

 import com.google.cloud.video.stitcher.v1.ListLiveAdTagDetailsRequest; import com.google.cloud.video.stitcher.v1.LiveAdTagDetail; import com.google.cloud.video.stitcher.v1.LiveSessionName; import com.google.cloud.video.stitcher.v1.VideoStitcherServiceClient; import com.google.cloud.video.stitcher.v1.VideoStitcherServiceClient.ListLiveAdTagDetailsPagedResponse; import java.io.IOException;  public class ListLiveAdTagDetails {    public static void main(String[] args) throws Exception {     // TODO(developer): Replace these variables before running the sample.     String projectId = "my-project-id";     String location = "us-central1";     String sessionId = "my-session-id";      listLiveAdTagDetails(projectId, location, sessionId);   }    // Lists the live ad tag details for a given live session.   public static ListLiveAdTagDetailsPagedResponse listLiveAdTagDetails(       String projectId, String location, String sessionId) throws IOException {     // Initialize client that will be used to send requests. This client only needs to be created     // once, and can be reused for multiple requests.     try (VideoStitcherServiceClient videoStitcherServiceClient =         VideoStitcherServiceClient.create()) {       ListLiveAdTagDetailsRequest listLiveAdTagDetailsRequest =           ListLiveAdTagDetailsRequest.newBuilder()               .setParent(LiveSessionName.of(projectId, location, sessionId).toString())               .build();        VideoStitcherServiceClient.ListLiveAdTagDetailsPagedResponse response =           videoStitcherServiceClient.listLiveAdTagDetails(listLiveAdTagDetailsRequest);        System.out.println("Live ad tag details:");       for (LiveAdTagDetail adTagDetail : response.iterateAll()) {         System.out.println(adTagDetail.toString());       }       return response;     }   } }

Node.js

在试用此示例之前,请按照《Video Stitcher API 快速入门:使用客户端库》中的 Node.js 设置说明进行操作。 如需了解详情,请参阅 Video Stitcher API Node.js API 参考文档

如需向 Video Stitcher API 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证

/**  * TODO(developer): Uncomment these variables before running the sample.  */ // projectId = 'my-project-id'; // location = 'us-central1'; // sessionId = 'my-session-id';  // Imports the Video Stitcher library const {VideoStitcherServiceClient} =   require('@google-cloud/video-stitcher').v1; // Instantiates a client const stitcherClient = new VideoStitcherServiceClient();  async function listLiveAdTagDetails() {   // Construct request   const request = {     parent: stitcherClient.liveSessionPath(projectId, location, sessionId),   };   const iterable = await stitcherClient.listLiveAdTagDetailsAsync(request);   console.log('Live ad tag details:');   for await (const response of iterable) {     console.log(response.name);   } }  listLiveAdTagDetails().catch(err => {   console.error(err.message);   process.exitCode = 1; });

PHP

在试用此示例之前,请按照《Video Stitcher API 快速入门:使用客户端库》中的 PHP 设置说明进行操作。 如需了解详情,请参阅 Video Stitcher API PHP API 参考文档

如需向 Video Stitcher API 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证

use Google\Cloud\Video\Stitcher\V1\Client\VideoStitcherServiceClient; use Google\Cloud\Video\Stitcher\V1\ListLiveAdTagDetailsRequest;  /**  * Lists the ad tag details for the specified live session.  *  * @param string $callingProjectId     The project ID to run the API call under  * @param string $location             The location of the session  * @param string $sessionId            The ID of the session  */ function list_live_ad_tag_details(     string $callingProjectId,     string $location,     string $sessionId ): void {     // Instantiate a client.     $stitcherClient = new VideoStitcherServiceClient();      $formattedName = $stitcherClient->liveSessionName($callingProjectId, $location, $sessionId);     $request = (new ListLiveAdTagDetailsRequest())         ->setParent($formattedName);     $response = $stitcherClient->listLiveAdTagDetails($request);      // Print the ad tag details list.     $adTagDetails = $response->iterateAllElements();     print('Live ad tag details:' . PHP_EOL);     foreach ($adTagDetails as $adTagDetail) {         printf('%s' . PHP_EOL, $adTagDetail->getName());     } }

Python

在试用此示例之前,请按照《Video Stitcher API 快速入门:使用客户端库》中的 Python 设置说明进行操作。 如需了解详情,请参阅 Video Stitcher API Python API 参考文档

如需向 Video Stitcher API 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证

 import argparse  from google.cloud.video.stitcher_v1.services.video_stitcher_service import (     pagers,     VideoStitcherServiceClient, )   def list_live_ad_tag_details(     project_id: str, location: str, session_id: str ) -> pagers.ListLiveAdTagDetailsPager:     """Lists the ad tag details for the specified live session.     Args:         project_id: The GCP project ID.         location: The location of the session.         session_id: The ID of the live session.      Returns:         An iterable object containing live ad tag details resources.     """      client = VideoStitcherServiceClient()      parent = client.live_session_path(project_id, location, session_id)     page_result = client.list_live_ad_tag_details(parent=parent)     print("Live ad tag details:")     for response in page_result:         print(response)      return page_result  

Ruby

在试用此示例之前,请按照《Video Stitcher API 快速入门:使用客户端库》中的 Ruby 设置说明进行操作。 如需了解详情,请参阅 Video Stitcher API Ruby API 参考文档

如需向 Video Stitcher API 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证

require "google/cloud/video/stitcher"  ## # List the ad tag details for a live session # # @param project_id [String] Your Google Cloud project (e.g. `my-project`) # @param location [String] The location (e.g. `us-central1`) # @param session_id [String] The live session ID (e.g. `my-live-session-id`) # def list_live_ad_tag_details project_id:, location:, session_id:   # Create a Video Stitcher client.   client = Google::Cloud::Video::Stitcher.video_stitcher_service    # Build the resource name of the parent.   parent = client.live_session_path project: project_id, location: location,                                     live_session: session_id    # List all ad tag details for the live session.   response = client.list_live_ad_tag_details parent: parent    puts "Live ad tag details:"   # Print out all live ad tag details.   response.each do |live_ad_tag_detail|     puts live_ad_tag_detail.name   end end

获取广告代码详情

如需获取直播会话中单个广告代码的详细信息,请使用 projects.locations.liveSessions.liveAdTagDetails.get 方法。

以下示例演示了如何使用之前请求返回的广告代码详情名称来查看直播会话的单个广告代码详情:

REST

在使用任何请求数据之前,请先进行以下替换:

  • PROJECT_NUMBERIAM 设置页面上项目编号字段中显示的 Google Cloud 项目编号
  • LOCATION:会话的位置;请使用某个受支持的地区
    显示位置
    • us-central1
    • us-east1
    • us-west1
    • asia-east1
    • asia-south1
    • asia-southeast1
    • europe-west1
    • southamerica-east1
  • SESSION_ID:直播会话的标识符
  • LIVE_AD_TAG_DETAILS_ID:直播广告代码详细信息的 ID

如需发送您的请求,请展开以下选项之一:

您应该收到类似以下内容的 JSON 响应:

 {   "name": "projects/PROJECT_NUMBER/locations/LOCATION/liveSessions/SESSION_ID/liveAdTagDetails/LIVE_AD_TAG_DETAILS_ID",   "adRequests": [     {       "uri": "REQUEST_URL",       "requestMetadata": "AD_TAG_REQUEST_METADATA",       "responseMetadata": "AD_TAG_RESPONSE_METADATA"     }   ] } 

C#

在试用此示例之前,请按照《Video Stitcher API 快速入门:使用客户端库》中的 C# 设置说明进行操作。 如需了解详情,请参阅 Video Stitcher API C# API 参考文档

如需向 Video Stitcher API 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证

 using Google.Cloud.Video.Stitcher.V1;  public class GetLiveAdTagDetailSample {     public LiveAdTagDetail GetLiveAdTagDetail(         string projectId, string location, string sessionId, string adTagDetailId)     {         // Create the client.         VideoStitcherServiceClient client = VideoStitcherServiceClient.Create();          GetLiveAdTagDetailRequest request = new GetLiveAdTagDetailRequest         {             LiveAdTagDetailName = LiveAdTagDetailName.FromProjectLocationLiveSessionLiveAdTagDetail(projectId, location, sessionId, adTagDetailId)         };          // Call the API.         LiveAdTagDetail liveAdTagDetail = client.GetLiveAdTagDetail(request);          // Return the result.         return liveAdTagDetail;     } } 

Go

在试用此示例之前,请按照《Video Stitcher API 快速入门:使用客户端库》中的 Go 设置说明进行操作。 如需了解详情,请参阅 Video Stitcher API Go API 参考文档

如需向 Video Stitcher API 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证

import ( 	"context" 	"encoding/json" 	"fmt" 	"io"  	stitcher "cloud.google.com/go/video/stitcher/apiv1" 	stitcherstreampb "cloud.google.com/go/video/stitcher/apiv1/stitcherpb" )  // getLiveAdTagDetail gets the specified ad tag detail for a live session. func getLiveAdTagDetail(w io.Writer, projectID, sessionID, adTagDetailID string) error { 	// projectID := "my-project-id" 	// sessionID := "my-session-id" 	// adTagDetailID := "my-ad-tag-detail-id" 	location := "us-central1" 	ctx := context.Background() 	client, err := stitcher.NewVideoStitcherClient(ctx) 	if err != nil { 		return fmt.Errorf("stitcher.NewVideoStitcherClient: %w", err) 	} 	defer client.Close()  	req := &stitcherstreampb.GetLiveAdTagDetailRequest{ 		Name: fmt.Sprintf("projects/%s/locations/%s/liveSessions/%s/liveAdTagDetails/%s", projectID, location, sessionID, adTagDetailID), 	} 	// Gets the ad tag detail. 	response, err := client.GetLiveAdTagDetail(ctx, req) 	if err != nil { 		return fmt.Errorf("client.GetLiveAdTagDetail: %w", err) 	} 	b, err := json.MarshalIndent(response, "", " ") 	if err != nil { 		return fmt.Errorf("json.MarshalIndent: %w", err) 	} 	fmt.Fprintf(w, "Live ad tag detail:\n%v", string(b)) 	return nil } 

Java

在试用此示例之前,请按照《Video Stitcher API 快速入门:使用客户端库》中的 Java 设置说明进行操作。 如需了解详情,请参阅 Video Stitcher API Java API 参考文档

如需向 Video Stitcher API 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证

 import com.google.cloud.video.stitcher.v1.GetLiveAdTagDetailRequest; import com.google.cloud.video.stitcher.v1.LiveAdTagDetail; import com.google.cloud.video.stitcher.v1.LiveAdTagDetailName; import com.google.cloud.video.stitcher.v1.VideoStitcherServiceClient; import java.io.IOException;  public class GetLiveAdTagDetail {    public static void main(String[] args) throws Exception {     // TODO(developer): Replace these variables before running the sample.     String projectId = "my-project-id";     String location = "us-central1";     String sessionId = "my-session-id";     String adTagDetailId = "my-ad-tag-detail-id";      getLiveAdTagDetail(projectId, location, sessionId, adTagDetailId);   }    // Gets a live ad tag detail in a live session.   public static LiveAdTagDetail getLiveAdTagDetail(       String projectId, String location, String sessionId, String adTagDetailId)       throws IOException {     // Initialize client that will be used to send requests. This client only needs to be created     // once, and can be reused for multiple requests.     try (VideoStitcherServiceClient videoStitcherServiceClient =         VideoStitcherServiceClient.create()) {       GetLiveAdTagDetailRequest getLiveAdTagDetailRequest =           GetLiveAdTagDetailRequest.newBuilder()               .setName(                   LiveAdTagDetailName.of(projectId, location, sessionId, adTagDetailId).toString())               .build();        LiveAdTagDetail response =           videoStitcherServiceClient.getLiveAdTagDetail(getLiveAdTagDetailRequest);       System.out.println("Live ad tag detail: " + response.getName());       return response;     }   } }

Node.js

在试用此示例之前,请按照《Video Stitcher API 快速入门:使用客户端库》中的 Node.js 设置说明进行操作。 如需了解详情,请参阅 Video Stitcher API Node.js API 参考文档

如需向 Video Stitcher API 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证

/**  * TODO(developer): Uncomment these variables before running the sample.  */ // projectId = 'my-project-id'; // location = 'us-central1'; // sessionId = 'my-session-id'; // adTagDetailId = 'my-ad-tag-detail-id';  // Imports the Video Stitcher library const {VideoStitcherServiceClient} =   require('@google-cloud/video-stitcher').v1; // Instantiates a client const stitcherClient = new VideoStitcherServiceClient();  async function getLiveAdTagDetail() {   // Construct request   const request = {     name: stitcherClient.liveAdTagDetailPath(       projectId,       location,       sessionId,       adTagDetailId     ),   };   const [adTagDetail] = await stitcherClient.getLiveAdTagDetail(request);   console.log(`Live ad tag detail: ${adTagDetail.name}`); }  getLiveAdTagDetail().catch(err => {   console.error(err.message);   process.exitCode = 1; });

PHP

在试用此示例之前,请按照《Video Stitcher API 快速入门:使用客户端库》中的 PHP 设置说明进行操作。 如需了解详情,请参阅 Video Stitcher API PHP API 参考文档

如需向 Video Stitcher API 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证

use Google\Cloud\Video\Stitcher\V1\Client\VideoStitcherServiceClient; use Google\Cloud\Video\Stitcher\V1\GetLiveAdTagDetailRequest;  /**  * Gets the specified ad tag detail for the live session.  *  * @param string $callingProjectId     The project ID to run the API call under  * @param string $location             The location of the session  * @param string $sessionId            The ID of the session  * @param string $adTagDetailId        The ID of the ad tag detail  */ function get_live_ad_tag_detail(     string $callingProjectId,     string $location,     string $sessionId,     string $adTagDetailId ): void {     // Instantiate a client.     $stitcherClient = new VideoStitcherServiceClient();      $formattedName = $stitcherClient->liveAdTagDetailName($callingProjectId, $location, $sessionId, $adTagDetailId);     $request = (new GetLiveAdTagDetailRequest())         ->setName($formattedName);     $adTagDetail = $stitcherClient->getLiveAdTagDetail($request);      // Print results     printf('Live ad tag detail: %s' . PHP_EOL, $adTagDetail->getName()); }

Python

在试用此示例之前,请按照《Video Stitcher API 快速入门:使用客户端库》中的 Python 设置说明进行操作。 如需了解详情,请参阅 Video Stitcher API Python API 参考文档

如需向 Video Stitcher API 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证

 import argparse  from google.cloud.video import stitcher_v1 from google.cloud.video.stitcher_v1.services.video_stitcher_service import (     VideoStitcherServiceClient, )   def get_live_ad_tag_detail(     project_id: str, location: str, session_id: str, ad_tag_detail_id: str ) -> stitcher_v1.types.LiveAdTagDetail:     """Gets the specified ad tag detail for a live session.     Args:         project_id: The GCP project ID.         location: The location of the session.         session_id: The ID of the live session.         ad_tag_detail_id: The ID of the ad tag details.      Returns:         The live ad tag detail resource.     """      client = VideoStitcherServiceClient()      name = client.live_ad_tag_detail_path(         project_id, location, session_id, ad_tag_detail_id     )     response = client.get_live_ad_tag_detail(name=name)     print(f"Live ad tag detail: {response.name}")     return response  

Ruby

在试用此示例之前,请按照《Video Stitcher API 快速入门:使用客户端库》中的 Ruby 设置说明进行操作。 如需了解详情,请参阅 Video Stitcher API Ruby API 参考文档

如需向 Video Stitcher API 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证

require "google/cloud/video/stitcher"  ## # Get the specified ad tag detail for a live session # # @param project_id [String] Your Google Cloud project (e.g. `my-project`) # @param location [String] The location (e.g. `us-central1`) # @param session_id [String] The live session ID (e.g. `my-live-session-id`) # @param ad_tag_detail_id [String] The ad tag detail ID (e.g. `my-ad-tag-id`) # def get_live_ad_tag_detail project_id:, location:, session_id:,                            ad_tag_detail_id:   # Create a Video Stitcher client.   client = Google::Cloud::Video::Stitcher.video_stitcher_service    # Build the resource name of the live ad tag detail.   name = client.live_ad_tag_detail_path project: project_id, location: location,                                         live_session: session_id,                                         live_ad_tag_detail: ad_tag_detail_id    # Get the live ad tag detail.   ad_tag_detail = client.get_live_ad_tag_detail name: name    # Print the live ad tag detail name.   puts "Live ad tag detail: #{ad_tag_detail.name}" end