Concepts de base de l'audio et de la vidéo (6) - Les bases de la vidéo

Lorsque nous surfons sur Internet, nous entrons en contact avec des médias en streaming réseau et des fichiers vidéo locaux. Les formats de fichiers vidéo courants incluent MP4, MKV, AVI, etc. Les protocoles couramment utilisés pour visionner des vidéos sur des sites Web de médias en streaming incluent HTTP, RTSP, RTMP, HLS, etc. La technologie vidéo est relativement complexe et comprend l'encapsulation vidéo, l'encodage et le décodage vidéo, la lecture vidéo et le transcodage vidéo.

1 Concepts de base de la vidéo

Il existe aujourd'hui de nombreuses applications vidéo courantes sur le marché, parmi lesquelles la définition vidéo 1080P est devenue populaire et les films et émissions de télévision 4K deviennent progressivement disponibles.

PS : 1080P fait référence à la résolution vidéo de balayage progressif 1920*1080.

1.1 Images et pixels

L'image est la base de la vision humaine, où « image » est la distribution de la lumière réfléchie ou réfractée par un objet, et « image » est l'impression ou la compréhension formée dans le cerveau humain à partir de l'image reçue par le système visuel humain. Dans le domaine informatique, il existe de nombreux concepts liés aux images, tels que les pixels, le PPI, la profondeur de bits de l'image, etc.

1.1.1 Pixels

L'image est essentiellement composée de nombreux "points colorés", et ces points sont des "pixels". Le nom anglais du pixel est Pixel, abrégé en PX. Ce mot est composé de deux mots : image et élément.

Le pixel est l'unité de base de l'affichage d'une image. La résolution fait référence au produit de la largeur et de la hauteur d'une image, et l'unité est le pixel. Habituellement, lorsque l'on parle de la taille d'une image, par exemple 1920*1080 pixels, cela signifie que la largeur est de 1920 pixels et la hauteur est de 1080 pixels. Leur produit est 1920*1080=2 073 600, ce qui signifie que l'image fait deux millions de pixels. Dans le même temps, 1920*1080 est également appelé la résolution de cette image.

PS : La résolution est un indicateur important d’un moniteur.

1.1.2 IPP

Pixels par pouce, PPI) correspond au nombre de "pixels" pouvant être placés par pouce de surface sur l'écran d'un téléphone mobile (ou d'un ordinateur). Plus lavaleur est élevée, plus l'image sera claire et détaillée.

Les téléphones multifonctions précédents avaient un PPI d'écran très faible, une qualité d'image médiocre et une forte sensation granuleuse.

Les spécifications courantes des appareils photo numériques sont 72PPI, 180PPI et 300PPI.

DPI (Dots Per Inch) fait référence à la résolution de sortie, qui est pour le périphérique de sortie. La résolution de sortie de l'imprimante laser générale est [300 DPI, 600 DPI], et la photocomposeuse d'impression peut atteindre [1200 DPI, 2400 DPI]. Impression commune Généralement, il est [150DPI, 300DPI].

1.1.3 Couleur

Les pixels doivent avoir de la couleur pour former une image colorée. Lorsque les pixels sont uniquement en noir et blanc, l'image est une image en noir et blanc.

Dans les ordinateurs, R (Rouge), G (Vert) et B (Bleu) sont également appelés « composants de couleur primaire ». La plage de valeurs des éléments individuels est de 0 à 255, avec un total de 256 niveaux. N'importe quelle couleur peut être représentée par une combinaison des trois valeurs de RVB, comme la pâte de haricot rouge vert RVB = (199, 237, 204) pour protéger les yeux.

RVB a 3 composants. On suppose que chaque composant occupe 8b et les valeurs sont respectivement de 0 à 255. La valeur combinée des trois composants est alors de 256*256*256=16777216 couleurs, également appelée 16 millions de couleurs. Cette gamme de couleurs dépasse toutes les couleurs visibles à l’œil humain, c’est pourquoi on l’appelle aussi vraie couleur.

Chacune des trois couleurs RVB possède 8b. La couleur exprimée de cette manière est également appelée vraie couleur 24 bits.

1.1.4 Profondeur de bits des pixels

La profondeur de bits des pixels fait référence au nombre de bits utilisés par pixel, qui détermine le nombre de couleurs possibles par pixel dans une image couleur, ou le nombre de niveaux de gris possibles par pixel dans une image en niveaux de gris.

La profondeur de bits des pixels est généralement appelée profondeur de l'image, ce qui signifie que plus il y a de bits par pixel, plus il peut exprimer de couleurs et plus sa profondeur est profonde.

Ne recherchez pas une profondeur de pixels particulièrement profonde dans une dimension, car cela n'a aucune signification pratique. Parce que plus la profondeur des pixels est profonde, plus la quantité de données est importante, plus la bande passante de transmission et l'espace de stockage sont importants. Au contraire, si la profondeur des pixels est trop faible, la qualité de l’image sera affectée et l’image paraîtra rugueuse et peu naturelle.

1.2 Espace colorimétrique

RVB correspond aux trois couleurs primaires et peut mélanger toutes les couleurs. Les espaces colorimétriques courants incluent RVB, YUV et HSV.

1.2.1 RVB

L'espace colorimétrique RVB (également connu sous le nom de modèle colorimétrique, espace colorimétrique) se compose de trois couleurs primaires : rouge, vert et bleu, et est largement utilisé en BMP, TIFF, PPM, etc.

1.2.2 VOUS

L’espace colorimétrique YUV est un format de couleur qui sépare la luminosité et la saturation. YUV est principalement utilisé pour optimiser la transmission des signaux vidéo couleur, les rendant ainsi rétrocompatibles avec les anciens téléviseurs noir et blanc. Par rapport à la transmission du signal vidéo RVB, son plus grand avantage est qu'il n'occupe qu'une très petite bande passante (RVB nécessite la transmission simultanée de trois signaux vidéo indépendants), où Y représente la luminosité, qui est la valeur de l'échelle de gris, et U et V représenter Il représente la chrominance, qui est utilisée pour décrire la couleur et la saturation de l'image et est utilisée pour spécifier la couleur du pixel.

1.2.3 HSV

Les modèles de couleurs RVB et YUV sont orientés matériel, tandis que le modèle de couleurs HSV est orienté utilisateur. La représentation tridimensionnelle du modèle de couleur HSV évolue à partir du cube RVB. Parmi eux, H (teinte), S (saturation) et V (luminosité).

1.3 Vidéo numérique

La vidéo numérique est une vidéo enregistrée sous forme numérique, par opposition à la vidéo analogique. La vidéo numérique peut être produite, stockée et diffusée de différentes manières.

1.3.1 Images et vidéos

L’image est la représentation d’un matériau que les gens perçoivent visuellement. Les objets dans des scènes naturelles tridimensionnelles incluent des informations sur la profondeur, la texture et la luminosité. Les images bidimensionnelles incluent principalement des informations sur la texture et la luminosité.

La vidéo est essentiellement une image continue. La vidéo se compose de plusieurs images contenant des informations sur le mouvement des objets, également appelées images animées.

1.3.2 Vidéo numérique

La vidéo numérique peut être comprise comme une représentation numérique échantillonnée de l’espace et du temps d’une scène naturelle. Le principal indicateur technique de l'échantillonnage spatial est la résolution (quelque peu liée aux pixels), et le principal indicateur technique de l'échantillonnage temporel est la fréquence d'images.

Le flux système de la vidéo numérique comprend trois étapes : la collecte, le traitement et l'affichage.
1. Collecte : on utilise généralement des appareils photo, des téléphones portables et des caméras vidéo.
2. Traitement : y compris les codecs et les équipements de transmission.
3. Affichage : un moniteur est généralement utilisé pour le rendu de vidéo numérique.

1.3.3 SVH

Le système visuel humain (HVS) comprend les yeux, les nerfs et le cerveau. Système de traitement de l'information optique d'analyse comparative de l'œil humain.

PS : Bien que les abréviations anglaises de HVS et HSV soient très similaires, ce sont deux concepts complètement différents.

Les humains obtiennent des informations d'image externes grâce au HVS. Lorsque le rayonnement lumineux stimule l'œil humain, la sensation de changements physiologiques et psychologiques complexes est appelée vision. La recherche à HVS couvre de nombreux domaines scientifiques dont l'optique, la colorimétrie, la psychologie visuelle, l'anatomie, les neurosciences et les sciences cognitives.

Sur la base des caractéristiques du HVS, la conception du système vidéo numérique doit prendre en compte les facteurs suivants :

1) Supprimez les informations haute fréquence et codez les informations basse fréquence.

2) Améliorer la qualité subjective des informations de bord.

3) Réduisez la résolution de la chrominance.

4) Effectuer un traitement spécial sur la région d'intérêt (ROI).

PS : En vision industrielle et en traitement d'image, l'image traitée délimite la zone requise sous forme de rectangles, de cercles, d'ellipses, de polygones irréguliers, etc., que l'on appelle la zone d'intérêt.

1.3.4 Format d'échantillonnage YUV

Les images YUV peuvent échantillonner la chrominance en fonction des caractéristiques du HVS, ce qui peut réduire la quantité de données vidéo. En fonction du taux d'échantillonnage des composantes de luminance et de chrominance, les formats d'échantillonnage des images YUV incluent généralement 4:4:4, 4:2:3 et 4:2:0.

1.3.5 Résolution de luminosité YUV

Selon la luminosité de l'image YUV, plusieurs résolutions courantes sont définies.

Nom du format

Résolution de luminance

SQCIF

128*96

QCIF

176*144

CIF

352*288

4CIF

704*576

Dakota du Sud

720*576

HD

1280*720

1.4 Concepts de base de la vidéo

La vision humaine présente un phénomène de persistance. Les changements d'image dépassant 24 images par seconde semblent être fluides et continus. Cette image continue est appelée vidéo.

1.4.1 Cadre

Le cadre correspond à chaque image dans les vidéos, les animations et les jeux. Ces vidéos, animations et jeux sont composés d'innombrables images. Chaque image est un cadre. Les images vidéo sont divisées en images I, images P et images B.

I frame, trame de codage intra-image, dans la plupart des cas, I frame est une image clé, c'est-à-dire une image complète, une image qui peut être affichée indépendamment sans aucune aide.

La trame P, trame de codage prédictif direct, est une trame incomplète, qui est générée en se référant à la trame I ou à la trame P précédente.

Les trames B, trames de codage prédictif bidirectionnel, sont générées par codage en référence aux trames d'image précédentes et suivantes, et aident à former une image en se référant à la trame I/P précédente ou à la trame P suivante.

Par exemple, une séquence vidéo avec uniquement des images I et P, I1P1P2P3P4I2P5P6P7P8. Y compris la séquence de trame I, de trame P et de trame B, I1P1P2B1 P3P4B2 P5I2B3 P6P7.

PS : Le décodeur dispose d'un cache, généralement en unités GOP, afin que la trame B puisse faire référence à sa trame P suivante.

1.4.2 Cadres et champs

La plupart des téléviseurs utilisent 25 images par seconde, c'est-à-dire que 25 images sont remplacées chaque seconde. En raison de la persistance de l'effet visuel, l'œil humain ne ressentira pas de scintillement. Chaque image est divisée en deux champs pour le balayage. Le balayage signifie ici que le faisceau d'électrons balaie ligne par ligne dans la direction horizontale de haut en bas dans le tube image. Dans le premier champ, les lignes impaires sont balayées en premier, et dans le deuxième champ, les lignes paires sont numérisées. C'est ce qu'on appelle souvent le balayage entrelacé. Après avoir numérisé deux champs, une image est complétée.

Si la fréquence du champ est de 50 Hz et la fréquence de l'image est de 25 Hz, le champ impair et le champ pair balayent la même image. À moins que l'image ne soit stationnaire, les deux images adjacentes seront différentes. La méthode de balayage des écrans d'ordinateur et des tubes cathodiques de télévision est la même, donc une image comprend deux champs, à savoir le champ supérieur et le champ inférieur.

1.4.3 Balayage progressif et entrelacé

Chaque image est formée en balayant continuellement des rangées de faisceaux d'électrons de manière séquentielle. Cette méthode de balayage est appelée balayage progressif.

Compléter chaque image d'image à travers deux champs de numérisation est une numérisation entrelacée. Dans les deux champs de numérisation, le premier champ (champ impair) scanne uniquement les lignes impaires et scanne 1, 3, 5, 7 lignes, etc. le deuxième champ (champ pair) scanne uniquement les lignes impaires. field) scanne uniquement les lignes paires, en balayant 2, 4, 6, 8 lignes à la fois, etc. La technologie d'entrelacement joue un rôle important lorsque la bande passante du signal de transmission est insuffisante.

La principale différence entre les effets d'affichage du balayage progressif et du balayage entrelacé est la stabilité. Le scintillement entre les lignes du balayage entrelacé est plus évident. Le balayage progressif surmonte les défauts du balayage entrelacé et l'image est fluide et naturelle sans scintillement. Dans le mode d'affichage standard du téléviseur, i correspond à un balayage entrelacé et p à un balayage progressif.

1.4.4 Cadres

Les images correspondent au nombre d'images, qui peut être interprété comme le nombre d'images fixes.

1.4.5 Fréquence d'images

La fréquence d'images est une mesure utilisée pour mesurer le nombre d'images affichées. L'unité est f/s (Frames Per Second) ou Hertz (Hz), qui est le nombre d'images affichées par seconde. Plus la fréquence d'images est élevée, plus l'image est fluide et réaliste, plus les besoins en puissance de traitement de la carte graphique sont élevés et plus la quantité de données est importante. Pour les vidéos telles que les films, 24f/s répond aux besoins de visionnage, mais pour les jeux, l'expérience n'est pas assez fluide. Par exemple, lorsque vous jouez à League of Legends, si le FPS dans le coin supérieur droit n'est que de 20, vous vous sentirez coincé.

Les fréquences d'images courantes sont les suivantes :

  • 10~12f/s : En raison de la structure physiologique particulière de l’œil humain, lorsque l’image est supérieure à 10~12 images par seconde, la vidéo sera considérée comme cohérente.

  • 24f/s : fréquence d'images générale pour l'enregistrement et la lecture de films.

  • 60f/s : Cette fréquence d’images présente un degré élevé de fluidité pour la reconnaissance de l’œil humain.

  • 85f/s : limite du traitement vidéo par le cerveau humain. L'œil humain ne peut pas distinguer les différences dans les fréquences plus élevées.

1.4.6 Taux de rafraîchissement

Le nombre de fois que l'écran est rafraîchi par seconde, divisé en taux de rafraîchissement vertical et taux de rafraîchissement horizontal. Le taux de rafraîchissement généralement évoqué est le taux de rafraîchissement vertical, mesuré en Hertz (Hz) : plus le taux de rafraîchissement est élevé, plus l'image est stable (plus l'affichage est clair et naturel).

Aujourd’hui, la plupart des moniteurs se rafraîchissent à 30 Hz, 60 Hz, 120 Hz ou 144 Hz, selon leurs paramètres. La fréquence de rafraîchissement la plus courante est de 60 Hz, ce qui hérite du réglage précédent de la fréquence de rafraîchissement du téléviseur de 60 Hz.

1.4.7 Résolution

La résolution correspond à la taille de l'écran ou aux dimensions des vidéos et des images. La résolution est mesurée en nombre de pixels horizontalement et verticalement, indiquant la finesse d'une image plate. La résolution vidéo ne dépend pas seulement de la résolution vidéo, elle dépend également de la résolution de l'écran.

Par exemple, le P dans 1080P fait référence à Progressive Scan, ce qui signifie pixels verticaux, c'est-à-dire « élevés », donc 1920*1080 est appelé 1080P, pas 1920P. Lorsqu'une vidéo 720P (1280*720P) est lue sur un écran 1080P, l'image doit être agrandie. L'opération d'agrandissement est également appelée suréchantillonnage.

1.4.8 Taux de codage

Le débit de code, ou débit binaire, fait référence au nombre de bits utilisés pour lire un média continu (tel que de l'audio ou de la vidéo compressé) par unité de temps. Il a différentes significations selon les domaines. Dans le domaine du multimédia, il fait référence au nombre de bits lus dans l'audio ou la vidéo par unité de temps, qui peut être compris comme débit ou bande passante. L'unité de débit de code est le b/s, qui correspond à la quantité de données transmises par seconde. Les unités couramment utilisées incluent le b/s, le kb/s, etc. Plus le débit est élevé, plus la bande passante est consommée. D'une manière générale, nous comprenons que le débit binaire est le taux d'échantillonnage. Plus le taux d'échantillonnage est élevé, plus la précision est élevée et meilleure est la qualité de l'image, mais plus la quantité de données est grande, nous devons donc trouver un point d'équilibre et utiliser le débit binaire le plus bas pour obtenir la plus petite distorsion.

La vidéo comporte des scènes changeantes à grande vitesse et des scènes presque statiques. La quantité de données requise pour ces deux types est également différente. Il n'est pas raisonnable d'utiliser le même débit binaire, c'est pourquoi un débit binaire dynamique est introduit. Le débit binaire dynamique (Variable Bit Rate, VBR) signifie que le débit binaire peut changer en fonction de la complexité de l'image.

Les fragments simples du contenu de l'image utilisent un débit binaire plus petit et les fragments complexes du contenu de l'image échantillonnent un débit binaire plus élevé, ce qui garantit non seulement la qualité de lecture, mais tient également compte de la limite du volume de données.

Le débit binaire constant (CBR) fait référence à un débit binaire constant. À l'heure actuelle, la qualité des clips avec un contenu d'image complexe est instable et la qualité des clips avec un contenu d'image simple est meilleure. En plus du VBR et du CBR, il existe également les CVBR (Constrained Variable Bit Rate), ABR (Average Bit Rate), etc.

1.4.9 CPU et GPU

Unité centrale de traitement (Central Processing Unit, CPU), comprenant l'unité arithmétique et logique (ALU) et la mémoire cache (Cache), ainsi que le bus (Bus) qui réalise la connexion entre eux (Données), le contrôle et l'état.

GPU est une unité de traitement graphique spécialement conçue pour effectuer des calculs mathématiques et géométriques complexes et dotée de fonctions d'accélération graphique bidimensionnelle et tridimensionnelle. Par rapport au CPU, le GPU dispose de capacités de calcul graphique bidimensionnelles et tridimensionnelles plus puissantes, qui peuvent libérer le CPU des tâches de traitement graphique et effectuer d'autres tâches système, ce qui peut considérablement améliorer les performances globales de l'ordinateur.

L'accélération matérielle consiste à utiliser des modules matériels pour remplacer les algorithmes logiciels afin d'exploiter pleinement les caractéristiques rapides inhérentes au matériel. L'accélération matérielle est généralement plus efficace que les algorithmes logiciels. Par exemple, les opérations liées aux calculs graphiques bidimensionnels et tridimensionnels sont confiées au GPU pour relâcher la pression sur le CPU, qui appartient à l'accélération matérielle.

1.5 Format vidéo

Il existe de nombreux formats vidéo, tels que les formats de fichiers vidéo, les formats d'encapsulation vidéo, les formats d'encodage vidéo, etc. Les formats de fichiers vidéo courants incluent MP4, RMVB, MKV, AVI, etc. Les formats d'encodage vidéo courants incluent MPEG-4, H.264, H.265, etc.

1.5.1 Format de fichier vidéo

Les noms de fichiers dans les systèmes Windows ont des suffixes, tels que 1.txt, 2.java, etc. L'objectif de la définition des noms de suffixes par Windows est de permettre aux applications du système d'identifier et d'associer ces fichiers, afin que les fichiers correspondants puissent être ouverts par les applications correspondantes.

Les formats de fichiers vidéo courants (MP4, RMVB, MKV, AV) sont associés au lecteur vidéo installé sur l'ordinateur et le format est déterminé par le nom du suffixe.

1.5.2 Format de packaging vidéo

Le format de packaging vidéo (également appelé conteneur) consiste à placer la piste vidéo et la piste audio encodées et compressées dans un fichier selon un certain format, c'est-à-dire qu'il s'agit simplement d'un shell, ou qu'il peut être utilisé comme une vidéo. piste et piste audio. Des dossiers de pistes sont également disponibles. AVI, MPEG et VOB sont des formats de packaging vidéo.

Les formats de packaging vidéo courants et les formats de fichiers vidéo correspondants sont les suivants :

Nom du format de packaging vidéo

Format de fichier vidéo

AVI (entrelacement audio-vidéo)

.avi

WMV (Vidéo Windows Media)

.wmv

MPEG (Groupe d'experts en images animées)

.mpg/.vob/.dat/.mp4

Matroska

.mkv

Vidéo réelle

.rm

Quick Time

.se déplacer

Vidéo Flash

.flv

下面介绍几种常用的视频封装格式。

(1)音频视频交错(Audio Video Interlaved,AVI)格式,后缀.avi,是微软1992年推出的。该视频格式优点是图像质量好。由于无损AVI可以保存alpha通道,所以经常被使用。但缺点太多,例如体积过于庞大,压缩标准不统一。

(2)DV格式(Digital Video Format),是由索尼、松下、JVC等多家厂商联合提出的一种家用数字视频格式。数字摄像机就是使用这种格式记录视频数据的。它可通过计算机的IEEE 1394端口将视频数据传输到计算机,也可以将计算机中编辑好的视频数据回录到数码摄像机中。这种视频格式的文件扩展名也是.avi。电视台采用录像带记录模拟信号,通过EDIUS有IEEE 1394端口采集卡从录像带中采集出来的视频就是这种格式。

(3)MOV格式是苹果公司开发的一种视频格式,默认的播放器是苹果的QuickTime,具有较高的压缩比率和较完美的视频清晰度等特点,可以保存alpha通道。

(4)MPEG格式,文件后缀可以是.mpg、.dat、.vob、.mp4等。MPEG文件格式是运动图像压缩算法的国际标准。MPEG格式目前有3个压缩标准,分别是MPEG-1、MPEG-2和MPEG-4。

(5)WMV(Windows Media Video)格式,后缀为.wmv或.asf,也是微软公司退出的一种采用独立编码方式并且可以直接在网上实时观看视频节目的文件压缩格式。WMV格式主要优点包括本地或网络回放、丰富的流间关系及扩展性等。

(6)Flash Video格式,是由Adobe Flash延伸出来的一种流行网络视频封装格式,后缀.flv。随着H5视频标准的普及,Flash正在逐步淘汰中。

(7)Matroska格式,是一种新的多媒体封装格式,后缀为.mkv。这种封装格式可把多种不同编码的视频及16条或以上不同格式的音频和不同语言的字幕封装到一个Matroska Media文档中。它是一个开放源代码的多媒体封装格式,还可以提供非常好的交互功能,比MPEG更方便强大。

1.5.3 视频编码格式

视频编码格式是指能够对数字视频进行压缩或者解压缩的程序或者设备,也可以指通过特定的压缩技术,将某种视频格式转换成另一种视频格式。通常这种压缩属于有损压缩。

视频的编码格式才是一个视频文件的本质所在,不要简单地通过文件格式和封装形式来区分视频。常见的视频编码格式有H.26X系列、MPEG系列及其他系列。

(1)H.26X系列由ITU主导的,主要包括H.261、H.262、H.263、H.264、H.265等。H.261主要在较早的视频会议和视频电话产品中使用。H.263主要用在视频会议、视频电话和网络视频上。H.264即H.264/MPEG-4第十部分,或称AVC,是一种视频压缩标准,也是一种广泛使用的高精度视频的录制、压缩和发布格式。H.265及高效率视频编码是一种视频压缩标准,是H.264/MPEG-4 AVC的继任者,是它们两倍的压缩率。

(2)MPEG系列是由ISO下属的MPEG开发的,视频编码上主要包括几部分。MPEG-1第二部分主要使用在VCD上,有些在线视频也使用这种方式,该编解码器的质量大致上和原有的VHS录像带相当。MPEG-2第二部分(等同于H.262)使用在DVD\SVCD和大多数数字视频广播系统和有线分布系统中。MPEG-4第二部分可以使用在网络传输、广播和媒体存储上,相比于之前的系列其压缩性能有所提升。MPEG-4第十部分和ITU-T的H.264采用的是相同的标准。

(3)其他系列的视频编码格式包括AMV、AVS、Bink、CineForm、Cinepak、Dirac、DV、RealVideo、RTVideo、SheerVideo、Smacker、Sorenson、Video、VC-1、VP3、VP6、VP7、VP8、VP9、WMV等。但此类编码方式不常用。

2 音视频封装

常见AVI、RMVB、MKV、ASF、WMV、MP4、3GP、FLV等其实只能算是一种封装标准。完整的视频文件是由音频和视频两部分构成的,如H.264、Xvid等就是视频编码格式,MP3、AAC等就是音频编码格式。

将一个Xvid视频编码文件和一个MP3音频编码文件按MP4封装标准进行封装后,就可以得到一个MP4为后缀的视频文件,也就是常见的MP4视频文件。

2.1 数据封装和解封装

数据封装(Data Encapsulation)就是把业务数据映射到某个封装协议的净荷中,然后填充对应协议的包头,就可以形成封装协议的数据包,并完成速率适配。

数据接封装就是封装的逆过程,拆解协议包,处理包头中的信息,取出净荷中的业务信息数据封装,这与封装是一对逆过程。数据的封装和解封装如下:

2.2 音视频的封装

视频编码后加上音频编码,再一起进行封装,就可以得到我们观看的视频。

封装格式也称为多媒体容器,只为多媒体编码提供了一个“外壳”,也就是将所有的处理好的音频、视频或字幕都包装到一个文件容器中以便呈现给用户,这个包装过程叫做封装。

2.3 封装格式

封装格式即音视频容器,如经常看到的视频后缀名.mp4、.rmvb、.avi、.mkv、.mov等音视频容器。常见的封装格式包括AVI、VOB、WMV、RM、RMVB、MOV、MKV、FLV、MP4、MP3、WebM、DAT、3GP、ASF、MPEG、OGG等。视频文件的封装格式并不影响视频的画质,影响视频画面质量的是视频的编码格式。完成的视频文件=音频+视频+字幕(字幕是可选项)。

MPG是MPEG编码所采用的容器,具有流的特性,里面又分PS和TS,PS主要用于DVD存储,TS主要用于HDTV.

OGG是Ogg项目所采用的容器,具有流的特性,支持多音轨、章节、字幕等。OGM是OGG容器的变种,能够支持基于DirectShow的视频音频编码,支持章节等特性。

2.3.1 MP4

MP4(MPEG-4 Part14)是一种常见的多媒体容器格式,它是在ISO/IEC 14496-14标准文件中定义的,属于MPEG-4的一部分。MP4是一种较为全面的容器格式,被认为可以在其中嵌入任何形式的数据,不过常见的大部分的MP4文件存放的是AVC(H.264)或者MPEG-4 Part 2编码的视频和AAC编码的音频。MP4格式的官方文件后缀名是.MP4,还有其他的以MP4为基础进行的扩展格式,如M4v、3GP、F4V等。

  1. box结构树

MP4文件中所有数据都装在box中,也就是说MP4由若干box组成,每个box有类型和长度,包含不同的信息,可以将box理解为一个数据对象块。box中可以嵌套另一个box,这种box称为container box。MP4文件box以树状结构的方式组织,一个简单的MP4文件由以下box组成,如下图(MP4info软件查看)。

根节点(ROOT)下,主要包含以下3个box节点,即ftyp(File Type Box)文件类型、moov(Movie Box)文件媒体信息和mdat(Media Data Box)媒体数据

2. ftyp

一个MP4文件有且仅有一个ftyp类型的box,作为MP4格式的标识并包含一些关于文件的信息。

ftyp是MP4文件的第1个box,包含了视频文件使用的编码格式、标准等。ftyp box通常放在文档的开始,通过对该box解析可以让软件(播放器、demux、解析器)之道应该使用哪种协议解析该文档,这是后续解读的基础。

C语言中定义MP4文件头结构体如下:

typedef struct{
  unsigned int length;                     // box长度为28,包含注释对应的这4个字节
  unsigned char name[4];                   // 4个字符:ftyp
  unsigned char majorBrand[4];
  unsigned int minorVersion;
  unsigned char compatibleBrands[12];
}FtypBox;

以下是一段十六进制的MP4文件数据。

00 00 00 20 66 74 79 70 69 73 6F 6D 00 00 02 00 ....ftypisom....
69 73 6F 6D 69 73 6F 32 isomiso.
3. moov

ftyp box之后会有一个moov类型的box,是一种container box,子box中包含了媒体的metadata信息。该box包含了文档媒体的metadata信息,moov是一个container box,具体内容信息由子box诠释。

同File Type Box一样,该box有且只有一个,并只被包含在文档层。一般来说,moov会紧随ftyp出现,moov中包含一个mvhd和两个trak(1个音频和1个视频)。其中mvhd为header box,作为moov的第一个子box出现(对于其他container box来讲,header box 都应当作为首个子box出现)。trak包含了一个track的相关信息,是一个container box。

4. mdat

MP4文件的媒体数据包含在mdat类型的box(Media Data Box)中,该类型的box也是container box,可以有多个,也可以没有(当媒体数据全部引用其他文件时),媒体数据的结构由metadata进行描述。

2.3.2 AVI

音频视频交错(Audio Video Interleaved,AVI)格式是很成熟的老技术了。在国际学术界公认AVI已经属于被淘汰的技术,但因为简单易懂的开发API,还在被广泛使用中。AVI符合RIFF(Resource Interchange File Format)文件规范,使用四字符码(Four-Character Code,FOURCC)表征数据类型。

AVI的文件结构分为头部、主题和索引3部分。主题中图像数据和声音数据是交互存放的,从尾部的索引可以索引到想放的位置。AVI本身只提供这个框架,内部的图像数据和声音数据格式可以是任意的编码形式。因为索引放在了文件尾部,所以在播放网络流媒体时已经力不从心(如从网络上下载AVI文件,如果没有下载完成,很难正常播放)。

  1. 基本数据单元

AVI中有两种最基本的数据单元,一个是Chunks,另一个是Lists,结构体如下:

// Chunks
typedef struct{
  DWORD dwFourcc;
  DWORD dwSize;           // data
  BYTE data[dwSize];      // contains headers or audio/video data
}CHUNK;

// Lists
typedef struct{
  DWORD dwList;
  DWORD dwSize;           // dwFourcc + data
  DWORD dwFourcc;         
  BYTE data[dwSize-4];    // contains Lists and Chunks
}LIST;

由如上代码可知,Chunks 数据块由四字符码、4B的data size(指下面的数据大小)及数据组成。Lists由4部分组成,包括4B的四字符码、4B的数据大小(指后面列的两部分大小)、4B的list类型及数据组成。与Chunks数据块不同的是,Lists数据内容可以包含字块(Chunks 或Lists)。

2.RIFF简介

RIFF是一种复杂的格式,其目的在于适用于多媒体应用的各种类型的数据。RIFF是微软公式为Windows GUI而创建的一种多媒体文件格式,它本身并没有定义任何存储数据的新方法,但是RIFF定义了一个结构化的框架,包含现有的数据格式。所以用户可以创建由两种或更多现有文件格式组成的新的复合格式。

多媒体应用需要存储和管理各种数据,包括位图、音频数据、视频数据和外围设备控制信息。RIFF提供了一种很好的方式来存储所有这些不同类型的数据。RIFF文件中包含的数据类型可以通过文件的后缀名来确认,例如常见的文件后缀名包括.avi、.wav、.rdi、.rmi和.bnd等。

PS: AVI是当前RIFF规范中使用最全面的一种类型。WAV也是经常被使用,但是它非常简单,WAV开发者通常使用旧的规范来构建它们。

只有编程人员才知道AVI文件和RIFF文件是同一种文件。

RIFF是一种包含多个嵌套数据结构的二进制文件格式,RIFF文件中的每个数据结构都称为块。块在RIFF文件中没有固定位置,因此标准偏移值不能用于定位它们的字段。因为块是由用户来定义的,所以每个块没有统一的位置。块包含数据,如数据结构、数据流或称为子块的其他块。每个RIFF块都具有以下基本结构:

typedef struct _Chunk{
  DWORD ChunkId;                          // Chunk ID marker
  DWORD ChunkSize;                        // Size of the chunk data in Bytes.
  BYTE ChunkData[ChunkSize];              // The chunk data.
} CHUNK;
PS: RIFF是以小端字节顺序写入的。字节顺序指占内存多于一个字节类型的数据在内存中的存放顺序,通常有小端、大端两种字节顺序。小端字节顺序指低字节数据存放在内存低地址处,高字节数据存放在内存高地址处;大端字节顺序指高字节数据存放在低地址处,低字节数据存放在高地址处。基于x86平台的PC是小端字节顺序地。

其中ChunkId包含4个ASCII字符,用于标识块包含的数据。例如字符RIFF用于识别包含RIFF数据的块。如果ID小于4个字符,则使用空格(ASCII 32)在右侧填充。ChunkSize表示存储在ChunkData字段中的数据的长度,不包括添加到数据中的任何填充数据(为了数据对齐会在结尾添加0,但是添加的0不算长度)。

PS: 结构体中ChunkId的4B和ChunkSize本身的4B的长度均不在ChunkSize的数据长度中。
3.AVI文件结构

AVI文件采用RIFF文件结构方式,使用四字符码(FOURCC)表征数据类型,如RIFF、AVI、LIST等,通常将四字符码称为数据块ID。RIFF文件的基本单元叫做数据块(Chunk),由数据块四字符码(数据块ID)、数据长度、数据组成。整个RIFF文件可以看成一个数据块,其数据块ID为RIFF,称为RIFF块。一个RIFF文件中只允许存在一个RIFF块。RIFF块中包含一系列其他子块,其中ID为LIST,称为LIST块,LIST块中可以包含一系列其他子块,但除了LIST块外的其他所有子块都不能再包含子块。

标准的RIFF文件结构如下。一个AVI通常包含几个子块。ID为hdrl的LIST块,包含了音视频信息,以及描述媒体流信息。ID为info的LIST块,包含编码该AVI的程序信息。ID为junk的chunk数据块,是无用数据,用于填充ID为movi的LIST块,包含了交错排列的音视频数据。ID为idxl的Chunk块,包含音视频排列的索引数据。

2.3.3 FLV

FLV(Flash Video)是现在非常流行的流媒体格式,由于其视频文件占用空间较小,封装及播放简单等特点,使其很适合在网络上进行应用,目前主流的视频网站无一例外地使用了FLV格式。但当前的浏览器已经不提倡使用Flash插件了,可以通过video.js和flv.js扩展Flash功能。FLV是常见的流媒体封装格式,可以将其数据看为二进制字节流。

FLV包括文件头(File Header)和文件体(File Body),其中文件体由一系列的Tag及Tag Size对组成。其Tag结构如下图所示:

PS: 可以使Ultra Edit、Submit、Binary Viewer的二进制查看工具查看FLV格式文件。

FLV的Header头部分由几部分组成,分别是Signature(3B)、Version(1B)、Flags(1B)、DataOffset(4B)。

Signature:占3B,固定为FLV这3个字符作为标识。一般发现前3个字符为FLV时就认为是FLV文件。
Version:占1B,标识FLV的版本号,此处为1。
Flags:占1B,其中第0位和第2位分别标识video与audio存在的情况(1表示存在,0表示不存在)。
DataOffset: 占4B,表示FLV的header长度,固定为9B。

FLV的body部分是由一系列的back-pointers+tag构成,back-pointers固定为4B,表示前一个tag的size。tag分为3种类型,包括video、audio和scripts。

FLV的tag部分是由tag type、tag data size、Timestamp、TimestampExtended、stream ID、tag data组成的。

2.3.4 TS

MPEG-2_TS是一种标准容器格式,用于传输与存储音视频、节目与系统信息协议数据,被广泛应用在数字广播系统。数字机顶盒接收的就是TS流。

在MPEG-2标准中,有两种不同的码流输出到信道:
1) PS流,适用于没有传输误差的场景。
2) TS流,适用于有信道噪声的传输场景。

节目流(PS)适用于合理可靠的媒体,如DVD;传输流(TS)适用于不太可靠的传输,如视频云存储监控。MPEG-2 System(编号 13818-1)是MPEG-2 标准的一部分,该部分描述了多个视频、音频和数据多种基本流(ES)合成传输流(TS)和节目流(PS)的方式。

基本概念

(1)ES是基本流(Elementary Stream),直接从编码器出来的数据流,可以是编码过的音频、视频或者其他连续码流。

(2)PES是打包的基础流(Packletized Elementary Streams),是ES流经过PES打包器处理后形成的数据流,在这个过程中完成将ES流分组,并加入包头信息(如PTS、DTS)等操作。PES流的基本单位是PES包,PES包由包头和负载(Payload)组成。

(3)节目流(Program Stream),由PS包组成,而一个PS包又由若干PES包组成。一个PS包由具有同一时间基准的一个或多个PES复合而成。

(4)传输流(Transport Stream),由固定长度(188Byte)的TS包组成,TS包是对PES包的另一种封装,是同一时间基准的一个或多个PES包复合而成。PS包是不固定长度的,而TS包为固定长度的。

(5)节目特定信息(Program Specific Information,PSI),用来描述传输流的组成结构。PSI信息由4中类型的表组成,包括节目关联表(PAT)、节目映射表(PMT)、条件接收表(CAT)、网络信息表(NIT)。

(6)节目关联表(Program Association Table,PAT),该表的PID是固定的0x0000,它的主要作用是指出该传输流的ID,以及该路传输流中所对应的几路节目流的MAP表和网络信息表的PID。

(7)节目映射表(Program Map Table,PMT),该表的PID是由PAT提供给出的。通过该表可以得到一路节目中包含的信息。

(8)NIT是网络信息表(Network Information Table),该表的PID是由PAT提供给出的。NIT的作用主要是对多路传输流的识别,NIT提供多路传输流、物理网络及网络传输相关的一些信息。

(9)条件访问表(Conditional Access Table,CAT),该表的PID是0x0001。

除上面几种表外,MPEG-2还提供了私有字段,用于实现对MPEG-2的扩充。为便于传输,实现时分复用,基本ES必须打包,也就是讲顺序连续、传输连续的数据流按一定的时间长度进行分割,分割的小段叫做包,因此打包也称为分组。

由于TS码流有较强的的抵抗传输误码能力,因此在传输媒体中进行传输的MPEG-2码流基本上采用TS。

TS流的形成过程

TS流的形成过程大体分为3个步骤:

如TS流的形成过程:

第一步:通过原始音视频数据经过压缩编码得到ES流,生成的ES基本流比较大,并且只是I、P、B这些视频帧或音频取样信息。

第二步:对ES基本流进行打包生成PES流,通过PES打包器,首先对ES基本流进行分组打包,在每个包前加上包头就构成了PES流的基本单位,即PES包,对视频PES来讲,一般是一帧一个包,音频PES一般一个包不超过64个kB。PES包头信息中加入了PTS、DTS信息,用于音视频的同步。

第三步:使用同一时间基准的PES包经过TS复用器生成TS传输包。

PES包的长度通常远大于TS包的长度,一个PES包必须由整数个TS包来传送,没装满的TS包由填充字节填充。PES包进行TS复用时,往往一个PES包会分存到多个TS包中。将PES包内容分配到一系列固定长度的TS传输包(TS Packect)中,TS流中TS传输包头加入了PCR(节目参考时钟)与PSI(节目专用信息),其中PCR用于解码器的系统时钟恢复。TS包的基本结构如下所示:

每个包固定长度为188Byte,其中包头为4B。PCR时钟的作用非常重要,编码器中有一个系统时钟用于产生指示音视频正确显示和解码的时间标签(如DTS、PTS)。解码器在解码时首先利用PCR时钟重建与编码器同步的系统时钟,再利用PES流中的DTS、PTS进行音视频的同步,这也是音视频同步的基本原理。

TS流形成过程如下:

(1)将原始音视频数据压缩后,由压缩结果组成一个基本码流ES。

(2)对ES进行打包形成PES。

(3)将PES包加入时间戳信息DTS、PTS。

(4)将PES包内容分配到一系列固定长度的TS包中。

(5)在传输包中加入定时信息PCR。

(6)在传输包中加入节目专用信息PSI。

(7)连续输出传输包形成具有恒定比特率的MPEG-TS流。

TS流的解析过程,可以说是生成的逆过程。

(1)从复用的MPEG-TS流中解析出TS包。

(2)从TS包中获取PAT及对应的PMT(PSI中的表格)。

(3)从而获取特定节目的音视频PID。

(4)通过PID筛选出特定音视频相关的TS包,并解析出PES。

(5)从PES中读取PTS/DTS,并从PES中解析出基本码流ES。

(6)将ES交给解码器,获得压缩前的原始音视频数据。

2.3.5 M3U8

M3U8是Unicode版本的M3U,采用UTF-8编码。M3U和M3U8文件都是苹果公司使用的HTTP Live Streaming(HLS)协议格式的基础,这种协议格式可以在iPhone 系列设备播放。M3U8文件其实是HLS协议的部分内容,而HLS是一个由苹果公司提出的基于HTTP的流媒体网络传输协议。

HLS简介

HTTP直播协议(HTTP Live Streaming,HLS),其工作原理是把整个流分成一个一个小的基于HTTP的文件来下载,每次只下载一部分。当媒体流正在播放时,客户端可以选择从许多不同的备用源中以不同的速率下载同样的资源,允许看流媒体会话适应不同的数据速率。

在开始一个流媒体会话时,客户端会下载一个包含元数据的Extended M3U(M3U8) Playlist文件,用于寻找可用的媒体流。HLS只请求基本的HTTP报文,与实时传输协议(RTP)不同,HLS可以穿过任何允许HTTP数据通过的防火墙或者代理服务器,也可以很容易地使用内容分发网络来传输媒体流。

总之,HLS是新一代流媒体传输协议,其基本实现原理为将一个大的媒体文件进行分片,将分片的文件资源路径记录在M3U8文件内容,其中附带一些额外的描述,例如该资源的多带宽信息,主要用于提供给客户端。客户端依据M3U8文件即可获取对应的媒体资源,进行播放,因此客户端获取HLS文件,主要就是对M3U8文件进行解析操作。

M3U8文件格式

M3U8文件实质上是一个播放列表(Playlist),其可能是一个媒体播放列表(Media Playlist),也可能是一个主播房列表(Master Playlist)。但无论是哪种播放列表,其内部文字都utf8编码。当M3U8文件作为媒体播放列表(Media Palylist)时其内部信息记录的是一系列媒体片段资源,顺序播放该片段资源即可完整展示多媒体资源。

M3U8播放列表内容片段如下:

#EXTM3U
#EXT-X-STREAM-INF: PROGRAM-ID=1, BANDWIDTH=1280000
http://example.com/low.m3u8
#EXT-X-STREAM-INF: PROGRAM-ID=1, BANDWIDTH=2560000
http://example.com/mid.m3u8
#EXT-X-STREAM-INF: PROGRAM-ID=1, BANDWIDTH=7680000
http://example.com/hi.m3u8
#EXT-X-STREAM-INF: PROGRAM-ID=1, BANDWIDTH=65000, CODECS="mp4a.40.5"
http://example.com/audio-only.m3u8

对于点播来说,客户端只需要按照顺序下载上述片段资源,顺序播放,而对于直播来讲,客户端需要定时重新请求该M3U8文件,看一看是否有新的片段数据需要进行下载并播放。

当M3U8作为主播放列表(Master Playlist)时,其内部提供的是同一份媒体资源的多份流列表资源。

#EXTM3U
#EXT-X-STREAM-INF:BANDWIDTH=150000,RESOLUTION=416x234,CODECS="avc1.42e00a,mp4a.40.2"
http://example.com/low/index.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=240000,RESOLUTION=416x234,CODECS="avc1.42e00a,mp4a.40.2"
http://example.com/lo_mid/index.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=440000,RESOLUTION=416x234,CODECS="avc1.42e00a,mp4a.40.2"
http://example.com/hi_mid/index.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=640000,RESOLUTION=640x360,CODECS="avc1.42e00a,mp4a.40.2"
http://example.com/high/index.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=64000,CODECS="mp4a.40.5"
http://example.com/audio/index.m3u8

该备用流资源指定了多种不同码率,以及不同格式的媒体播放列表,并且该备用流资源也可同时提供不同版本的资源内容,例如不同语言的音频文件、不同角度拍摄的视频文件等。客户可以根据不同的网络状态选取合适码流的资源,并且最好根据用户喜好选择合适的资源内容。

2.4 视频压缩编码

编码在通信和信息处理领域中被广泛使用,其基本原理是将信息按照一定规则使用某种形式的码流表示与传输。常用的需要编码的信息主要有文字、语音、视频和控制信息等。

2.4.1 视频编码基础知识

视频编码涉及的基础知识非常复杂,包括图像、视频、压缩原理等。

视频和图像的关系

视频本质上是由大量的连续图片组成的。

衡量视频很重要的一个指标是帧率,帧率越高,视频越逼真就越流畅。

每秒15帧==15FPS
每秒30帧==30FPS
每秒60帧==60FPS
视频编码的重要性

原始视频如果不编码那么体积会非常庞大。

如分辨率为1920*1080,帧率为30的视频。

单画面像素值1920*1080=2073600像素,每个像素占用24b(采用RGB24),也就是单画面图片占用2073600*24=49766400b。

8bit=1Byte,单画面大小48766400bit/8=6220800Byte,约等于6.44MB。

1S的视频大小,单画面大小*帧率=6.22mb*30=186.6mb。

1min大小视频约为11GB,90min大小视频约为1TB。 不压缩不行

视频产生之后涉及存储和传输问题。如果按照100mb/s网速下载完刚才的电影需要22小时,那么拉流的时间太长了。
视频编码

视频编码是指按指定的方法将信息从一种格式转换成另一种格式。视频编码就是将一种视频格式转换成另一种视频格式。视频编码和解码是互逆的过程,如下。

编码的最终目的就是为了压缩,市面上各种各样的视频编码方式都是为了让视频变得更小,有利于存储和传输。视频从录制到播放的整个过程,如下。

首先是视频采集,通常会使用摄像机、摄像头进行视频采集。

采集可视频数据后进行模数转换,将模拟信号转变成数字信号。

信号输出之后,要进行预处理,将RGB信号编程YUV信号,然后进行压缩编码,包含音频和视频,然后进行音视频封装,形成有利于存储或传输的格式,以便可以通过网络传输出去。

YUV成像原理

RGB信号和YUV信号,YUV本质上是一种颜色数字化表示方式。视频通信系统之所以要采用YUV,而不是RGB,主要是因为RGB信号不利于压缩。在YUV这种格式中,加入亮度这一概念。

视频工程师发现,眼睛对于明暗的分别率要比对颜色的分辨率更精细一些。所以视频存储中,没必要存储全部颜色信号,可以把更多带宽留给黑白信号(亮度),将稍少的带宽留给彩色信号(色度),这就是YUV的基本原理,Y是亮度,U和V则是色度。

YUV格式可以很方便的实行视频压缩,YUV的存储格式与其采样方式密切相关。

采样的原理非常复杂,常采用YUV 4:2:0的采样方式,获得1/2的压缩率,这些预处理做完后,就可以正式进行编码了。

IPB帧

I帧,帧内编码帧(Intra Picture),采用帧内压缩去掉空间冗余信息。

P帧,前向预测编码帧(Predictive-Frame),通过将图像序列中前面已经编码的帧的时间冗余信息来压缩传输数据量的编码图像。

B帧,双向预测内插编码帧(Bi-Directional Interpolated Predication Frame),既考虑图像序列前面的编码图像,又顾及源图像序列后面的已编码帧之间的冗余信息,以此来压缩传输数据量的编码图像,又称为双向编码帧。参考前面的一个I帧或者P帧及其后面的一个P帧。

注意:B帧有可能参考它后面的P帧,解码器一般有视频帧缓存队列(以GOP为单位)。
PTS和DTS

解码时间戳(Decoding Time Stamp,DTS)用于标识读入内存中比特流在什么时候开始送入解码器中进行解码,也就是解码顺序的时间戳

展示时间戳(Presentation Time Stamp,PTS)用于度量解码后的视频帧什么时候被显示出来。

在没有B帧的情况下,DTS和PTS的输出顺序是一样的,一旦存在B帧,PTS和DTS则会不同,也就是显示顺序地时间戳。
GOP简介

图像组(Group OF Picture,GOP),指两个I帧之间的距离。Reference即参考周期,指两个P帧之间的距离。一个I帧所占用的字节数大于一个P帧,一个P帧所占用的字节数大于一个B帧,所以在码率不变的前提下,GOP越大,P、B帧的数量就会越多,平均每个I、P、B帧所占用的字节数就越多,也就更容易获得较好的图像质量。

2.4.2 视频压缩

对原始视频进行压缩的目的是为了去除冗余信息,这些冗余信息包括以下内容:

  1. 空间冗余,即图像相邻像素之间有较强的相关性。

  1. 时间冗余,即视频序列的相邻图像之间内容相似。

  1. 编码冗余,即不同像素值出现的概率不同。

  1. 视觉冗余,即人的视觉系统对某些细节不敏感。

  1. 知识冗余,即规律性的结构可由先验知识和背景知识得到。

数据压缩主要分为有损压缩无损压缩

无损压缩(Lossless)即压缩前、解压缩后图像完全一致X=X’,压缩比一般比较低(2:1 ~ 3:1),典型的压缩格式有Winzip、JPEG-LS等。

有损压缩(Lossy)即压缩前与解压缩后图像不一致X!=X’,压缩比一般比较高(10:1 ~ 20:1),典型格式有MPEG-2、H.264/AVC、AVS等。

数据压缩与解压缩的流程如下:

无损压缩

无损压缩也称为可逆编码,重构后的数据与原数据完全相同,适用于磁盘文件的压缩等。主要采用熵编码方式,包括香农编码、哈夫曼编码和算术编码等。香农编码采用信源符号的累计概率分布函数来分配码字,效率不高,实用性不大,但对其他编码方法有很好的的理论指导意义。霍夫曼(哈夫曼)编码完全依据出现概率来构造异字头的平均长度最短的码字,先对图像数据扫描一遍,计算出各种像素出现的概率,按照概率的大小指定不同长度的唯一码字,由此得到一张该图像的哈夫曼码表。编码后的图像数据记录的是每像素的码字,而码字与实际像素值的对应关系记录在码表中。算术编码是用符号的概率和编码间隔两个基本参数来描述的,在给定符号集和符号概率的情况下,算术编码可以给出接近最优的编码结果。使用算术编码的压缩算法通常先要对输入符号的概率进行估计,然后编码,估计越准,编码就越接近最优的结果。

有损压缩

有损压缩也称为不可逆编码,重构后的数据与原数据有差异,适用于任何允许失真的场景,例如视频会议等。常用的有损编码方式包括预测编码、变换编码、量化编码、混合编码等。

2.4.3 视频编码原理

视频编码是指通过特定的压缩技术,将某个视频格式的文件转换成另一种视频格式。视频数据在时域和空域层面都有极强的相关性,这也表示有大量的时域冗余信息和空域冗余信息,压缩编码技术就是去掉数据中的冗余信息。

去除时域冗余信息的主要方法包括运动补偿、运动表示、运动估计等。运动补偿是通过先前的局部图像来预测、补偿当前的局部图像,可有效减少帧序列冗余信息。运动表示是指不同区域的图像使用不同的运动矢量来描述运动信息,运动矢量通过熵编码进行压缩(熵编码在编码过程中不会丢失信息)。运动估计是指从视频序列中抽取运动信息,通用的压缩标准使用基于块的运动估计和运动补偿

去除空域冗余信息的主要方法包括变换编码、量化编码和熵编码。变换编码是指将空域信号变换到另一正交矢量空间,使相关性下降,数据冗余度减小。量化编码是指对变换编码产生的变换系数进行量化,控制编码器的输出位率。熵编码是指对变换、量化后得到的系数和运动信息进行进一步的无损压缩。

原始视频所需存储空间巨大,且传输成本也大,需要去除冗余信息。

视频一般有5中冗余信息,包括空间冗余、时间冗余、编码冗余、视觉冗余和知识冗余。

2.4.4 视频编码的关键技术

编解码器包括编码器和解码器。编码器(Encoder)是指压缩信号的设备和程序;解码器(Decoder)是指解压缩信号的设备或程序;编解码器(Codec)是指编解码器对。

编码的主要流程保罗预测、变换、量化、熵编码,解码的流程与之互逆。如下图所示。

2.4.5 视频编解码流程

视频的编解码流程分为编码和解码,是互逆的过程。编码过程包括运动估计、运动补偿、DCT、量化与熵编码等,如下图所示。

(1)运动估计(Motion Estimate)是指从前几帧中寻找匹配的宏块,有多种不同的搜索算法,编码获得的质量和速度也不相同。其中快速算法的编码质量比全搜索算法低不了太多,但是速度却提高了很多倍。得到的运动矢量的过程被称为运动估计。

(2)运动补偿(Motion Compensate)是通过先前的局部图像来预测、补偿当前的局部图像,它是减少帧序列冗余信息的有效方法,包括全局运动补偿和分块运动补偿两类。运动补偿的结果分为两份,一份被当前帧做参考求出差值Dn,另一份用于生成Fn的对应参考帧。

(3)离散余弦变换(Discrete Cosine Transform,DCT),主要用于对数据或图像进行压缩,能够将空域的信号转换到频域上,具有良好的去相关性的性能。图像经过DCT变换后,其频率系数的主要成分集中于比较小的范围,且主要位于低频部分。

(4)量化(Quant)是指除指定的数值(有损压缩)。量化结果分为两份,一份做进一步处理,另一份经过反量化(Rescale)/反DCT(IDCT)变化,结合第2步的运动补偿生成Fn对应的参考帧,供后续参考。

(5)重排(Reorder)是指对量化后的数据进行重排序,常用算法为游程编码等。

(6)熵编码(Entropy Encode)进行最后编码,使用上一步结果及Vectors和Headers的内容。

2.5 视频播放原理

绝大部分视频播放器,如MPlayer、VLC、Xine、DirectShow等在播放视频的原理和架构上是非常相似的。视频播放器播放一个互联网上的视频文件需要经过几个步骤,包括解协议、解封装、音视频解码、音视频同步、音视频输出

2.5.1 视频播放器简介

视频播放器播放本地视频文件或互联网上的流媒体文件大概需要解协议、解封装、解码、同步、渲染等几个步骤,如下图所示:

解协议

解协议是指将流媒体协议的数据,解析为标准的封装格式数据。音视频在网络上传输的时候,采用各种流媒体协议如HTTP、RTMP、RTSP、MMS等。此类协议在传输音视频数据的同事,也会传输一些信令数据。这些信令数据包括对播放的控制(播放、暂停、停止),或者对网络状态的描述等。在解协议的过程中会去除信令数据而只保留音视频数据。如采用RTMP协议传输的数据,经过解协议操作后,输出FLV格式的数据。

解封装

解封装是指将输入的封装格式的数据,分离成为音频流压缩编码数据和视频流压缩编码数据。封装格式种类有很多,如MP4、MKV、RMVB、TS、FLV、AVI等,其作用就是将已经压缩编码的视频数据和音频数据按照一定的格式放到一起。FLV格式的数据经解封装操作后,输出H.264 编码的视频码流和AAC编码的音频码流。

解码

解码是指将视频/音频压缩编码数据,解码称为非压缩的视频/音频原始数据。音频的压缩标准包括AAC、MP3、AC-3等,视频的压缩编码标准则包含H.264、MPEG-2、VC-1等。解码是整个系统中最重要也是最复杂的一个环节。通过解码,压缩编码的视频数据输出称为非压缩的颜色数据,如YUV420P、RGB等。压缩编码的音频数据输出称为非压缩的音频抽样数据,例如PCM数据。

音视频同步

根据解封装模块在处理过程中获取的参数信息,同步解码出来的视频和音频数据,被送至系统的显卡和声卡播放出来

为什么要音视频同步?

因为媒体数据经过解复用流程后,音频/视频解码是独立的,也是独立播放的,而在音频流和视频流中,其播放速度由霞凝管信息指定的,如视频是根据帧率音频是根据采样率。从帧率及采样率即可知道视频、音频播放速度。声卡和显卡均是以一帧数据来作为播放单位。如果单纯依赖帧率及采样率进行播放,在理想条件下是同步,不会有误差。

下面以一个44.1kHz的AAC音频流和24f/s的视频流为例来说明。如果一个AAC音频frame每个声道包含1024个采样点,则一个frame的播放时长为(1024/44100)*1000ms=23.27ms,而一个视频frame播放时长为1000ms/24=41.67ms。

理想情况下音视频完全同步,但实际情况下使用以上简单的方式,慢慢会出现音视频不同步。可能的原因有:

  • 一帧的播放时间难以精准控制;

  • 音视频解码及渲染的耗时不同,可能造成每一帧输出有一点细微差别,长久累计,不同步便越来越明显;

  • 音频输出是线性的,而视频输出可能是非线性的,从而导致有偏差;

  • 媒体流本身视频有差距(特别是TS实时流,音视频能播放的第1个帧起点不同),所以解决解决音视频同步问题引入了时间戳

时间戳包含几个特点,首先选择一个参考时钟(要求参考时钟上的时间是线性递增的),编码时依据参考时钟给每个音视频数据块都打上时间戳。播放时根据音视频时间戳参考时钟来调整播放,所以音视频同步实际上是一个动态的过程。即同步是暂时的,不同步是常态。

2.5.2 FFmpeg播放架构与原理

ffplay是使用FFmpeg API开发的功能完善的开源播放器。在ffplay中个线程如下所示。

  1. read_thread线程负责读取文件内容,将video和audio内容分离出来后生成packet,将packet输出到packet队列中,包括Video Packet Queue和Audio Packet Queue,不考虑subtitle。

  1. video_thread线程负责读取Video Packets Queue队列,将video packet解码得到Video Frame,将Video Frame输出到Video Frame Queue队列中。

  1. audio_thread线程负责读取Audio Packets Queue队列,将audio packet解码得到Audio Frame,将Audio Frame输出到Audio Frame Queue队列中。

  1. 主线程——>event_loop——>refresh_loop_wait_event 负责读取Video Frame Queue中的video frame,调用SDL进行显示,其中包括了音视频同步控制的相关操作。

  1. SDL的回调函数sdl_audio_callback负责读取Audio Frame Queue中的audio frame,对其进行处理后,将数据返回给SDL,然后SDL进行音频播放。

FFmpeg解码流程涉及几个重要的数据结构和API,如图所示:

(1)注册所有容器格式和CODEC,使用av_register_all,最新版本中无须调用该函数。

(2)打开文件av_open_input_file,最新版本为avformat_open_input。

(3)从文件中提取流信息av_find_stream_info。

(4)枚举所有流,查找的种类为CODEC_TYPE_VIDEO。

(5)查找对应的编解码器 avcode_find_decoder。

(6)打开编解码器 avcodec_open。

(7)为解码帧分配内存 avcodec_alloc_frame。

(8)不停地从码流中提取帧数据 av_read_frame。

(9)判断帧的类型,对于视频帧则调用 avcodec_decode_video。

(10)解码完后,释放解码器 avcodec_close。

(11)关闭输入文件 av_close_input_file。

注意:该流程图为FFmpeg 2.*版本,最新的FFmpeg略有改动。

2.5.3 VLC播放原理

VLC播放视频分为4个步骤:

(1)access访问,或者理解为接收、获取、得到;

(2)demux解复用,就是把通常合在一起的音频和视频分离(可能还有字幕);

(3)decodc解码,包括音频和视频的解码;

(4)output输出,也分为音频和视频的输出(aout和vout)。

2.5.4 现代播放器架构

典型的播放器可分为应用层、视图层和内核层,如下图所示:

架构简介

用户界面(UI)定义了用户端的观看体验,包括“皮肤”(播放器的外观设计)、所有可自定义的特性(如播放列表和社交分享等)及业务逻辑部分(如广告、设备兼容性逻辑及认证管理等)。

播放器内核是最核心的部件,播放器最底层的部分是内核,如解码器等,这层的功能直接调用操作系统暴露出来的API。解码器的主要功能在于解码并渲染视频内容,DRM管理器则通过解密过程来控制是否有权播放。DRM即数字版权管理,是指数字内容,如音视频节目内容、文档、电子书籍等在生产、传播、销售、使用过程中进行的权利保护、使用控制与管理的技术。

用户界面

UI层处于播放器架构的上层,控制用户所能看到和交互的东西,为用户提供独特的用户体验。在UI内部,也包含业务逻辑组件,这些组件构成了播放体验的独特性,虽然用户端无法直接和这部分功能进行交互。UI部分主要包含3大组件。

(1)“皮肤”是对与播放器视觉相关部分的统称,包括进度控制条、按钮和动画图标等。和大部分设计类的组件一样,这部分组件也可以使用CSS实现,设计师或者开发者可以很方便地用来集成。

(2)UI逻辑部分。此部分定义了播放过程中和用户交互方面所有可见的交互,包括播放列表、缩略图、播放频道的选择和社交媒体分享等。

(3)业务逻辑部分,除了上面所介绍的两部分功能特性外,还有一个不可见的部分,这部分构成了业务的独特性,包括认证和支付、频道和播放列表的获取,以及广告等。

多媒体引擎

多媒体引擎以一种全新独立的组件形式出现在播放器架构中。在MP4时代,平台处理了所有与播放相关的逻辑,而只讲一部分与多媒体处理相关的特性(仅仅是播放、暂停、拖曳和全屏模式等功能)开放给开发者。然而新的基于HTTP的流媒体格式需要一种全新的组件来处理和控制新的复杂性,包括解析声明文件、下载视频片段、自适应码率监控及决策指定等甚至更多。

解码器和DRM管理器

出于解码性能和安全考虑,解码器和DRM管理器与操作系统平台密切绑定,其工作流程如下:

解码器用于处理与最底层播放相关的逻辑,它将不同封装格式的视频进行解包,并将其内容解码,然后将解码后的视频帧交给操作系统进行渲染,最终让用户端看到。由于视频压缩算法越来越复杂,解码过程需要密集计算过程,并且为了保证解码性能和流畅的播放体验,解码过程需要强依赖与操作系统和硬件。

DRM管理器管理付费内容,防止视频被盗版。因此DRM的代码和工作过程都向终端用户可开发者屏蔽了。解密过的内容不会离开解码层,因此也不会被拦截。

2.5.5 短视频技术

短视频技术主要涉及短视频拍摄端、播放端及合成、上传、转码、分发、加速、播放等操作,其架构如下:

Je suppose que tu aimes

Origine blog.csdn.net/u011937566/article/details/128824419
conseillé
Classement