This post is also available in: Английский
Для обеспечения лучшего качества предоставления услуг по вещанию онлайн видео, требуется принимать во внимание статистические данные о состоянии потока, которые можно получить путем использования двух классов: 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.