Chèn quảng cáo

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.ProviderAdViewProvider 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.AdsLoaderImaServerSideAdInsertionMediaSource.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