QoS для онлайн видео

This post is also available in: Английский

QoS для онлайн видео

Для обеспечения лучшего качества предоставления услуг по вещанию онлайн видео, требуется принимать во внимание статистические данные о состоянии потока, которые можно получить путем использования двух классов: NetStreamInfo и NetStreamMulticastInfo (Для P2P соединений).

В этой статье мы проведем обзор этих классов, а также рассмотрим методы работы с ними при использовании фреймворка OSMF, в котором получить доступ к этому объекту не так очевидно.

Класс NetStreamInfo
Класс NetStreamInfo предоставляет доступ к статистической информации по качеству обслуживания Quality of Service (QOS), напрямую связанную с объектом NetStream и используемым буфером потокового воспроизведения аудио, видео и данных. Объект NetStreamInfo возвращается в ответ на обращение к свойству NetStream.info, который делает снимок текущего состояния QOS и предоставляет статистику QOS через свойства NetStreamInfo.

Класс NetStreamInfo имеет следующие статистические свойства, они доступны только для чтения и все являются типом Number:

  • audioBufferByteLength — Представляет размер буфера аудиоданных NetStream (в байтах).
  • audioBufferLength — Представляет информацию о размере буфера для аудиоданных NetStream (в секундах).
  • audioByteCount — Указывает общее число байтов аудио, поступивших в очередь независимо от того, сколько было воспроизведено или очищено.
  • audioBytesPerSecond — Указывает скорость заполнения аудиобуфера NetStream (в байтах в секунду).
  • audioLossRate — Задает уровень потери аудио для сеанса NetStream.
  • byteCount — Указывает общее число байтов, поступивших в очередь независимо от того, сколько было воспроизведено или очищено.
  • currentBytesPerSecond — Указывает скорость заполнения буфера NetStream (в байтах в секунду).
  • dataBufferByteLength — Представляет размер буфера данных NetStream (в байтах).
  • dataBufferLength — Представляет информацию о размере буфера для данных NetStream (в секундах).
  • dataByteCount — Указывает общее число байтов сообщений с данными, поступивших в очередь независимо от того, сколько было воспроизведено или очищено.
  • dataBytesPerSecond — Указывает скорость заполнения буфера данных NetStream (в байтах в секунду).
  • droppedFrames — Возвращает количество видеокадров, потерянных в текущем сеансе воспроизведения NetStream.
  • maxBytesPerSecond — Указывает максимальную скорость заполнения буфера NetStream (в байтах в секунду).
  • playbackBytesPerSecond — Возвращает скорость воспроизведения потока (кол-во байтов в секунду).
  • SRTT — Приближенное время на передачу и подтверждение (SRTT) для сеанса NetStream, в миллисекундах. Это свойство содержит действительное значение только для потоков RTMFP. Для потоков RTMP возвращается значение 0.
  • videoBufferByteLength — Представляет размер видеобуфера NetStream (в байтах).
  • videoBufferLength — Представляет информацию о размере буфера для видеоданных NetStream (в секундах).
  • videoByteCount — Указывает общее число байтов видео, поступивших в очередь независимо от того, сколько было воспроизведено или очищено.
  • videoBytesPerSecond — Указывает скорость заполнения видеобуфера NetStream (в байтах в секунду).
  • videoLossRate — Сообщает процент потерь видеоданных, передаваемых через объект NetStream (процент потерянных сообщений по отношению к общему числу сообщений).

Класс NetStreamMulticastInfo

Класс NetStreamMulticastInfo определяет различные статистические данные о качестве обслуживания (QoS), связанные с базовой передачей потоков путем одноранговой связи RTMFP и групповой адресации IP объекта NetStream. Объект NetStreamMulticastInfo возвращается свойством NetStream.multicastInfo.
Свойства, которые возвращают числа, представляют общие суммы, вычисленные с начала группового потока. Эти типы свойств включают число отправленных байтов медиасодержимого или число полученных сообщений о фрагментах медиасодержимого. Свойства, которые представляют частоту, содержат снимок текущей частоты, вычисленной как среднее значение за несколько секунд. Эти типы свойств включают частоту, с которой локальный узел получает данные.

Класс NetStreamMulticastInfo имеет следующие статистические свойства, они доступны только для чтения и все являются типом Number:

  • bytesPushedFromPeers — Определяет число байтов медиасодержимого, предварительно переданных одноранговыми узлами и полученных локальным узлом.
  • bytesPushedToPeers — Определяет число байтов медиасодержимого, которые локальный узел предварительно передал одноранговым узлам.
  • bytesReceivedFromIPMulticast — Определяет число байтов медиасодержимого, полученных локальным узлом через групповую адресацию IP.
  • bytesReceivedFromServer — Определяет число байтов медиасодержимого, полученных локальным узлом от сервера.
  • bytesRequestedByPeers — Определяет число байтов медиасодержимого, которые локальный узел отправил одноранговым узлам в ответ на их запросы определенных фрагментов.
  • bytesRequestedFromPeers — Определяет число байтов медиасодержимого, которые локальный узел запросил и получил от сервера.
  • fragmentsPushedFromPeers — Определяет число сообщений о фрагментах, предварительно переданных одноранговыми узлами и полученных локальным узлом.
  • fragmentsPushedToPeers — Определяет число сообщений о фрагментах, которые локальный узел предварительно передал одноранговым узлам.
  • fragmentsReceivedFromIPMulticast — Определяет число сообщений о фрагментах, полученных локальным узлом через групповую адресацию IP.
  • fragmentsReceivedFromServer — Определяет число сообщений о фрагментах, полученных локальным узлом от сервера.
  • fragmentsRequestedByPeers — Определяет число сообщений о фрагментах, которые локальный узел отправил одноранговым узлам в ответ на их запросы определенных фрагментов.
  • fragmentsRequestedFromPeers — Определяет число сообщений о фрагментах, которые локальный узел запросил и получил от сервера.
  • receiveControlBytesPerSecond — Определяет скорость (байт в секунду), с которой локальный узел получает сообщения о переполнении из-за управляющей информации от одноранговых узлов.
  • receiveDataBytesPerSecond — Определяет скорость (байт в секунду), с которой локальный узел получает медиасодержимое от одноранговых узлов, сервера и через групповую адресацию IP.
  • receiveDataBytesPerSecondFromIPMulticast — Определяет скорость (байт в секунду), с которой локальный узел получает данные через групповую адресацию IP.
  • receiveDataBytesPerSecondFromServer — Определяет скорость (байт в секунду), с которой локальный узел получает медиасодержимое от сервера.
  • sendControlBytesPerSecond — Определяет скорость (байт в секунду), с которой локальный узел отправляет сообщения о переполнении из-за управляющей информации одноранговым узлам и серверу.
  • sendControlBytesPerSecondToServer — Определяет скорость (байт в секунду), с которой локальный узел отправляет сообщения о переполнении из-за управляющей информации серверу.
  • sendDataBytesPerSecond — Определяет скорость (байт в секунду), с которой локальный узел отправляет медиасодержимое одноранговым узлам.

Для работы напрямую с классом NetStream, а также с его свойствами: info и multicastInfo, возвращяющим экземпляры класса NetStreamInfo и NetStreamMulticastInfo соответственно, из OSMF, требуется произвести переопределение метода createNetStream в классе org.osmf.net.NetLoader или классе наследованным от NetLoader. Также требуется ввести get метод для NetStream, который будет возвращать класс NetStream при запросе из класса родителя.

В примере продемонстрированно осуществление доступа к классу NetStream, а также к его свойству info, при использовании фреймворка OSMF и загрузчика org.osmf.net.MulticastNetLoader.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
//Создаем класс CustomMulticastNetLoader на базе класса MulticastNetLoader
//и переопределяем метод  createNetStream

package
{
import org.osmf.net.MulticastNetLoader;
import org.osmf.net.MulticastResource;
import org.osmf.media.URLResource;

import flash.net.NetStream;
import flash.net.NetConnection;

public class CustomMulticastNetLoader extends MulticastNetLoader
{
public function CustomMulticastNetLoader(factory:NetConnectionFactoryBase = null)
{
super(factory);
}

public function getNetStream():NetStream {
return _netStream;
}

private var _netStream:NetStream;

override protected function createNetStream(connection:NetConnection, resource:URLResource):NetStream
{
var rs:MulticastResource = resource as MulticastResource;
_netStream = new NetStream(connection, rs.groupspec);
return _netStream;
}
}
}

Создаем тестовый p2p плеер, используя в нем в качестве загрузчика класс CustomMulticastNetLoader.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
package
{
import flash.display.Sprite;
import flash.utils.Timer;
import flash.events.TimerEvent;
import flash.net.NetStream;
import flash.net.NetStreamInfo;
import flash.net.NetStreamMulticastInfo;

import org.osmf.media.MediaPlayer;
import org.osmf.containers.MediaContainer;
import org.osmf.elements.VideoElement;
import org.osmf.net.MulticastResource;

import CustomMulticastNetLoader;

public class TestPlayer extends Sprite
{
public function TestPlayer()
{
initPlayer();
initMainTimer();
}

private var loader:CustomMulticastNetLoader;

private function initPlayer():void
{
var resource:MulticastResource = new MulticastResource("your application URI", "your stream name");
resource.groupspec = "your descriptor";
resource.streamName = "your stream name";

loader = new CustomMulticastNetLoader();

var videoElement = new VideoElement(resource, loader);

var mediaPlayer:MediaPlayer = new MediaPlayer();
mediaPlayer.media = videoElement;
mediaPlayer.volume = 0.5;

var container:MediaContainer = new MediaContainer();
container.width = 800;
container.height = 450;
container.addMediaElement(videoElement);
addChild(container);
}

private function initMainTimer():void
{
var mainTimer:Timer = new Timer(1000, 0);
mainTimer.addEventListener(TimerEvent.TIMER, onMainTimerTickHandler);
mainTimer.start();
}

private function onMainTimerTickHandler(evt:TimerEvent):void
{
var netStream:NetStream = loader.getNetStream();
var netStreamInfo:NetStreamInfo = netStream.info;
var netStreamMulticastInfo:NetStreamMulticastInfo = netStream.multicastInfo;

//Выводим статистичесую информацию NetStreamInfo
trace("Video buffer length in byte: " + netStreamInfo.videoBufferByteLength);
trace("Video buffer length in seconds: " + netStreamInfo.videoBufferLength);
trace("Video byte/sec: " + netStreamInfo.videoBytesPerSecond);
trace("Video loss rate: " + netStreamInfo.videoLossRate);

//Выводим статистичесую информацию NetStreamMulticastInfo
trace("Bytes pushed FROM peers: " + netStreamMulticastInfo.bytesPushedFromPeers);
trace("Bytes pushed TO peers: " + netStreamMulticastInfo.bytesPushedToPeers);
trace("Receive data bytes/second: " + netStreamMulticastInfo.receiveDataBytesPerSecond);
trace("Send data bytes/second: " + netStreamMulticastInfo.sendDataBytesPerSecond);
}
}
}

После компиляции тестового плеера, в отладочной консоли каждую секунду появляется статистический срез следующих параметров (метрик): videoBufferByteLength, videoBufferLength, videoBytesPerSecond, videoLossRate, а также параметров P2P: bytesPushedFromPeers, bytesPushedToPeers, receiveDataBytesPerSecond, sendDataBytesPerSecond.

Такой метод доступа к классу NetStream можно применить ко всем классам-загрузчикам фреймворка OSMF. (HTTPStreamingNetLoader, RTMPDynamicStreamingNetLoader, DVRCastNetLoader, NetLoader).

TiViSta — Наш сервис с открытым исходным кодом для отправки статистических данных в Google Analytics.