[object Object] Icon

Encoding
Learn how to create, start, manage and modify Encodings

[object Object] Icon

Player
Learn how to create, start, manage and modify Players

[object Object] Icon

Analytics
Learn how to create, start, manage and modify Analyticss

Docs Home
User shortcuts for search
Focus by pressing f
Hide results by pressing Esc
Navigate via   keys

Wed Sep 12 2018

Measuring seek times

OverviewLink Icon

Not all of your viewers consume videos in a linear fashion. Some people want to skip over less interesting scenes, whereas others want to watch their favourite scenes over and over again. In order to please your viewers, it’s important to make seeking as performant as possible. Bitmovin Analytics provides you the metrics to analyze your viewers’ seeking experience.

Determining the typical seek timeLink Icon

The seek time is the duration a user has to wait after seeking until playback continues. This time should be as short as possible to make playback seamless. To understand how long your viewers had to wait for playback after seeking, we can query for the average seek time. Make sure you’ve set up the Bitmovin JavaScript client according to the “Getting Started” guide.

If everything works, we can query for the average seek time:

1queryBuilder
2 .avg('SEEKED')
3 .between(fromDate, toDate)
4 .filter('SEEKED', 'GT', 0)
5 .query()
6 .then(console.log);

The result will look something like this:

1{
2 rowCount: 1,
3 rows: [[1374.4157303370787]],
4 columnLabels: [{ key: 'SEEKED', label: 'Seeked' }],
5}

We filtered for seek times greater than 0 to consider only video impressions where seeking occurred. Otherwise the result would be skewed towards zero. Please make sure to include this filter in all your seek time queries.

The result we received was the average seek time of all impressions of all videos in the given period.

Seek time per videoLink Icon

To analyze seek times for a specific video, we can filter for the video’s id. This time we’re gonna query for the median seek time, as it resembles the typical seeking experience of your viewers:

1queryBuilder
2 .median('SEEKED')
3 .between(fromDate, toDate)
4 .filter('SEEKED', 'GT', 0)
5 .filter('VIDEO_ID', 'EQ', 'my-video-id')
6 .query();

The VIDEO_ID is only set in your analytics data, if you passed it in your Bitmovin Analytics config. Check out the articles on how to integrate Bitmovin Analytics with Bitmovin Player or how to integrate Bitmovin Analytics with VideoJS.

Average seek time for each dayLink Icon

When we look at seek time in a certain period, it’s useful to divide the period into equal time intervals to see how seek time evolved over time. To determine the average seek time for each day of our period, we can use the following query:

1queryBuilder
2 .avg('SEEKED')
3 .between(fromDate, toDate)
4 .interval('DAY')
5 .filter('SEEKED', 'GT', 0)
6 .query()
7 .then(console.log);

The result looks like this:

1{
2 rowCount: 2,
3 rows: [
4 [ 1514505600000, 1708 ],
5 [ 1514419200000, 649 ],
6 ],
7 columnLabels: [{ key: 'SEEKED', label: 'Seeked' }],
8}

Now we’ve got an array of several rows, with 2 elements each. The first element is the unix timestamp of the beginning of the day in UTC.

1new Date(1510531200000) // => 2017-12-29T00:00:00.000Z

The second element is the average seek time of the day. In our example, the average seek time on December 29 was 0.649 seconds.

You might have noticed that there isn’t a row for every day of our query period. That’s because only days with actual analytics data are included in the result.

Of course you can also choose other intervals. Available values are MINUTE, HOUR, DAY and MONTH.

Seek time per countryLink Icon

With an international audience, it’s important to analyze how your seek performance varies across different countries. To inspect seek times for a certain country, pass the country’s ISO 3166-1 alpha-2 code to the COUNTRY filter:

1queryBuilder
2 .median('SEEKED')
3 .between(fromDate, toDate)
4 .filter('SEEKED', 'GT', 0)
5 .filter('COUNTRY', 'EQ', 'ES')
6 .query()

In this example we queried for the median seek time in Spain.

Seek time per browserLink Icon

We can apply the same technique to inspect the seek performance in a certain browser. Let’s query for the median seek time in Google Chrome:

1queryBuilder
2 .median('SEEKED')
3 .between(fromDate, toDate)
4 .filter('SEEKED', 'GT', 0)
5 .filter('BROWSER', 'EQ', 'Chrome')
6 .query()

Comparing browsersLink Icon

Sometimes you don’t know all the values to query for. Like for browsers, there are some exotic ones that you might not even think of – or would you have though of “Vivaldi”? To get an overview of seek times in all browsers, we can group our results:

1queryBuilder
2 .median('SEEKED')
3 .between(fromDate, toDate)
4 .filter('SEEKED', 'GT', 0)
5 .groupBy('BROWSER')
6 .query()
7 .then(console.log);

This gives us the median seek time for each browser:

1{
2 rowCount: 15,
3 rows: [
4 ['Edge', 1654],
5 ['Other', 9809.5],
6 ['Mobile Safari', 1550],
7 ['Chrome Mobile', 2742.5],
8 ['Samsung Internet', 19398.5],
9 ['Opera', 2752],
10 ['Chrome', 1659.617857142857],
11 ['Safari', 492],
12 ['UC Browser', 1368],
13 ['Mobile Safari UI/WKWebView', 6622],
14 ['IE', 1740],
15 ['Vivaldi', 4169.5],
16 ['Firefox Mobile', 2036],
17 ['Firefox', 1403.6666666666665],
18 ['Chromium', 1822],
19 ],
20 columnLabels: [
21 { key: 'SEEKED', label: 'Seeked' },
22 ],
23}

You can apply the same technique to countries, CDN providers and other attributes. For an extensive list of available attributes, check out the Bitmovin Analytics API docs.

Give us feedback