Chọn giải pháp DAI mà bạn quan tâm
Phân phát nhóm DAI
SDK IMA giúp đơn giản hoá việc tích hợp quảng cáo đa phương tiện vào trang web và ứng dụng của bạn.
SDK IMA có thể yêu cầu quảng cáo từ bất kỳ Tương thích với VAST máy chủ quảng cáo và quản lý việc phát lại quảng cáo trong ứng dụng của bạn.
Với SDK IMA DAI, ứng dụng tạo một yêu cầu truyền đối với video quảng cáo và nội dung cho video theo yêu cầu hoặc nội dung phát trực tiếp. Sau đó, SDK sẽ trả về một luồng video kết hợp để bạn không phải quản lý việc chuyển đổi giữa quảng cáo và video nội dung trong ứng dụng.
Hướng dẫn này minh hoạ cách phát luồng Phân phát nhóm DAI bằng cách sử dụng SDK DAI IMA cho CAF.
Trước khi sử dụng hướng dẫn này, hãy làm quen với Bộ thu phát trên web của Khung ứng dụng Chromecast giao thức. Hướng dẫn này giả định rằng bạn đã có kiến thức cơ bản về các khái niệm của bộ nhận CAF, chẳng hạn như trình chặn tin nhắn và mediaInformation về đồ vật và quen với việc sử dụng công cụ Cast Command và Control, để mô phỏng một người gửi CAF.
Để sử dụng tính năng phân phát nhóm IMA DAI, bạn phải làm việc với đối tác phân phát nhóm và phải có Ad Manager 360 nâng cao tài khoản. Nếu bạn có tài khoản Ad Manager, hãy liên hệ với người quản lý tài khoản để biết thêm thông tin. Để biết thông tin về cách đăng ký Ad Manager, hãy truy cập vào Trung tâm trợ giúp Ad Manager.
Để biết thông tin về cách tích hợp với các nền tảng khác hoặc cách sử dụng SDK phía máy khách IMA, hãy xem bài viết SDK quảng cáo trên phương tiện truyền thông tương tác.
Tổng quan về việc phân phát nhóm IMA DAI
Việc triển khai tính năng phân phát nhóm bằng SDK IMA CAF DAI bao gồm hai thành phần chính, được minh hoạ trong hướng dẫn này:
StreamRequest
: Một đối tượng xác định yêu cầu truyền trực tuyến đến máy chủ quảng cáo của Google. Yêu cầu chỉ định Mã mạng, Khoá thành phần tuỳ chỉnh và khoá API không bắt buộc, cũng như các tham số không bắt buộc khác.StreamManager
: Một đối tượng xử lý hoạt động giao tiếp giữa luồng video và SDK IMA DAI, chẳng hạn như kích hoạt ping theo dõi và chuyển tiếp sự kiện luồng đến nhà xuất bản.
Điều kiện tiên quyết
- Tài khoản Cast Developer Console có các thiết bị thử nghiệm đã đăng ký.
- Ứng dụng trình thu web được lưu trữ đã đăng ký với Bảng điều khiển dành cho nhà phát triển của Cast và có thể được sửa đổi để lưu trữ mã do hướng dẫn này cung cấp.
- Một ứng dụng gửi được định cấu hình để dùng ứng dụng nhận web. Đối với mục đích của ví dụ này, hãy sử dụng Lệnh truyền và Điều khiển làm người gửi.
Định cấu hình đối tượng MediaInfo của người gửi
Trước tiên, hãy định cấu hình đối tượng MediaInfo
của ứng dụng gửi để bao gồm các trường sau:
Trường | Nội dung | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
contentId
|
Giá trị nhận dạng duy nhất của mục nội dung đa phương tiện này.
CONTENT_ID |
||||||||||
contentUrl
|
Không bắt buộc. URL luồng dự phòng sẽ phát nếu luồng DAI không tải được.
BACKUP_STREAM_URL |
||||||||||
contentType
|
Không bắt buộc. Mimetype của luồng sao lưu nội dung. Chỉ cần thiết cho DASH
.
CONTENT_STREAM_MIMETYPE |
||||||||||
streamType
|
Hằng số hoặc giá trị cố định kiểu chuỗi được dùng cho giá trị này sẽ khác nhau tuỳ theo người gửi chủ. | ||||||||||
customData
|
Trường customData chứa một kho khoá-giá trị của các trường bắt buộc bổ sung. Trong mẫu này, tệp này chứa các thông số luồng DAI. Trong ứng dụng chính thức, bạn có thể truyền một giá trị nhận dạng mà ứng dụng nhận truyền sẽ sử dụng để truy xuất các tham số này bằng một yêu cầu phía máy chủ.
|
Dưới đây là một số mã mẫu để giúp bạn bắt đầu:
Web
Để định cấu hình các giá trị này trong trình gửi web Cast, trước tiên, hãy tạo một đối tượng MediaInfo
bằng dữ liệu bắt buộc, sau đó tạo một yêu cầu tải đến trình nhận web.
// Create mediaInfo object
const mediaInfo = new chrome.cast.media.MediaInfo("CONTENT_ID");
mediaInfo.contentUrl = "BACKUP_STREAM_URL";
mediaInfo.contentType = "CONTENT_STREAM_MIMETYPE";
mediaInfo.streamType = chrome.cast.media.StreamType.LIVE;
mediaInfo.customData = {
daiStreamType: "DAI_STREAM_TYPE",
networkCode: "NETWORK-CODE",
customAssetKey: "CUSTOM_ASSET_KEY",
apiKey: "API_KEY"
};
// Make load request to cast web receiver
const castSession = cast.framework.CastContext.getInstance().getCurrentSession();
const request = new chrome.cast.media.LoadRequest(mediaInfo);
castSession.loadMedia(request).then(
() => { console.log('Load succeed'); },
(errorCode) => { console.log('Error code: ' + errorCode); });
Android
Để định cấu hình các giá trị này trong trình gửi web Cast, trước tiên, hãy tạo một đối tượng MediaInfo bằng dữ liệu bắt buộc, sau đó tạo một yêu cầu tải đến trình nhận web.
JSONObject customData = new JSONObject()?
.put("daiStreamType", "DAI_STREAM_TYPE")
.put("networkCode", "NETWORK-CODE")
.put("customAssetKey", "CUSTOM_ASSET_KEY")
.put("apiKey", "API_KEY");
MediaInfo mediaInfo = MediaInfo.Builder("CONTENT_ID")
.setContentUrl("BACKUP_STREAM_URL")
.setContentType("CONTENT_STREAM_MIMETYPE")
.setStreamType(MediaInfo.STREAM_TYPE_LIVE)
.setCustomData(customData)
.build();
RemoteMediaClient remoteMediaClient = mCastSession.getRemoteMediaClient();
remoteMediaClient.load(new MediaLoadRequestData.Builder().setMediaInfo(mediaInfo).build());
iOS (Obj-C)
Để định cấu hình các giá trị này trong trình gửi web Cast, trước tiên, hãy tạo một đối tượng GCKMediaInformation
bằng dữ liệu bắt buộc, sau đó tạo một yêu cầu tải đến trình nhận web.
NSURL url = [NSURL URLWithString:@"BACKUP_STREAM_URL"];
NSDictionary *customData = @{
@"daiStreamType": @"DAI_STREAM_TYPE",
@"networkCode": @"NETWORK-CODE",
@"customAssetKey": @"CUSTOM_ASSET_KEY",
@"apiKey": @"API_KEY"};
mediaInfoBuilder.customData = customData;
GCKMediaInformationBuilder *mediaInfoBuilder =
[[GCKMediaInformationBuilder alloc] initWithContentID: @"CONTENT_ID"];
mediaInfoBuilder.contentURL = url;
mediaInfoBuilder.contentType = @"CONTENT_STREAM_MIMETYPE";
mediaInfoBuilder.streamType = GCKMediaStreamTypeLive;
mediaInfoBuilder.customData = customData;
self.mediaInformation = [mediaInfoBuilder build];
GCKRequest *request = [self.sessionManager.currentSession.remoteMediaClient loadMedia:self.mediaInformation];
if (request != nil) {
request.delegate = self;
}
iOS (Swift)
Để định cấu hình các giá trị này trong trình gửi web Cast, trước tiên, hãy tạo một đối tượng GCKMediaInformation
bằng dữ liệu bắt buộc, sau đó tạo một yêu cầu tải đến trình nhận web.
let url = URL.init(string: "BACKUP_STREAM_URL")
guard let mediaURL = url else {
print("invalid mediaURL")
return
}
let customData = [
"daiStreamType": "DAI_STREAM_TYPE",
"networkCode": "NETWORK-CODE",
"customAssetKey": "CUSTOM_ASSET_KEY",
"region": "API_KEY"
]
let mediaInfoBuilder = GCKMediaInformationBuilder.init(contentId: "CONTENT_ID")
mediaInfoBuilder.contentURL = mediaUrl
mediaInfoBuilder.contentType = @"CONTENT_STREAM_MIMETYPE"
mediaInfoBuilder.streamType = GCKMediaStreamType.Live
mediaInfoBuilder.customData = customData
mediaInformation = mediaInfoBuilder.build()
guard let mediaInfo = mediaInformation else {
print("invalid mediaInformation")
return
}
if let request = sessionManager.currentSession?.remoteMediaClient?.loadMedia
(mediaInfo) {
request.delegate = self
}
Công cụ CAC
Để định cấu hình các giá trị này trong Lệnh truyền và Bảng điều khiển , hãy nhấp vào tab Load Media (Tải phương tiện) rồi đặt loại yêu cầu tải tuỳ chỉnh thành TẢI. Sau đó, thay thế dữ liệu JSON trong vùng văn bản bằng JSON sau:
{
"media": {
"contentId": "CONTENT_ID",
"contentUrl": "BACKUP_STREAM_URL",
"contentType": ""CONTENT_STREAM_MIMETYPE"",
"streamType": "LIVE",
"customData": {
"daiStreamType": "DAI_STREAM_TYPE",
"networkCode": "NETWORK-CODE",
"customAssetKey": "CUSTOM_ASSET_KEY",
"oAuthToken": "API_KEY"
}
}
}
Bạn có thể gửi yêu cầu tải tuỳ chỉnh này đến trình nhận để kiểm thử các bước còn lại.
Tạo trình thu nhận CAF cơ bản
Tạo trình thu phát web tuỳ chỉnh, như trong Hướng dẫn về trình thu phát web tuỳ chỉnh của SDK CAF.
Mã của bộ nhận sẽ có dạng như sau:
<html>
<head>
<script
src="//www.gstatic.com/cast/sdk/libs/caf_receiver/v3/cast_receiver_framework.js">
</script>
</head>
<body>
<cast-media-player></cast-media-player>
<script>
// ...
</script>
</body>
</html>
Nhập SDK IMA DAI và tải Trình quản lý trình phát
Thêm thẻ tập lệnh để nhập SDK IMA DAI cho CAF vào bộ thu web, ngay sau khi tập lệnh tải CAF. Trong thẻ tập lệnh, hãy lưu trữ ngữ cảnh nhận và trình quản lý trình phát dưới dạng hằng số trước khi khởi động receiver.
<html>
<head>
<script
src="//www.gstatic.com/cast/sdk/libs/caf_receiver/v3/cast_receiver_framework.js"></script>
<script src="//imasdk.googleapis.com/js/sdkloader/cast_dai.js"></script>
</head>
<body>
<cast-media-player></cast-media-player>
<script>
const castContext = cast.framework.CastReceiverContext.getInstance();
const playerManager = castContext.getPlayerManager();
castContext.start();
</script>
</body>
</html>
Khởi chạy Trình quản lý luồng IMA
Khởi chạy Trình quản lý luồng IMA.
<html>
<head>
<script type="text/javascript"
src="//www.gstatic.com/cast/sdk/libs/caf_receiver/v3/cast_receiver_framework.js"></script>
<script src="//imasdk.googleapis.com/js/sdkloader/cast_dai.js"></script>
</head>
<body>
<cast-media-player></cast-media-player>
<script>
const castContext = cast.framework.CastReceiverContext.getInstance();
const playerManager = castContext.getPlayerManager();
const streamManager = new google.ima.cast.dai.api.StreamManager();
castContext.start();
</script>
</body>
</html>
Tạo Trình chặn tải trong trình quản lý luồng
Trước khi các mục nội dung nghe nhìn được truyền đến CAF, hãy tạo yêu cầu truyền phát trong một trình chặn thông báo LOAD.
const castContext = cast.framework.CastReceiverContext.getInstance();
const playerManager = castContext.getPlayerManager();
const streamManager = new google.ima.cast.dai.api.StreamManager();
/**
* Creates a livestream request object for a pod serving stream.
* @param {!LoadRequestData} castRequest The request object from the cast sender
* @return {StreamRequest} an IMA stream request
*/
const createStreamRequest = (castRequest) => { /* ... */};
/**
* Initates a DAI stream request for the final stream manifest.
* @param {!LoadRequestData} castRequest The request object from the cast sender
* @return {Promise<LoadRequestData>} a promise that resolves to an updated castRequest, containing the DAI stream manifest
*/
const createDAICastRequest = (castRequest) => {
return streamManager.requestStream(castRequest, createStreamRequest(castRequest))
.then((castRequestWithPodStreamData) => {
console.log('Successfully made DAI stream request.');
// ...
return castRequestWithPodStreamData;
})
.catch((error) => {
console.log('Failed to make DAI stream request.');
// CAF will automatically fallback to the content URL
// that it can read from the castRequest object.
return castRequest;
});
};
playerManager.setMessageInterceptor(
cast.framework.messages.MessageType.LOAD, createDAICastRequest);
castContext.start();
Tạo yêu cầu luồng
Hoàn tất hàm createStreamRequest
để tạo luồng phân phát pod dựa trên yêu cầu tải CAF.
/**
* Creates a livestream request object for a pod serving stream.
* @param {!LoadRequestData} castRequest The request object from the cast sender
* @return {StreamRequest} an IMA stream request
*/
const createStreamRequest = (castRequest) => {
const customData = castRequest.media.customData;
let streamRequest;
if (customData.daiStreamType == "LIVE") {
streamRequest = new google.ima.cast.dai.api.PodStreamRequest();
streamRequest.customAssetKey = customData.customAssetKey;
streamRequest.networkCode = customData.networkCode;
streamRequest.apiKey = customData.apiKey;
} else if (customData.daiStreamType == "VOD") {
streamRequest = new google.ima.cast.dai.api.PodVodStreamRequest();
streamRequest.networkCode = customData.networkCode;
streamRequest.apiKey = customData.apiKey;
}
return streamRequest;
};
Truy xuất tệp kê khai đã ghép từ VTP
Nếu yêu cầu phát trực tuyến của bạn thành công, hãy sử dụng streamManager.getStreamId()
để
truy xuất mã của luồng. Đối tác công nghệ video (VTP) hoặc trình thao tác tệp kê khai tuỳ chỉnh sẽ cung cấp hướng dẫn để truy xuất URL tệp kê khai bằng mã luồng này.
Sau khi truy xuất URL tệp kê khai, hãy thay thế contentUrl
hiện có bằng manifestUrl
mới.
Cuối cùng, trước khi trả về tệp kê khai luồng đã sửa đổi, hãy gọi phương thức
loadStreamMetadata
trên
streamManager
để thông báo cho IMA SDK rằng SDK này có thể yêu cầu siêu dữ liệu luồng một cách an toàn. Cuộc gọi này là
chỉ cần thiết đối với luồng VOD.
/**
* Initates a DAI stream request for the final stream manifest.
* @param {!LoadRequestData} castRequest The request object from the cast sender
* @return {Promise<LoadRequestData>} a promise that resolves to an updated castRequest, containing the DAI stream manifest
*/
const createDAICastRequest = (castRequest) => {
return streamManager.requestStream(castRequest, createStreamRequest(castRequest))
.then((castRequestWithPodStreamData) => {
console.log('Successfully made DAI stream request.');
// This is a sample VTP integration. Consult your VTP documentation
// for how to retrieve an ad-stitched stream manifest URL.
const manifestTemplate = "https://.../manifest.m3u8?gam_stream_id=[[STREAMID]]";
const streamId = streamManager.getStreamId();
const manifestUrl = manifestTemplate.replace('[[STREAMID]]', streamId)
// Assign your manifestUrl to the request's content URL.
castRequestWithPodStreamData.media.contentUrl = manifestUrl;
// After generating the manifest URL, VOD streams must notify the
// IMA SDK that it is safe to request ad pod metadata.
// This is only necessary for VOD streams. It is a no-op for
// livestreams, so no conditional is needed.
streamManager.loadStreamMetadata();
return castRequestWithPodStreamData;
})
.catch((error) => {
console.log('Failed to make DAI stream request.');
// CAF will automatically fallback to the content URL
// that it can read from the castRequest object.
return castRequest;
});
};
Giờ đây, bạn có thể yêu cầu và phát lại luồng phân phát nhóm bằng Ứng dụng truyền Khung và SDK IMA DAI cho CAF.