Có thể sử dụng ExoPlayer để chèn quảng cáo ở cả phía máy khách và phía máy chủ.
Chèn quảng cáo phía máy khách
Trong tính năng chèn quảng cáo phía máy khách, trình phát chuyển đổi giữa việc tải nội dung nghe nhìn từ các URL khác nhau khi chuyển đổi giữa việc phát nội dung và quảng cáo. Lumen quảng cáo được tải riêng biệt với nội dung nghe nhìn, chẳng hạn như từ VAST XML hoặc Thẻ quảng cáo VMAP. Điều này có thể bao gồm vị trí tín hiệu quảng cáo tương ứng với bắt đầu nội dung, các URI phương tiện quảng cáo và siêu dữ liệu thực tế chẳng hạn như liệu một quảng cáo nhất định có thể bỏ qua.
Khi sử dụng AdsMediaSource
của ExoPlayer để chèn quảng cáo phía máy khách, trình phát
có thông tin về quảng cáo sẽ được phát. Việc này có một số lợi ích:
- Trình phát có thể hiển thị siêu dữ liệu và chức năng liên quan đến quảng cáo bằng cách sử dụng API.
- Các thành phần trên giao diện người dùng ExoPlayer có thể tự động hiển thị điểm đánh dấu cho các vị trí quảng cáo, và thay đổi hành vi của họ tuỳ thuộc vào việc quảng cáo có đang phát hay không.
- Trong nội bộ, người chơi có thể duy trì một vùng đệm nhất quán giữa các quá trình chuyển đổi giữa quảng cáo và nội dung.
Trong cách thiết lập này, người chơi đảm nhiệm việc chuyển đổi giữa quảng cáo và nội dung. Điều này có nghĩa là ứng dụng không cần kiểm soát nhiều trình phát trong nền/nền trước cho quảng cáo và nội dung.
Khi chuẩn bị video nội dung và thẻ quảng cáo để sử dụng cùng với tính năng chèn quảng cáo phía máy khách, bạn nên đặt quảng cáo ở các mẫu đồng bộ hoá (khung hình chính) trong để trình phát có thể tiếp tục phát nội dung một cách liền mạch.
Hỗ trợ quảng cáo khai báo
Bạn có thể chỉ định URI thẻ quảng cáo khi tạo MediaItem
:
Kotlin
val mediaItem = MediaItem.Builder() .setUri(videoUri) .setAdsConfiguration(MediaItem.AdsConfiguration.Builder(adTagUri).build()) .build()
Java
MediaItem mediaItem = new MediaItem.Builder() .setUri(videoUri) .setAdsConfiguration( new MediaItem.AdsConfiguration.Builder(adTagUri).build()) .build();
Để bật hỗ trợ trình phát cho các mục nội dung đa phương tiện chỉ định thẻ quảng cáo, bạn cần
tạo và chèn DefaultMediaSourceFactory
được định cấu hình bằng một
AdsLoader.Provider
và AdViewProvider
khi tạo trình phát:
Kotlin
val mediaSourceFactory: MediaSource.Factory = DefaultMediaSourceFactory(context).setLocalAdInsertionComponents(adsLoaderProvider, playerView) val player = ExoPlayer.Builder(context).setMediaSourceFactory(mediaSourceFactory).build()
Java
MediaSource.Factory mediaSourceFactory = new DefaultMediaSourceFactory(context) .setLocalAdInsertionComponents(adsLoaderProvider, /* adViewProvider= */ playerView); ExoPlayer player = new ExoPlayer.Builder(context).setMediaSourceFactory(mediaSourceFactory).build();
Trong nội bộ, DefaultMediaSourceFactory
sẽ bao bọc nguồn phương tiện nội dung trong một
AdsMediaSource
AdsMediaSource
sẽ nhận được AdsLoader
từ
AdsLoader.Provider
rồi sử dụng thành phần này để chèn quảng cáo theo xác định của quảng cáo của mục nội dung đa phương tiện
.
PlayerView
của ExoPlayer triển khai AdViewProvider
. IMA ExoPlayer
cung cấp một AdsLoader
dễ sử dụng, như mô tả dưới đây.
Danh sách phát có quảng cáo
Khi phát một danh sách phát có nhiều mục nội dung đa phương tiện, chế độ mặc định là để yêu cầu thẻ quảng cáo và lưu trữ trạng thái phát lại quảng cáo một lần cho mỗi ID phương tiện, Tổ hợp URI nội dung và URI thẻ quảng cáo. Điều này có nghĩa là người dùng sẽ thấy quảng cáo cho mọi mục nội dung đa phương tiện có quảng cáo có ID phương tiện hoặc URI nội dung riêng biệt, ngay cả khi URI của thẻ quảng cáo trùng khớp. Nếu một mục nội dung đa phương tiện lặp lại, người dùng sẽ thấy quảng cáo tương ứng chỉ một lần (trạng thái phát quảng cáo lưu trữ liệu quảng cáo đã được nên chúng sẽ được bỏ qua sau lần xuất hiện đầu tiên).
Bạn có thể tuỳ chỉnh hành vi này bằng cách truyền giá trị nhận dạng quảng cáo mờ Trạng thái phát quảng cáo cho một mục nội dung đa phương tiện nhất định được liên kết, dựa trên đối tượng bằng nhau. Dưới đây là ví dụ về trường hợp trạng thái phát quảng cáo được liên kết với thẻ quảng cáo Chỉ URI, thay vì sự kết hợp giữa ID phương tiện và URI thẻ quảng cáo, theo chuyển URI thẻ quảng cáo làm giá trị nhận dạng quảng cáo. Kết quả là quảng cáo sẽ tải một lần và người dùng sẽ không nhìn thấy quảng cáo trên mục thứ hai khi phát danh sách phát từ đầu đến cuối.
Kotlin
// Build the media items, passing the same ads identifier for both items, // which means they share ad playback state so ads play only once. val firstItem = MediaItem.Builder() .setUri(firstVideoUri) .setAdsConfiguration(MediaItem.AdsConfiguration.Builder(adTagUri).setAdsId(adTagUri).build()) .build() val secondItem = MediaItem.Builder() .setUri(secondVideoUri) .setAdsConfiguration(MediaItem.AdsConfiguration.Builder(adTagUri).setAdsId(adTagUri).build()) .build() player.addMediaItem(firstItem) player.addMediaItem(secondItem)
Java
// Build the media items, passing the same ads identifier for both items, // which means they share ad playback state so ads play only once. MediaItem firstItem = new MediaItem.Builder() .setUri(firstVideoUri) .setAdsConfiguration( new MediaItem.AdsConfiguration.Builder(adTagUri).setAdsId(adTagUri).build()) .build(); MediaItem secondItem = new MediaItem.Builder() .setUri(secondVideoUri) .setAdsConfiguration( new MediaItem.AdsConfiguration.Builder(adTagUri).setAdsId(adTagUri).build()) .build(); player.addMediaItem(firstItem); player.addMediaItem(secondItem);
Thư viện IMA của ExoPlayer
Thư viện IMA của ExoPlayer cung cấp ImaAdsLoader
, giúp bạn dễ dàng
tích hợp chèn quảng cáo phía máy khách vào ứng dụng của bạn. Nó bao bọc chức năng của
SDK IMA phía máy khách để hỗ trợ chèn quảng cáo VAST/VMAP. Cho
hướng dẫn về cách sử dụng thư viện, bao gồm cả cách xử lý nền
và tiếp tục phát, vui lòng xem tệp README.
Ứng dụng minh hoạ sử dụng thư viện IMA và bao gồm một số mẫu Các thẻ quảng cáo VAST/VMAP trong danh sách mẫu.
Những điểm cần lưu ý về giao diện người dùng
PlayerView
ẩn các nút điều khiển truyền tải trong quá trình phát quảng cáo bằng cách
mặc định, nhưng ứng dụng có thể bật/tắt hành vi này bằng cách gọi
setControllerHideDuringAds
SDK IMA sẽ hiển thị các lượt xem bổ sung ở trên
trình phát trong khi quảng cáo đang phát (ví dụ: đường liên kết "thông tin thêm" và nút bỏ qua,
nếu có).
SDK IMA có thể báo cáo liệu quảng cáo có bị che khuất bởi chế độ xem do ứng dụng cung cấp hay không
hiển thị ở đầu trình phát. Ứng dụng cần phủ các chế độ xem
để điều khiển quá trình phát phải đăng ký chúng với SDK IMA sao cho
chúng có thể được bỏ qua khỏi phép tính khả năng xem. Khi sử dụng PlayerView
làm
AdViewProvider
sẽ tự động đăng ký các lớp phủ điều khiển của mình. Chiến dịch Quảng cáo ứng dụng
sử dụng giao diện người dùng trình phát tuỳ chỉnh phải đăng ký chế độ xem lớp phủ bằng cách trả về chúng từ
AdViewProvider.getAdOverlayInfos
.
Để biết thêm thông tin về chế độ xem lớp phủ, hãy xem Tính năng đo lường mở trong SDK IMA.
Quảng cáo đồng hành
Một số thẻ quảng cáo chứa quảng cáo đồng hành bổ sung có thể được hiển thị trong "vùng" theo phong cách
giao diện người dùng của ứng dụng. Các ô này có thể được thông qua qua
ImaAdsLoader.Builder.setCompanionAdSlots(slots)
. Để biết thêm thông tin, hãy xem
Thêm Quảng cáo đồng hành.
Quảng cáo độc lập
SDK IMA được thiết kế để chèn quảng cáo vào nội dung đa phương tiện chứ không phải để phát quảng cáo độc lập. Do đó, hệ thống không hỗ trợ phát lại các quảng cáo độc lập bởi thư viện IMA. Bạn nên dùng SDK Quảng cáo của Google trên thiết bị di động để thay thế cho trường hợp sử dụng này.
Sử dụng SDK quảng cáo của bên thứ ba
Nếu cần tải quảng cáo thông qua SDK quảng cáo của bên thứ ba, bạn nên kiểm tra xem
nó đã tích hợp ExoPlayer. Nếu không, việc triển khai một tuỳ chỉnh
Bạn nên sử dụng AdsLoader
gói SDK quảng cáo của bên thứ ba.
vì nó mang lại các lợi ích của AdsMediaSource
như mô tả ở trên.
ImaAdsLoader
đóng vai trò là một ví dụ về cách triển khai.
Ngoài ra, bạn có thể dùng tính năng hỗ trợ danh sách phát của ExoPlayer để tạo trình tự của quảng cáo và đoạn nội dung:
Kotlin
// A pre-roll ad. val preRollAd = MediaItem.fromUri(preRollAdUri) // The start of the content. val contentStart = MediaItem.Builder() .setUri(contentUri) .setClippingConfiguration(ClippingConfiguration.Builder().setEndPositionMs(120000).build()) .build() // A mid-roll ad. val midRollAd = MediaItem.fromUri(midRollAdUri) // The rest of the content val contentEnd = MediaItem.Builder() .setUri(contentUri) .setClippingConfiguration(ClippingConfiguration.Builder().setStartPositionMs(120000).build()) .build() // Build the playlist. player.addMediaItem(preRollAd) player.addMediaItem(contentStart) player.addMediaItem(midRollAd) player.addMediaItem(contentEnd)
Java
// A pre-roll ad. MediaItem preRollAd = MediaItem.fromUri(preRollAdUri); // The start of the content. MediaItem contentStart = new MediaItem.Builder() .setUri(contentUri) .setClippingConfiguration( new ClippingConfiguration.Builder().setEndPositionMs(120_000).build()) .build(); // A mid-roll ad. MediaItem midRollAd = MediaItem.fromUri(midRollAdUri); // The rest of the content MediaItem contentEnd = new MediaItem.Builder() .setUri(contentUri) .setClippingConfiguration( new ClippingConfiguration.Builder().setStartPositionMs(120_000).build()) .build(); // Build the playlist. player.addMediaItem(preRollAd); player.addMediaItem(contentStart); player.addMediaItem(midRollAd); player.addMediaItem(contentEnd);
Chèn quảng cáo phía máy chủ
Trong chèn quảng cáo phía máy chủ (còn được gọi là chèn quảng cáo động hoặc DAI), luồng nội dung nghe nhìn chứa cả quảng cáo và nội dung. Tệp kê khai DASH có thể trỏ đến cả hai nội dung và phân đoạn quảng cáo, có thể trong các khoảng thời gian riêng biệt. Đối với HLS, hãy xem Apple tài liệu về cách lồng ghép quảng cáo vào danh sách phát.
Khi sử dụng tính năng chèn quảng cáo phía máy chủ, khách hàng có thể phải phân giải nội dung nghe nhìn URL một cách linh động để có được sự kiện phát trực tiếp được ghép, URL đó có thể cần hiển thị lớp phủ quảng cáo trong giao diện người dùng hoặc cần báo cáo sự kiện cho SDK quảng cáo hay máy chủ quảng cáo.
DefaultMediaSourceFactory
của ExoPlayer có thể uỷ quyền tất cả các nhiệm vụ này cho một
chèn quảng cáo phía máy chủ MediaSource
cho URI bằng lược đồ ssai://
:
Kotlin
val player = ExoPlayer.Builder(context) .setMediaSourceFactory( DefaultMediaSourceFactory(context).setServerSideAdInsertionMediaSourceFactory(ssaiFactory) ) .build()
Java
Player player = new ExoPlayer.Builder(context) .setMediaSourceFactory( new DefaultMediaSourceFactory(context) .setServerSideAdInsertionMediaSourceFactory(ssaiFactory)) .build();
Thư viện IMA của ExoPlayer
Thư viện IMA của ExoPlayer cung cấp ImaServerSideAdInsertionMediaSource
,
giúp bạn dễ dàng tích hợp với luồng quảng cáo được chèn phía máy chủ của IMA trong
. Nó bao gồm chức năng của SDK DAI IMA cho Android và đầy đủ
tích hợp siêu dữ liệu quảng cáo được cung cấp vào trình phát. Ví dụ: Điều này cho phép
bạn sử dụng các phương thức như Player.isPlayingAd()
, nghe chuyển đổi nội dung-quảng cáo
và để trình phát xử lý logic phát lại quảng cáo như bỏ qua các quảng cáo đã phát.
Để sử dụng lớp này, bạn cần thiết lập
ImaServerSideAdInsertionMediaSource.AdsLoader
và
ImaServerSideAdInsertionMediaSource.Factory
rồi kết nối người chơi với người chơi:
Kotlin
// MediaSource.Factory to load the actual media stream. val defaultMediaSourceFactory = DefaultMediaSourceFactory(context) // AdsLoader that can be reused for multiple playbacks. val adsLoader = ImaServerSideAdInsertionMediaSource.AdsLoader.Builder(context, adViewProvider).build() // MediaSource.Factory to create the ad sources for the current player. val adsMediaSourceFactory = ImaServerSideAdInsertionMediaSource.Factory(adsLoader, defaultMediaSourceFactory) // Configure DefaultMediaSourceFactory to create both IMA DAI sources and // regular media sources. If you just play IMA DAI streams, you can also use // adsMediaSourceFactory directly. defaultMediaSourceFactory.setServerSideAdInsertionMediaSourceFactory(adsMediaSourceFactory) // Set the MediaSource.Factory on the Player. val player = ExoPlayer.Builder(context).setMediaSourceFactory(defaultMediaSourceFactory).build() // Set the player on the AdsLoader adsLoader.setPlayer(player)
Java
// MediaSource.Factory to load the actual media stream. DefaultMediaSourceFactory defaultMediaSourceFactory = new DefaultMediaSourceFactory(context); // AdsLoader that can be reused for multiple playbacks. ImaServerSideAdInsertionMediaSource.AdsLoader adsLoader = new ImaServerSideAdInsertionMediaSource.AdsLoader.Builder(context, adViewProvider).build(); // MediaSource.Factory to create the ad sources for the current player. ImaServerSideAdInsertionMediaSource.Factory adsMediaSourceFactory = new ImaServerSideAdInsertionMediaSource.Factory(adsLoader, defaultMediaSourceFactory); // Configure DefaultMediaSourceFactory to create both IMA DAI sources and // regular media sources. If you just play IMA DAI streams, you can also use // adsMediaSourceFactory directly. defaultMediaSourceFactory.setServerSideAdInsertionMediaSourceFactory(adsMediaSourceFactory); // Set the MediaSource.Factory on the Player. Player player = new ExoPlayer.Builder(context).setMediaSourceFactory(defaultMediaSourceFactory).build(); // Set the player on the AdsLoader adsLoader.setPlayer(player);
Tải khoá thành phần IMA hoặc mã nguồn nội dung và mã video bằng cách tạo một URL
với ImaServerSideAdInsertionUriBuilder
:
Kotlin
val ssaiUri = ImaServerSideAdInsertionUriBuilder() .setAssetKey(assetKey) .setFormat(C.CONTENT_TYPE_HLS) .build() player.setMediaItem(MediaItem.fromUri(ssaiUri))
Java
Uri ssaiUri = new ImaServerSideAdInsertionUriBuilder() .setAssetKey(assetKey) .setFormat(C.CONTENT_TYPE_HLS) .build(); player.setMediaItem(MediaItem.fromUri(ssaiUri));
Cuối cùng, hãy giải phóng trình tải quảng cáo của bạn khi trình tải này không còn được sử dụng nữa:
Kotlin
adsLoader.release()
Java
adsLoader.release();
Những điểm cần lưu ý về giao diện người dùng
Những điều cần cân nhắc về giao diện người dùng như khi chèn quảng cáo phía máy khách áp dụng cho có thể chèn quảng cáo phía máy chủ.
Quảng cáo đồng hành
Một số thẻ quảng cáo chứa quảng cáo đồng hành bổ sung có thể được hiển thị trong "vùng" theo phong cách
giao diện người dùng của ứng dụng. Các ô này có thể được thông qua qua
ImaServerSideAdInsertionMediaSource.AdsLoader.Builder.setCompanionAdSlots(slots)
.
Để biết thêm thông tin, hãy xem bài viết Thêm Quảng cáo đồng hành.
Sử dụng SDK quảng cáo của bên thứ ba
Nếu cần tải quảng cáo bằng SDK quảng cáo của bên thứ ba, bạn nên kiểm tra xem
nó đã tích hợp ExoPlayer. Nếu không, bạn nên
cung cấp một MediaSource
tuỳ chỉnh chấp nhận URI bằng lược đồ ssai://
tương tự như ImaServerSideAdInsertionMediaSource
.
Logic thực tế của việc tạo cấu trúc quảng cáo có thể được ủy quyền cho các
mục đích ServerSideAdInsertionMediaSource
, gói luồng MediaSource
đồng thời cho phép người dùng đặt cũng như cập nhật AdPlaybackState
đại diện cho quảng cáo
siêu dữ liệu.
Thông thường, luồng quảng cáo được chèn phía máy chủ chứa các sự kiện được tính giờ để thông báo cho trình phát
về siêu dữ liệu quảng cáo. Vui lòng xem các định dạng được hỗ trợ để biết thông tin về nội dung
ExoPlayer hỗ trợ các định dạng siêu dữ liệu có dấu thời gian. SDK quảng cáo tuỳ chỉnh MediaSource
Các quá trình triển khai có thể theo dõi các sự kiện siêu dữ liệu được tính thời gian từ trình phát bằng cách sử dụng
Player.Listener.onMetadata