Instream Video Ad Options
This guide explains how to configure various options for in-stream video ads and how to implement AdVideoPlayer.
GfpVideoAdOptions Configuration
You can configure video ad options through GfpVideoAdOptions.
Option Items
- supportedStreamingHLS: Whether to support HLS streaming (default: false)
- bitrateKbps: Ad quality setting (default: -1, auto setting)
- videoLoadTimeout: Video load timeout (default: 5000ms)
- Kotlin
- Java
val videoAdOptions = GfpVideoAdOptions().apply {
supportedStreamingHLS = true // HLS support
bitrateKbps = 1000 // 1Mbps quality setting
videoLoadTimeout = 10000 // 10 second timeout
}
videoAdScheduleManager.setVideoAdOptions(videoAdOptions)
GfpVideoAdOptions videoAdOptions = new GfpVideoAdOptions();
videoAdOptions.setSupportedStreamingHLS(true); // HLS support
videoAdOptions.setBitrateKbps(1000); // 1Mbps quality setting
videoAdOptions.setVideoLoadTimeout(10000); // 10 second timeout
videoAdScheduleManager.setVideoAdOptions(videoAdOptions);
AdVideoPlayer Implementation
Adding Gradle Dependencies
- 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 Implementation Example
warning
The example below uses ExoPlayer. In actual implementation, you should implement it using the player used in your service.
- 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 Listener Configuration
You can set up a QOE listener to obtain video ad playback quality information.
- Kotlin
- Java
videoAdScheduleManager.setQoeListener(object: GfpVideoAdQoeListener {
override fun onAdLoaded(info: GfpVideoAdQoeInfo) {
Log.d("QOE", "Ad load completed - Provider: ${info.provider}")
}
override fun onAdStarted(info: GfpVideoAdQoeInfo) {
Log.d("QOE", "Ad playback started")
}
override fun onAdCompleted(info: GfpVideoAdQoeInfo) {
Log.d("QOE", "Ad playback completed")
}
override fun onError(error: GfpError) {
Log.e("QOE", "Error occurred: ${error.errorMessage}")
}
})
videoAdScheduleManager.setQoeListener(new GfpVideoAdQoeListener() {
@Override
public void onAdLoaded(GfpVideoAdQoeInfo info) {
Log.d("QOE", "Ad load completed - Provider: " + info.getProvider());
}
@Override
public void onAdStarted(GfpVideoAdQoeInfo info) {
Log.d("QOE", "Ad playback started");
}
@Override
public void onAdCompleted(GfpVideoAdQoeInfo info) {
Log.d("QOE", "Ad playback completed");
}
@Override
public void onError(GfpError error) {
Log.e("QOE", "Error occurred: " + error.getErrorMessage());
}
});
Timeout Configuration
You can set the ad request timeout.
- Kotlin
- Java
// Set 60 second timeout
videoAdScheduleManager.setGfpVideoProperties(GfpVideoProperties(60_000L, null))
// Set 60 second timeout
videoAdScheduleManager.setGfpVideoProperties(new GfpVideoProperties(60_000L, null));