인스트림 동영상 광고 옵션
이 가이드에서는 인스트림 동영상 광고의 다양한 옵션 설정 방법과 AdVideoPlayer 구현 방법을 설명합니다.
GfpVideoAdOptions 설정
GfpVideoAdOptions를 통해 비디오 광고 옵션을 설정할 수 있습니다.
옵션 항목
- supportedStreamingHLS: HLS 스트리밍 지원 여부 (기본값: false)
- bitrateKbps: 광고 품질 설정 (기본값: -1, 자동 설정)
- videoLoadTimeout: 비디오 로드 타임아웃 (기본값: 5000ms)
- Kotlin
- Java
val videoAdOptions = GfpVideoAdOptions().apply {
supportedStreamingHLS = true // HLS 지원
bitrateKbps = 1000 // 1Mbps 품질 설정
videoLoadTimeout = 10000 // 10초 타임아웃
}
videoAdScheduleManager.setVideoAdOptions(videoAdOptions)
GfpVideoAdOptions videoAdOptions = new GfpVideoAdOptions();
videoAdOptions.setSupportedStreamingHLS(true); // HLS 지원
videoAdOptions.setBitrateKbps(1000); // 1Mbps 품질 설정
videoAdOptions.setVideoLoadTimeout(10000); // 10초 타임아웃
videoAdScheduleManager.setVideoAdOptions(videoAdOptions);
AdVideoPlayer 구현
Gradle 의존성 추가
- Kotlin DSL
- Groovy
dependencies {
...
implementation("com.google.android.exoplayer:exoplayer-core:x.y.z")
implementation("com.google.android.exoplayer:exoplayer-hls:x.y.z")
implementation("com.google.android.exoplayer:exoplayer-ui:x.y.z")
}
dependencies {
...
implementation 'com.google.android.exoplayer:exoplayer-core:x.y.z'
implementation 'com.google.android.exoplayer:exoplayer-hls:x.y.z'
implementation 'com.google.android.exoplayer:exoplayer-ui:x.y.z'
}
AdVideoPlayer 구현 예시
warning
아래 예시는 ExoPlayer를 사용하는 예시입니다. 실제 구현시에는 서비스에서 사용하는 플레이어로 구현해야 합니다.
- Kotlin
- Java
import com.naver.gfpsdk.provider.AdVideoPlayer
import com.google.android.exoplayer2.ExoPlayer
import com.google.android.exoplayer2.ui.StyledPlayerView
class SampleExoPlayerView @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
) : StyledPlayerView(context, attrs, defStyleAttr) {
private val videoPlayerCallbacks = CopyOnWriteArraySet<AdVideoPlayer.PlayerCallback>()
private var player: ExoPlayer
private var playbackState: PlaybackState
private var adPlayer: AdVideoPlayer
init {
player = ExoPlayer.Builder(context).build()
playbackState = PlaybackState.STOPPED
adPlayer = object: AdVideoPlayer {
override fun play() {
player.playWhenReady = true
playbackState = PlaybackState.PLAYING
videoPlayerCallbacks.forEach { it.onPlay() }
}
override fun pause() {
player.playWhenReady = false
playbackState = PlaybackState.PAUSED
videoPlayerCallbacks.forEach { it.onPause() }
}
override fun getCurrentPosition(): Long {
return player.currentPosition
}
override fun getDuration(): Long {
return if (playbackState == PlaybackState.STOPPED) 0L else player.duration
}
override fun setVideoPath(videoUrl: String) {
player.setMediaSource(generateMediaSource(videoUrl), true)
player.prepare()
}
override fun addPlayerCallback(callback: AdVideoPlayer.PlayerCallback) {
videoPlayerCallbacks.add(callback)
}
override fun removePlayerCallback(callback: AdVideoPlayer.PlayerCallback) {
videoPlayerCallbacks.remove(callback)
}
}
}
fun createAdVideoPlayer(contentVideoUrl: String): AdVideoPlayer {
return adPlayer
}
enum class PlaybackState {
STOPPED, PAUSED, PLAYING
}
}
import com.naver.gfpsdk.provider.AdVideoPlayer;
import com.google.android.exoplayer2.ExoPlayer;
import com.google.android.exoplayer2.ui.StyledPlayerView;
public class SampleExoPlayerView extends StyledPlayerView {
private final CopyOnWriteArraySet<AdVideoPlayer.PlayerCallback> videoPlayerCallbacks =
new CopyOnWriteArraySet<>();
private ExoPlayer player;
private PlaybackState playbackState;
private AdVideoPlayer adPlayer;
public SampleExoPlayerView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
player = new ExoPlayer.Builder(context).build();
playbackState = PlaybackState.STOPPED;
adPlayer = new AdVideoPlayer() {
@Override
public void play() {
player.setPlayWhenReady(true);
playbackState = PlaybackState.PLAYING;
for (PlayerCallback callback : videoPlayerCallbacks) {
callback.onPlay();
}
}
@Override
public void pause() {
player.setPlayWhenReady(false);
playbackState = PlaybackState.PAUSED;
for (PlayerCallback callback : videoPlayerCallbacks) {
callback.onPause();
}
}
@Override
public long getCurrentPosition() {
return player.getCurrentPosition();
}
@Override
public long getDuration() {
return playbackState == PlaybackState.STOPPED ? 0 : player.getDuration();
}
@Override
public void setVideoPath(String videoUrl) {
player.setMediaSource(generateMediaSource(videoUrl), true);
player.prepare();
}
@Override
public void addPlayerCallback(PlayerCallback callback) {
videoPlayerCallbacks.add(callback);
}
@Override
public void removePlayerCallback(PlayerCallback callback) {
videoPlayerCallbacks.remove(callback);
}
};
}
public AdVideoPlayer createAdVideoPlayer(String contentVideoUrl) {
return adPlayer;
}
public enum PlaybackState {
STOPPED, PAUSED, PLAYING
}
}
QOE 리스너 설정
동영상 광고 재생 품질 정보를 얻기 위해 QOE 리스너를 설정할 수 있습니다.
- Kotlin
- Java
videoAdScheduleManager.setQoeListener(object: GfpVideoAdQoeListener {
override fun onAdLoaded(info: GfpVideoAdQoeInfo) {
Log.d("QOE", "광고 로드 완료 - Provider: ${info.provider}")
}
override fun onAdStarted(info: GfpVideoAdQoeInfo) {
Log.d("QOE", "광고 재생 시작")
}
override fun onAdCompleted(info: GfpVideoAdQoeInfo) {
Log.d("QOE", "광고 재생 완료")
}
override fun onError(error: GfpError) {
Log.e("QOE", "에러 발생: ${error.errorMessage}")
}
})
videoAdScheduleManager.setQoeListener(new GfpVideoAdQoeListener() {
@Override
public void onAdLoaded(GfpVideoAdQoeInfo info) {
Log.d("QOE", "광고 로드 완료 - Provider: " + info.getProvider());
}
@Override
public void onAdStarted(GfpVideoAdQoeInfo info) {
Log.d("QOE", "광고 재생 시작");
}
@Override
public void onAdCompleted(GfpVideoAdQoeInfo info) {
Log.d("QOE", "광고 재생 완료");
}
@Override
public void onError(GfpError error) {
Log.e("QOE", "에러 발생: " + error.getErrorMessage());
}
});
타임아웃 설정
광고 요청 타임아웃을 설정할 수 있습니다.
- Kotlin
- Java
// 60초 타임아웃 설정
videoAdScheduleManager.setGfpVideoProperties(GfpVideoProperties(60_000L, null))
// 60초 타임아웃 설정
videoAdScheduleManager.setGfpVideoProperties(new GfpVideoProperties(60_000L, null));