고급 연동(InStream API)

InStream API는 인스트림 광고의 로드와 재생을 설정·관리하는 고급 API입니다. 모든 유형의 광고 브레이크 재생과 자체 플레이어 구현을 지원합니다. 인스트림 광고는 자동·수동으로 재생되는 동영상 광고로 구성됩니다.

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로 광고 재생을 시작하지 마세요.

동작 방식

로드된 인스트림 광고 객체에는 광고 브레이크 재생 일정이 들어 있습니다. 각 브레이크는 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는 메인 동영상 재생 진행을 추적하고, Yandex Advertising Network 인터페이스의 동영상 리소스 설정에 따라 광고 브레이크를 표시합니다.

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. 인스트림 광고를 받으려면 InstreamAdLoader 클래스의 인스턴스를 만듭니다.

  2. 알림 설정(광고 로드 성공 또는 오류로 실패): InstreamAdLoadListener 인스턴스를 만들어 광고 로더의 이벤트 리스너로 설정합니다.

  3. InstreamAdRequestConfiguration.Builder 클래스로 instreamAdRequestConfiguration 요청 구성을 만듭니다. 요청 매개변수로 Yandex Advertising Network 인터페이스의 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 × 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 객체를 만듭니다. 빌더에 Context, 로드된 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를 넘깁니다. 이후 인스트림 SDK가 메인 동영상 재생 진행을 자동으로 추적하고 동영상 광고 재생 방식을 관리합니다.

    instreamAdBinder.bind(instreamAdView)
    
    mInstreamAdBinder.bind(mInstreamAdView);
    
  6. 목록에서 인스트림 광고를 재생할 때, 목록에서 광고가 있는 셀이 무효화되면 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가 있어야 합니다.

    코드 예시:

    제한 사항

    컨테이너 크기는 최소 300dp × 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. InstreamAdLoader로 Yandex Advertising Network 인터페이스의 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();
    }