고급 통합(InStream API)

InStream API는 광고 로드를 설정 및 관리하고 InStream 광고를 재생하기 위한 고급 API입니다. 모든 유형의 광고 시점을 지원하고 플레이어의 자체 구현을 사용할 수 있도록 합니다. InStream 광고는 자동 및 수동으로 재생되는 동영상 광고로 구성됩니다.

Pre-roll, Mid-roll, Post-roll 광고 시점은 InstreamAdBinder API를 사용하여 자동으로 재생됩니다. In-roll 및 Pause-roll 광고 시점을 수동으로 재생하려면 각각 In-roll API 및 Pause-roll API를 사용하세요.

Примечание

다음과 같은 경우 InstreamAdBinder API, In-roll API, 및 Pause-roll API를 동시에 사용할 수 있습니다.

  1. 광고 플레이어의 다른 인스턴스를 사용.
  2. InStreamAdBinder API를 사용하여 메인 동영상이 일시 중지된 경우 광고를 재생하기 위해 Pause-roll 및 In-roll API를 시작하지 않는 경우.

작동 방식

로드된 InStream 광고 객체에는 광고 시점을 재생하기 위한 일정이 포함됩니다. 각 광고 시점은 InstreamAdBreak 객체로 설명됩니다. 광고 시점에는 다음 유형 중 한 가지가 있을 수 있습니다. Pre/Mid/Post/In/Pause-Roll 중 하나일 수 있습니다. Pre-/Mid-/Post-Roll 광고 시점은 InstreamAdBinder API를 사용하여 재생할 수 있습니다. In/Pause-Roll 광고 시점을 재생하려면 각각 In-roll API 및 Pause-roll API를 사용하세요.

VideoPlayer 인터페이스는 메인 동영상 콘텐츠와 상호 작용하는 데 사용됩니다. 광고 배치 내에서 광고 시점을 재생하려면 InstreamAdPlayer 인터페이스를 사용하세요.

InstreamAdBinder는 메인 동영상 재생의 진행 상황을 추적하고 파트너 인터페이스의 동영상 리소스 설정에 따라 광고 시점을 표시합니다.

InstreamAdBinder는 PlayerView에서 동영상 광고의 렌더링을 직접 제어하지 않습니다. 동영상 광고는 InstreamAdBinder에 전송된 플레이어 인터페이스의 신호를 기반으로 앱 측에서 재생되어야 합니다. InstreamAdBinder는 VideoPlayer.pauseVideo()를 호출하여 광고 시점 재생의 시작을 신호하고 VideoPlayer.resumeVideo()를 호출하여 끝을 신호합니다.

앱 측에서 VideoPlayer.pauseVideo()를 호출할 때 메인 동영상 제어를 숨기고, 메인 동영상을 일시 중지하고, 동영상 광고 재생을 시작해야 합니다. 광고 SDK 측에서는 메서드를 호출한 후 InstreamAdView 컨테이너 내에 광고 제어가 표시되고 InstreamAdPlayer.playAd() 메서드를 호출하여 동영상 광고 재생을 시작합니다.

앱 측에서 VideoPlayer.resumeVideo()를 호출할 때 메인 동영상 제어를 반환하고 메인 동영상 재생을 재개해야 합니다. 광고 SDK 측에서는 메서드를 호출하기 전에 InstreamAdView 컨테이너 내의 광고 제어가 제거됩니다.

In/Pause-Roll API는 PlayerView에서 동영상 광고의 렌더링을 직접 제어하지 않습니다. 동영상 광고는 In/Pause-Roll로 전송된 플레이어 인터페이스의 신호를 기반으로 앱 측에서 재생되어야 합니다. In/Pause-Roll은 InstreamAdBreakEventListener.onInstreamAdBreakStarted()를 호출하여 광고 시점의 시작을 신호하고 InstreamAdBreakEventListener.onInstreamAdBreakCompleted() 또는 InstreamAdBreakEventListener.onInstreamAdBreakError()를 호출하여 끝을 신호합니다.

앱 측에서 InstreamAdBreakEventListener.onInstreamAdBreakStarted()를 호출할 때는 메인 동영상 제어를 숨기고 메인 동영상을 일시 중지해야 합니다. 광고 SDK 측에서는 메서드를 호출한 후 InstreamAdView 컨테이너 내에 광고 제어가 표시되고 InstreamAdPlayer.playAd() 메서드를 호출하여 동영상 광고 재생을 시작합니다.

앱 측에서 InstreamAdBreakEventListener.onInstreamAdBreakCompleted() 또는 InstreamAdBreakEventListener.onInstreamAdBreakError()를 호출할 때, 메인 동영상 제어를 반환하고 메인 동영상 재생을 재개합니다. 광고 SDK 측에서는 메서드를 호출하기 전에 InstreamAdView 컨테이너에서 광고 제어를 제거합니다.

광고 로드

  1. InStream 광고를 가져오려면 InstreamAdLoader 클래스의 인스턴스를 생성합니다.

  2. 알림을 설정합니다(광고 로드 성공 또는 오류와 함께 실패). InstreamAdLoadListener 인스턴스를 생성하고 광고 로더의 이벤트 리스너로 설정하세요.

  3. InstreamAdRequestConfiguration.Builder 클래스를 사용하여 instreamAdRequestConfiguration 요청에 대한 구성을 생성합니다. 파트너 인터페이스에서 Page_ID을 요청 매개변수로 전달합니다.

  4. InstreamAdLoader.loadInstreamAd 메서드를 사용하여 광고를 로드하고 여기에 ContextinstreamAdRequestConfiguration을 전달합니다.

코드 예시:

통합을 테스트하려면 데모 Page_ID: demo-instream-vmap-yandex를 사용하세요.

val instreamAdLoader = InstreamAdLoader(this)
instreamAdLoader.setInstreamAdLoadListener(object : InstreamAdLoadListener {
    override fun onInstreamAdLoaded(instreamAd: InstreamAd) {
        // ...
    }

    override fun onInstreamAdFailedToLoad(reason: String) {
        // ...
    }
})

val instreamAdRequestConfiguration = InstreamAdRequestConfiguration.Builder(PAGE_ID).build()
instreamAdLoader.loadInstreamAd(this, instreamAdRequestConfiguration)
final InstreamAdLoader instreamAdLoader = new InstreamAdLoader(context);
instreamAdLoader.setInstreamAdLoadListener(new InstreamAdLoadListener() {
        @override
        public void onInstreamAdLoaded(@NonNull final InstreamAd instreamAd) {
        // ...
        }

        @override
        public void onInstreamAdFailedToLoad(@NonNull final String reason) {
        // ...
        }
    });

final InstreamAdRequestConfiguration instreamAdRequestConfiguration =
    new InstreamAdRequestConfiguration.Builder(PAGE_ID).build();
instreamAdLoader.loadInstreamAd(this, instreamAdRequestConfiguration);

광고 렌더링

  1. InstreamAdPlayerVideoPlayer 메서드를 구현합니다.

    적절한 방법을 사용하고 구현하는 것에 대한 추가 정보는 참조 가이드 섹션 Package com.yandex.mobile.ads.instream.player.adPackage com.yandex.mobile.ads.instream.player.content를 참조하세요. 또한 테스트 구현 예시를 참조하세요.

    Совет

    더 간편하게 실행하려면 다른 플레이어 인스턴스를 사용하여 동영상 광고와 콘텐츠를 재생하는 것을 권장합니다.

  2. InstreamAdView를 앱의 레이아웃에 추가합니다. 동영상 광고를 재생하려면 InstreamAdView에 PlayerView를 포함해야 합니다.

    코드 예시:

    제약 조건

    컨테이너의 크기는 최소 300dp x 160dp여야 합니다.

    <com.yandex.mobile.ads.instream.player.ad.InstreamAdView
        android:id="@+id/instream_ad_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
    
            <PlayerView
                android:id="@+id/player_view"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"/>
    
    </com.yandex.mobile.ads.instream.player.ad.InstreamAdView>
    
  3. InstreamAdBinder 객체를 생성합니다. 컨텍스트, 로드된 InstreamAd 객체, 그리고 InstreamAdPlayerVideoPlayer 구현을 빌더에 전달합니다.

    광고 재생 진행 상황(동영상 광고를 재생할 준비가 됨, 동영상 광고가 재생됨 또는 재생에 실패함)에 대한 알림을 설정하고 InstreamAdListener의 인스턴스를 생성하여 InstreamAdBinder에 대한 이벤트 리스너로 설정합니다.

    instreamAdBinder = InstreamAdBinder(
        this,
        instreamAd,
        checkNotNull(instreamAdPlayer),
        checkNotNull(contentVideoPlayer)
    )
    instreamAdBinder.setInstreamAdListener(...)
    
    mInstreamAdBinder = new InstreamAdBinder(context, mInstreamAd, mYandexAdPlayer, mContentVideoPlayer);
    mInstreamAdBinder.setInstreamAdListener(...);
    
  4. Pre-roll 광고 시점 재생을 더 빠르게 시작하려면 InstreamAdBinder.prepareAd() 메서드를 호출하여 사전 로드하세요.

    private fun preparePrerollAd(instreamAdBinder: InstreamAdBinder) {
        instreamAdBinder.setInstreamAdListener(object : InstreamAdListener {
            // ...
            override fun onInstreamAdPrepared() {
                addInstreamAdBinderToPreloadedAdQueue(instreamAdBinder)
            } // ...
        })
        instreamAdBinder.prepareAd()
    }
    
    private void preparePrerollAd(@NonNull final InstreamAdBinder instreamAdBinder) {
        instreamAdBinder.setInstreamAdListener(new InstreamAdListener() {
            // ...
            public void onInstreamAdPrepared() {
                addInstreamAdBinderToPreloadedAdQueue(instreamAdBinder);
            }
            // ...
        });
        instreamAdBinder.prepareAd();
    }
    
  5. 생성된 InstreamAdBinder 객체에 대해 InstreamAdBinder.bind(instreamAdView) 메서드를 호출합니다. 매개변수로 InstreamAdView를 전달하세요. 그러면 InStream SDK가 메인 동영상 재생의 진행 상황을 자동으로 추적하고 동영상 광고가 재생되는 방식을 관리하기 시작합니다.

    instreamAdBinder.bind(instreamAdView)
    
    mInstreamAdBinder.bind(mInstreamAdView);
    
  6. 목록에서 InStream 광고를 재생할 때, 목록에서 광고가 있는 셀이 무효화되면 InStreamBinder.unbind() 메서드를 사용합니다. 스크롤을 위해 재사용 가능한 플레이어 풀을 구현하려면 InstreamAdBinder에 연결된 광고 플레이어를 재사용할 때 InstreamAdbinder.invalidateAdPlayer()를 호출하고, 메인 콘텐츠 플레이어를 재사용할 때는 InstreamAdBinder.invalidateVideoPlayer()를 호출하세요.

  7. InStreamAdBinder 사용을 중지할 때 상태를 재설정합니다.

    override fun onDestroy() {
        instreamAdBinder.apply {
            unbind()
            instreamAdBinder.invalidateVideoPlayer()
            instreamAdBinder.invalidateAdPlayer()
            instreamAdBinder.setInstreamAdListener(null)
            instreamAdBinder.setVideoAdPlaybackListener(null)
        }    
        super.onDestroy()
    }
    
    public void onDestroy() {
        instreamAdBinder.unbind();
        instreamAdBinder.invalidateVideoPlayer();
        instreamAdBinder.invalidateAdPlayer();
        instreamAdBinder.setInstreamAdListener(null);
        instreamAdBinder.setVideoAdPlaybackListener(null);
     
        super.onDestroy();
    }
    

Примечание

Pause-roll 광고 시점 재생을 설정하는 것은 In-roll과 유사합니다. 이렇게 하려면 In-roll 클래스/메서드를 Pause-roll의 클래스/메서드로 교체하세요.

  1. InstreamAdPlayer 인터페이스를 구현합니다.

    메서드와 그 구현에 대한 자세한 내용은 Package com.yandex.mobile.ads.instream.player.ad 참조 섹션을 확인하세요. 또한 테스트 구현 예시를 참조하세요.

    Совет

    더 간편하게 실행하려면 다른 플레이어 인스턴스를 사용하여 동영상 광고와 콘텐츠를 재생하는 것을 권장합니다.

  2. InstreamAdView를 앱의 레이아웃에 추가합니다. 동영상 광고를 재생하려면 InstreamAdView에 PlayerView를 포함해야 합니다.

    코드 예시:

    제약 조건

    컨테이너의 크기는 최소 300dpx160dp여야 합니다.

    <com.yandex.mobile.ads.instream.player.ad.InstreamAdView
        android:id="@+id/instream_ad_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
    
            <PlayerView
                android:id="@+id/player_view"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"/>
    
    </com.yandex.mobile.ads.instream.player.ad.InstreamAdView>
    
  3. InstreamAdLoader를 사용하여 파트너 인터페이스의 Page_ID를 사용해 InstreamAd 객체를 로드합니다.

  4. InstreamAd 객체는 다양한 유형의 광고 시점 세트를 포함합니다. In-roll 광고 시점을 얻으려면 InrollQueueProvider를 사용하세요. InrollQueueProvider 대기열을 통해 표시 순서대로 In-roll 객체를 수신할 수 있습니다.

    fun onInstreamAdLoaded(instreamAd: InstreamAd) {
        val inrollQueueProvider = InrollQueueProvider(context, instreamAd)
        instreamAdBreakQueue = inrollQueueProvider.queue
    }
    
    public void onInstreamAdLoaded(@NonNull final InstreamAd instreamAd) {
        final InrollQueueProvider inrollQueueProvider = new InrollQueueProvider(context, instreamAd);
        mInstreamAdBreakQueue = inrollQueueProvider.getQueue();
    }
    
  5. 수신한 In-roll 동영상 광고를 실행하려면 이를 준비해야 합니다. 준비되지 않은 In-roll 동영상 광고는 시작되지 않습니다.

    In-roll 동영상 광고를 준비하려면, 인터페이스 Inroll.prepare(instreamAdPlayer)를 호출하고 생성된 InstreamAdPlayer 구현의 인스턴스를 전달합니다. 광고 시점의 상태를 추적하려면 InstreamAdBreakEventListener를 설정하세요.

    fun prepare(instreamAdPlayer: SampleInstreamAdPlayer) {
        currentInroll = instreamAdBreakQueue.poll()?.apply {
            setListener(InrollListener())
            instreamAdPlayer.let(::prepare)
        }
    }
    
    public void prepare(instreamAdPlayer) {
        currentInroll = mInstreamAdBreakQueue.poll();
        currentInroll.setListener(new InrollListener());
        currentInroll.prepare(instreamAdPlayer);
    }
    
  6. In-roll 동영상 광고가 준비되면 InstreamAdBreakEventListener.onInstreamAdBreakPrepared()가 호출됩니다. 준비된 In-roll 동영상 광고를 재생할 준비가 되었습니다.

    Совет

    InstreamAdBreakQueue.에서 받은 순서대로 동영상 광고를 재생합니다. 받은 In-roll 동영상 광고가 다른 순서로 재생되면, 앱 수익화 효과가 감소할 수 있습니다.

  7. 준비된 In-roll 동영상 광고를 재생하려면, Inroll.play()를 호출하고 InstreamAdView를 매개변수로 전달합니다.

    fun onInstreamAdBreakPrepared() {
        currentInroll?.play(instreamAdView)
    }
    
    public void onInstreamAdBreakPrepared() {
        if (currentInroll != null) {
            currentInroll.play(instreamAdView);
        }
    }
    
  8. 광고 시점이 재생되기 시작하면 InstreamAdBreakEventListener.onInstreamAdBreakStarted() 메서드가 호출됩니다. 이 메서드를 호출한 후, 메인 동영상을 일시 중지하고 제어를 숨김 처리합니다.

    fun onInstreamAdBreakStarted() {
        contentVideoPlayer?.pauseVideo()
    }
    
    public void onInstreamAdBreakStarted() {
        if (contentVideoPlayer != null) {
            contentVideoPlayer.pauseVideo();
        }
    }
    
  9. 광고 시점이 재생된 후, 메인 동영상 재생을 재개합니다. 동영상 광고는 재생에 성공하거나 실패할 수 있습니다. 두 상황 모두 처리해야 합니다.

    override fun onInstreamAdBreakCompleted() {
        handleAdBreakCompleted()
    }
    
    override fun onInstreamAdBreakError(reason: String) {
        handleAdBreakCompleted()
    }
    
    private fun handleAdBreakCompleted() {
        currentInroll = null
        contentVideoPlayer?.resumeVideo()
    }
    
    @Override
    public void onInstreamAdBreakCompleted() {
        handleAdBreakCompleted();
    }
    
    @Override
    public void onInstreamAdBreakError(@NonNull final String reason) {
        handleAdBreakCompleted();
    }
    
    private void handleAdBreakCompleted() {
        currentInroll = null;
        if (contentVideoPlayer != null) {
            contentVideoPlayer.resumeVideo();
        }
    }
    
  10. 현재 In-roll 동영상 광고의 재생이 완료되면 InstreamAdBreakQueue에서 다음 In-roll 동영상 광고를 위해 재생 대기열을 확인합니다.

    fun prepareNextAd() {
        currentInroll = mInstreamAdBreakQueue.poll()
        currentInroll?.prepareInroll(currentInroll)
    }
    
    public void prepareNextAd() {
        currentInroll = mInstreamAdBreakQueue.poll();
        if (currentInroll != null) {
            prepareInroll(currentInroll);
        }
    }
    
  11. In-roll 동영상 광고 사용을 중지할 때 그 상태를 재설정합니다.

    override fun onDestroy() {
        currentInroll?.apply {
            invalidate()
            setListener(null)
        }
        super.onDestroy()
    }
    
    public void onDestroy() {
        if (currentInroll != null) {
            currentInroll.invalidate();
            currentInroll.setListener(null);
        }
        super.onDestroy();
    }