To jest aktywny obszar badań. Tak się złożyło, że wykonałem trochę pracy w tej dziedzinie, więc podzielę się, co mogę, o podstawowym pomyśle (ta praca była z partnerami z branży i nie mogę ujawnić tajnych szczegółów :)).
Tl; dr polega na tym, że często można zidentyfikować zaszyfrowany strumień ruchu jako przenoszący wideo i często można oszacować jego rozdzielczość - ale jest to skomplikowane i nie zawsze dokładne. Wiele osób pracuje nad sposobami, aby to zrobić bardziej konsekwentnie i dokładniej.
Ruch wideo ma pewne cechy, które pozwalają odróżnić go od innych rodzajów ruchu. Tutaj odnoszę się konkretnie do wideo na żądanie, a nie do transmisji strumieniowej na żywo. Wideo na żądanie często nie ma tych tagów priorytetowych, o których mowa w tej odpowiedzi. Odnoszę się również konkretnie do wideo adaptacyjnego, co oznacza, że wideo jest podzielone na segmenty (każdy o długości około 2-10 sekund), a każdy segment wideo jest kodowany na wielu poziomach jakości (poziom jakości oznacza: długoterminowy bitrate wideo, kodek, i rozdzielczość). Podczas odtwarzania wideo poziom jakości, przy którym następny segment jest pobierany, zależy od szybkości transmisji danych, którą według aplikacji może obsługiwać Twoja sieć. (To jest protokół DASH, o którym mowa w tej odpowiedzi).
Jeśli Twój telefon odtwarza wideo i patrzysz na (ważoną średnią ruchomą) przepływność danych przechodząc do telefonu, może to wyglądać mniej więcej tak:
(jest to przechwycone z sesji YouTube w sieci Verizon. Jest średnią ruchomą powyżej 15 sekund, a także średnią krótkoterminową.)
Ta sesja składa się z kilku różnych części:
Najpierw aplikacja wideo (odtwarzacz YouTube) próbuje wypełnić bufor do jego pojemności. W tym czasie pobiera dane z jakąkolwiek szybkością obsługiwaną przez sieć. Na tym etapie jest to w zasadzie nie do odróżnienia od pobierania dużego pliku, chyba że można wywnioskować, że jest to ruch wideo z adresu zdalnego (jak wspomniano w tej odpowiedzi).
Gdy bufor jest pełny, wtedy pojawiają się „serie” w dość regularnych odstępach czasu. Załóżmy, że twój bufor może pomieścić 200 sekund wideo. Gdy bufor zawiera 200 sekund wideo, aplikacja przestaje pobierać. Następnie po odtworzeniu fragmentu wideo (powiedzmy 5 sekund) w buforze jest znowu miejsce, więc pobierze następny segment, a następnie zatrzyma się ponownie. To właśnie powoduje ten pękający wzór.
Ten wzorzec jest bardzo charakterystyczny dla wideo - ruch z innych aplikacji nie ma tego wzorca - więc dostawca usług sieciowych może dość łatwo wybrać przepływy, które przenoszą ruch wideo. W niektórych przypadkach możesz nigdy nie zaobserwować tego wzorca - na przykład, jeśli wideo jest tak krótkie, że cała rzecz jest ładowana do bufora od razu, a następnie klient przerywa pobieranie. W takich okolicznościach bardzo trudno jest odróżnić ruch wideo od pobierania pliku (chyba że można to ustalić na podstawie adresu zdalnego).
W każdym razie, gdy już zidentyfikujesz przepływ jako przenoszący ruch wideo - albo przez adres zdalny (nie zawsze jest to możliwe, ponieważ główni dostawcy wideo używają sieci dystrybucji treści, które nie są wyłączne dla wideo) lub przez wzorzec ruchu (możliwe, jeśli sesja wideo jest długa, znacznie trudniejsza, jeśli jest tak krótka, że ładuje się całe wideo) do bufora) ...
Teraz, jak powiedział Hector, możesz spróbować odgadnąć rozdzielczość na podstawie szybkości transmisji, patrząc na rozmiar (w bajtach) każda „seria” danych:
Na podstawie rozmiaru na czas trwania możesz rozsądnie oszacować rozdzielczość - zwłaszcza jeśli trzymasz średnią kroczącą.
Ale może to być trudne. Weźmy na przykład sesję YouTube:
- Nie wszystkie segmenty mają taki sam czas trwania - czas trwania żądanego wideo zależy od kilku czynników (poziom jakości, stan sieci, rodzaj urządzenia na którym odtwarzasz wideo i inne). Nie możesz więc koniecznie spojrzeć na „serię” i powiedzieć: „OK, to było X bajtów reprezentujących 5 sekund wideo, więc znam szybkość transmisji wideo”. Czasami możesz określić prawdopodobny czas trwania segmentu, ale innym razem jest to trudne.
- Dla danego poziomu jakości wideo i czasu trwania segmentu, różne segmenty będą miały różne rozmiary (w zależności od rzeczy, takich jak intensywność ruchu w tej części wideo).
- Nawet dla tej samej rozdzielczości wideo, długoterminowa szybkość transmisji danych może się różnić - wideo 1080p zakodowane za pomocą VP9 nie będzie miało takiej samej długoterminowej szybkości transmisji danych jak zakodowane z H.264.
- Poziom jakości wideo zmienia się w zależności od postrzeganej jakości sieci (która jest widoczna dla dostawcy usług sieciowych) i stanu bufora (który nie jest). Możesz więc spojrzeć na długoterminowe szybkości transmisji danych powyżej 30 sekund, ale możliwe jest, że rzeczywisty poziom jakości wideo zmienił się kilka razy w ciągu tych 30 sekund.
- W okresach, gdy bufor wyczerpuje się lub zapełnia tak szybko, jak (jeśli nie masz tych „serii”), znacznie trudniej jest oszacować, co się dzieje w filmie.
- Aby jeszcze bardziej skomplikować sprawę: czasami przepływ wideo będzie „rozłożony” na wiele przepływy niższych warstw. Czasami część wideo zostanie pobrana z jednego adresu, a następnie przełączy się na pobieranie wideo z innego adresu.
Ten wykres szybkości transmisji danych, który pokazałem powyżej? Oto jaka była rozdzielczość wideo w tym przedziale czasowym:
W tym przypadku kolor wskazuje rozdzielczość wideo. Więc ... możesz w pewnym sensie oszacować, co się dzieje, tylko na podstawie wzorców ruchu. Ale to trudny problem! W ruchu są inne znaczniki, na które możesz spojrzeć. Nie mogę definitywnie powiedzieć, jak robi to jeden usługodawca. Ale przynajmniej jeśli chodzi o akademicki stan wiedzy, nie ma sposobu, aby robić to z idealną dokładnością przez cały czas (chyba że współpracujesz z dostawcami wideo ...)
Jeśli chcesz dowiedzieć się więcej o technikach stosowanych w tego rodzaju problemach, istnieje wiele literatury akademickiej - zobacz na przykład BUFFEST: Przewidywanie warunków bufora i wymagań w czasie rzeczywistym protokołu HTTP (S) Adaptive Streaming Clients jako punkt wyjścia. (Nie mój artykuł - tylko taki, który ostatnio czytałem.)