Como funciona un códec de vídeo? Parte 1: Fundamentos

A segunda parte: Como funciona o codec de vídeo

Calquera trama imaxe pódese representar na forma matriz bidimensional. Cando se trata de cores, a idea pódese desenvolver mirando unha imaxe como matriz tridimensional, na que se utilizan dimensións adicionais para almacenar datos de cada unha das cores.

Se consideramos a cor final como unha combinación da chamada. cores primarias (vermello, verde e azul), na nosa matriz tridimensional definimos tres planos: o primeiro para o vermello, o segundo para o verde e o último para o azul.
Como funciona un códec de vídeo? Parte 1: Fundamentos
Chamaremos píxel (elemento de imaxe) a cada punto desta matriz. Cada píxel contén información sobre a intensidade (normalmente como un valor numérico) de cada cor. Por exemplo, píxel vermello significa que contén 0 verde, 0 azul e o máximo vermello. Píxel rosa pódese formar usando unha combinación de tres cores. Usando un intervalo numérico de 0 a 255, un píxel rosa defínese como Vermello = 255, Verde = 192 и Azul = 203.

Como funciona un códec de vídeo? Parte 1: Fundamentos

Este artigo foi publicado co apoio de EDISON.

Estamos a desenvolver aplicacións para videovixilancia, video streaming, e tamén estamos comprometidos gravación de vídeo na sala de cirurxía.

Formas alternativas de codificar unha imaxe en cor

Hai moitos outros modelos para representar as cores que compoñen unha imaxe. Por exemplo, pode usar unha paleta indexada, que require só un byte para representar cada píxel, en lugar dos tres necesarios cando se utiliza o modelo RGB. Neste modelo, é posible utilizar unha matriz 2D en lugar dunha matriz 3D para representar cada cor. Isto aforra memoria, pero dá unha gama de cores máis pequena.

Como funciona un códec de vídeo? Parte 1: Fundamentos

RGB

Por exemplo, bótalle un ollo a esta imaxe a continuación. A primeira cara está completamente pintada. Os demais son os planos vermello, verde e azul (as intensidades das cores correspondentes móstranse en escala de grises).

Como funciona un códec de vídeo? Parte 1: Fundamentos

Vemos que os tons de vermello do orixinal estarán nos mesmos lugares onde se observan as partes máis brillantes da segunda cara. Mentres que a contribución do azul só se pode ver principalmente nos ollos de Mario (última cara) e elementos da súa roupa. Observe onde os tres planos de cores contribúen menos (as partes máis escuras das imaxes): o bigote de Mario.

Para almacenar a intensidade de cada cor, é necesario un certo número de bits - esta cantidade chámase profundidade de bits. Digamos que se gastan 8 bits (con base nun valor de 0 a 255) por plano de cor. Despois temos unha profundidade de cor de 24 bits (8 bits * 3 planos R/G/B).

Outra propiedade dunha imaxe é разрешение, que é o número de píxeles nunha dimensión. Moitas veces denotado como ancho × alto, como na imaxe de exemplo de 4 por 4 a continuación.
Como funciona un códec de vídeo? Parte 1: Fundamentos

Outra propiedade coa que tratamos cando traballamos con imaxes/vídeos é relación de aspecto, describindo a relación proporcional normal entre o ancho e o alto dunha imaxe ou píxel.

Cando din que unha determinada película ou imaxe ten un tamaño de 16 por 9, normalmente queren dicir relación de aspecto de visualización (DAR - de Mostrar a relación de aspecto). Non obstante, ás veces pode haber diferentes formas de píxeles individuais, neste caso estamos a falar relación de píxeles (PAR - de Relación de aspecto de píxeles).

Como funciona un códec de vídeo? Parte 1: Fundamentos

Como funciona un códec de vídeo? Parte 1: Fundamentos

Nota para a anfitrioa: DVD corresponde a DAR 4 a 3

Aínda que a resolución real do DVD é 704x480, aínda mantén unha relación de aspecto 4:3 porque o PAR é 10:11 (704x10 / 480x11).

E, finalmente, podemos determinar video como unha secuencia de n cadros para o período o tempo, que se pode considerar unha dimensión adicional. A n entón é a velocidade de fotogramas ou o número de fotogramas por segundo (FPS - de Fotogramas por segundo).

Como funciona un códec de vídeo? Parte 1: Fundamentos

O número de bits por segundo necesarios para mostrar un vídeo é o seu velocidade de transmisión - taxa de bits.

taxa de bits = ancho * alto * profundidade de bits * fotogramas por segundo

Por exemplo, un vídeo de 30 fps, 24 bps e 480x240 requiriría 82,944,000 bps ou 82,944 Mbps (30x480x240x24), pero iso é se non se utiliza ningún método de compresión.

Se a velocidade de transferencia case constante, entón chámase velocidade de transmisión constante (CBR - de taxa de bits constante). Pero tamén pode variar, neste caso chámase velocidade en baudios variable (VBR - de taxa de bits variable).

Este gráfico mostra un VBR limitado, onde non se desperdician demasiados bits no caso dun cadro completamente escuro.

Como funciona un códec de vídeo? Parte 1: Fundamentos

Os enxeñeiros desenvolveron inicialmente un método para duplicar a velocidade de fotogramas percibida dunha pantalla de vídeo sen usar ancho de banda adicional. Este método coñécese como vídeo entrelazado; Basicamente, envía a metade da pantalla no primeiro "cadro" e a outra metade no seguinte "cadro".

Actualmente, as escenas realízanse principalmente usando tecnoloxías de dixitalización progresiva. É un método de visualización, almacenamento ou transmisión de imaxes en movemento no que se debuxan secuencialmente todas as liñas de cada fotograma.

Como funciona un códec de vídeo? Parte 1: Fundamentos

Ben! Agora somos conscientes de como se representa dixitalmente unha imaxe, como se dispoñen as súas cores, cantos bits por segundo gastamos en mostrar vídeo, se a taxa de bits é constante (CBR) ou variable (VBR). Coñecemos unha determinada resolución usando unha determinada taxa de fotogramas, estamos familiarizados con moitos outros termos, como vídeo entrelazado, PAR e algúns outros.

Eliminando a redundancia

Sábese que o vídeo sen compresión non se pode usar normalmente. Un vídeo dunha hora de duración con resolución de 720p e 30 fotogramas por segundo ocuparía 278 GB. Chegamos a este valor multiplicando 1280 x 720 x 24 x 30 x 3600 (ancho, alto, bits por píxel, FPS e tempo en segundos).

Usar Algoritmos de compresión sen perdas, como DEFLATE (utilizado en PKZIP, Gzip e PNG), non reducirá o ancho de banda necesario o suficiente. Temos que buscar outras formas de comprimir o vídeo.

Para iso, pode utilizar as características da nosa visión. Somos mellores para distinguir o brillo que a cor. Un vídeo é unha serie de imaxes secuenciais que se repiten ao longo do tempo. Hai pequenas diferenzas entre os fotogramas adxacentes da mesma escena. Ademais, cada cadro contén moitas áreas que usan a mesma cor (ou similar).

A cor, o brillo e os nosos ollos

Os nosos ollos son máis sensibles ao brillo que á cor. Podes ver isto por ti mesmo mirando esta imaxe.

Como funciona un códec de vídeo? Parte 1: Fundamentos

Se non ves que na metade esquerda da imaxe as cores dos cadrados A и B son realmente iguais, entón iso é normal. O noso cerebro obríganos a prestar máis atención á luz e á sombra que á cor. No lado dereito entre os cadrados designados hai un jumper da mesma cor, polo que nós (é dicir, o noso cerebro) determinamos facilmente que, de feito, son da mesma cor.

Vexamos (de forma simplificada) como funcionan os nosos ollos. O ollo é un órgano complexo que consta de moitas partes. Non obstante, máis nos interesan os conos e as varas. O ollo contén uns 120 millóns de bastoncillos e 6 millóns de conos.

Consideremos a percepción da cor e do brillo como funcións separadas de certas partes do ollo (de feito, todo é algo máis complicado, pero simplificarémolo). As células de varilla son as principais responsables do brillo, mentres que as células cónicas son as responsables da cor. Os conos divídense en tres tipos, dependendo do pigmento que conteñan: conos S (azul), conos M (verde) e conos L (vermello).

Dado que temos moitas máis varillas (brillo) que conos (cor), podemos concluír que somos máis capaces de distinguir transicións entre escuro e claro que cores.

Como funciona un códec de vídeo? Parte 1: Fundamentos

Características de sensibilidade ao contraste

Os investigadores en psicoloxía experimental e moitos outros campos desenvolveron moitas teorías da visión humana. E un deles chámase funcións de sensibilidade ao contraste. Están relacionados coa iluminación espacial e temporal. En resumo, trátase de cantos cambios son necesarios antes de que un observador os note. Teña en conta o plural da palabra "función". Isto débese ao feito de que podemos medir as funcións de sensibilidade ao contraste non só para imaxes en branco e negro, senón tamén para as de cor. Os resultados destes experimentos mostran que na maioría dos casos os nosos ollos son máis sensibles ao brillo que á cor.

Xa que sabemos que somos máis sensibles ao brillo da imaxe, podemos tentar utilizar este feito.

Modelo de cor

Descubrimos un pouco como traballar con imaxes en cor usando o esquema RGB. Tamén hai outros modelos. Hai un modelo que separa a luminancia da croma e coñécese como YCbCr. Por certo, hai outros modelos que fan unha división similar, pero só teremos en conta este.

Neste modelo de cor Y é unha representación do brillo e tamén usa dúas canles de cores: Cb (azul rico) e Cr (vermello rico). YCbCr pódese derivar de RGB e tamén é posible a conversión inversa. Usando este modelo podemos crear imaxes a toda cor como vemos a continuación:

Como funciona un códec de vídeo? Parte 1: Fundamentos

Converte entre YCbCr e RGB

Alguén oporá: como é posible conseguir todas as cores se non se usa o verde?

Para responder a esta pregunta, imos converter RGB a YCbCr. Usemos os coeficientes adoptados na norma BT.601, que foi recomendado pola unidade UIT-R. Esta división establece os estándares para o vídeo dixital. Por exemplo: que é 4K? Cal debería ser a velocidade de fotogramas, a resolución e o modelo de cor?

Primeiro imos calcular o brillo. Usemos as constantes propostas pola ITU e substitúamos os valores RGB.

Y = 0.299R + 0.587G + 0.114B

Despois de ter o brillo, separaremos as cores azul e vermella:

Cb = 0.564(B - Y)

Cr = 0.713(R - Y)

E tamén podemos converter de novo e mesmo poñernos verdes usando YCbCr:

R = Y + 1.402Cr

B = Y + 1.772Cb

G = Y - 0.344Cb - 0.714Cr

Normalmente, as pantallas (monitores, televisores, pantallas, etc.) usan só o modelo RGB. Pero este modelo pódese organizar de diferentes xeitos:

Como funciona un códec de vídeo? Parte 1: Fundamentos

Submostraxe de cores

Cunha imaxe representada como unha combinación de luminancia e crominancia, podemos explotar a maior sensibilidade do sistema visual humano á luminancia que á crominancia eliminando selectivamente a información. A submostraxe cromática é un método de codificación de imaxes utilizando menos resolución para o croma que para a luminancia.

Como funciona un códec de vídeo? Parte 1: Fundamentos

Canto é permitido reducir a resolución da cor?! Resulta que xa hai algúns diagramas que describen como manexar a resolución e a fusión (Cor resultante = Y + Cb + Cr).

Estes esquemas coñécense como sistemas de submostraxe e exprésanse como unha proporción de 3 veces - a:x:y, que determina o número de mostras de sinais de diferenza de luminancia e cor.

a — estándar de mostraxe horizontal (normalmente igual a 4)
x — número de mostras de croma na primeira fila de píxeles (resolución horizontal relativa a a)
y — o número de cambios nas mostras de croma entre a primeira e a segunda fila de píxeles.

A excepción é 4:1:0, proporcionando unha mostra de croma en cada bloque de resolución de luminancia de 4 por 4.

Esquemas comúns utilizados nos códecs modernos:

  • 4:4:4 (sen submostraxe)
  • 4:2:2
  • 4:1:1
  • 4:2:0
  • 4:1:0
  • 3:1:1

YCbCr 4:2:0 - exemplo de fusión

Aquí tes unha imaxe combinada usando YCbCr 4:2:0. Teña en conta que só estamos gastando 12 bits por píxel.

Como funciona un códec de vídeo? Parte 1: Fundamentos

Así se ve a mesma imaxe, codificada cos principais tipos de submostraxe de cores. A primeira fila é o YCbCr final, a fila inferior mostra a resolución cromática. Resultados moi decentes, tendo en conta a lixeira perda de calidade.

Como funciona un códec de vídeo? Parte 1: Fundamentos

Lembras cando contabamos 278 GB de espazo de almacenamento para almacenar un ficheiro de vídeo dunha hora de duración con resolución de 720p e 30 fotogramas por segundo? Se usamos YCbCr 4:2:0, este tamaño reducirase á metade: 139 GB. Ata agora, aínda está lonxe de ser un resultado aceptable.

Pode obter o histograma YCbCr vostede mesmo usando FFmpeg. Nesta imaxe, o azul domina sobre o vermello, que é claramente visible no propio histograma.

Como funciona un códec de vídeo? Parte 1: Fundamentos

Cor, brillo, gama de cores: revisión de vídeo

Recomendamos ver este fantástico vídeo. Explica o que é o brillo e, en xeral, todos os puntos están punteados ё sobre o brillo e a cor.

Tipos de cadros

Sigamos adiante. Intentemos eliminar a redundancia horaria. Pero primeiro, imos definir algunha terminoloxía básica. Digamos que temos unha película con 30 fotogramas por segundo, aquí están os seus primeiros 4 fotogramas:

Como funciona un códec de vídeo? Parte 1: Fundamentos Como funciona un códec de vídeo? Parte 1: Fundamentos Como funciona un códec de vídeo? Parte 1: Fundamentos Como funciona un códec de vídeo? Parte 1: Fundamentos

Podemos ver moita repetición nos cadros: por exemplo, un fondo azul que non cambia dun cadro a outro. Para resolver este problema, podemos clasificalos abstractamente en tres tipos de marcos.

marco I (Intro cadro)

O marco I (marco de referencia, marco clave, marco interior) é autónomo. Independentemente do que queiras visualizar, un marco I é esencialmente unha fotografía estática. O primeiro cadro adoita ser un cadro I, pero observaremos regularmente cadros en I aínda que non sexan os primeiros.

Como funciona un códec de vídeo? Parte 1: Fundamentos

marco P (Pmarco rediseñado)

P-frame (fotograma preditivo) aproveita que case sempre a imaxe actual se pode reproducir usando o fotograma anterior. Por exemplo, no segundo cadro o único cambio é a pelota que avanza. Podemos obter o fotograma 2 simplemente modificando lixeiramente o fotograma 1, só usando a diferenza entre estes fotogramas. Para construír o cadro 2, referímonos ó cadro 1 anterior.

Como funciona un códec de vídeo? Parte 1: FundamentosComo funciona un códec de vídeo? Parte 1: Fundamentos

marco B (Bmarco i-predictivo)

Que pasa coas ligazóns non só ao pasado, senón tamén aos futuros fotogramas para proporcionar unha compresión aínda mellor? Este é basicamente un marco B (cadro bidireccional).

Como funciona un códec de vídeo? Parte 1: FundamentosComo funciona un códec de vídeo? Parte 1: FundamentosComo funciona un códec de vídeo? Parte 1: Fundamentos

Desistencia intermedia

Estes tipos de cadros úsanse para proporcionar a mellor compresión posible. Veremos como ocorre isto na seguinte sección. De momento, teñamos en conta que o máis "caro" en termos de memoria consumida é o I-frame, o P-frame é notablemente máis barato, pero a opción máis rendible para o vídeo é o B-frame.

Como funciona un códec de vídeo? Parte 1: Fundamentos

Redundancia temporal (predición entre fotogramas)

Vexamos que opcións temos para minimizar a repetición ao longo do tempo. Podemos resolver este tipo de redundancia mediante métodos de predicción cruzada.

Tentaremos gastar o menor número de bits posible para codificar unha secuencia de fotogramas 0 e 1.

Como funciona un códec de vídeo? Parte 1: Fundamentos

Podemos producir resta, simplemente restamos o cadro 1 do cadro 0. Obtemos o cadro 1, só usamos a diferenza entre el e o cadro anterior, de feito só codificamos o resto resultante.

Como funciona un códec de vídeo? Parte 1: Fundamentos

Pero e se che dixese que hai un método aínda mellor que usa aínda menos bits?! Primeiro, imos dividir o cadro 0 nunha cuadrícula clara formada por bloques. E despois tentaremos facer coincidir os bloques do cadro 0 co cadro 1. Noutras palabras, estimaremos o movemento entre cadros.

Da Wikipedia - compensación de movemento en bloque

A compensación de movemento de bloque divide o cadro actual en bloques que non se solapan e o vector de compensación de movemento informa da orixe dos bloques (unha idea errónea común é que anterior o cadro está dividido en bloques que non se solapan e os vectores de compensación de movemento indican onde van eses bloques. Pero, de feito, é ao revés: non se analiza o cadro anterior, senón o seguinte; non está claro onde se moven os bloques, senón de onde veñen). Normalmente, os bloques fonte se solapan no marco fonte. Algúns algoritmos de compresión de vídeo ensamblan o fotograma actual a partir de partes nin de un, senón de varios fotogramas transmitidos previamente.

Como funciona un códec de vídeo? Parte 1: Fundamentos

Durante o proceso de avaliación, vemos que a pelota se moveu de (x= 0, y= 25) por (x= 6, y=26), valores x и y determinar o vector movemento. Outro paso que podemos facer para preservar os bits é codificar só a diferenza de vectores de movemento entre a última posición do bloque e a predita, polo que o vector de movemento final será (x=6-0=6, y=26-25=1). ).

Nunha situación real, esta bóla estaría dividida en n bloques, pero isto non cambia a esencia do asunto.

Os obxectos do cadro móvense en tres dimensións, polo que cando a bola se move, pode facerse visualmente máis pequena (ou máis grande se se move cara ao espectador). É normal que non haxa unha coincidencia perfecta entre bloques. Aquí tes unha vista combinada da nosa estimación e da imaxe real.

Como funciona un códec de vídeo? Parte 1: Fundamentos

Pero vemos que cando usamos a estimación de movemento, hai notablemente menos datos para codificar que cando se usa un método máis sinxelo para calcular o delta entre fotogramas.

Como funciona un códec de vídeo? Parte 1: Fundamentos

Como sería a compensación de movemento real

Esta técnica aplícase a todos os bloques á vez. Moitas veces, a nosa bola en movemento condicional dividirase en varios bloques á vez.

Como funciona un códec de vídeo? Parte 1: Fundamentos

Podes ter unha idea destes conceptos usando Xúpiter.

Para ver os vectores de movemento, podes crear un vídeo de predición externo usando ffmpeg.

Como funciona un códec de vídeo? Parte 1: Fundamentos

Tamén podes usar Analizador de vídeo Intel Pro (É de pago, pero hai unha proba gratuíta limitada só aos dez primeiros fotogramas).

Como funciona un códec de vídeo? Parte 1: Fundamentos

Redundancia espacial (previsión interna)

Se analizamos cada fotograma dun vídeo, atoparemos moitas áreas interconectadas.

Como funciona un códec de vídeo? Parte 1: Fundamentos

Imos pasar por este exemplo. Esta escena consta principalmente de cores azuis e brancas.

Como funciona un códec de vídeo? Parte 1: Fundamentos

Este é un marco I. Non podemos tomar fotogramas anteriores para a predición, pero podemos comprimilos. Codifiquemos a selección do bloque vermello. Se miramos aos seus veciños, notamos que hai algunhas tendencias de cor ao seu redor.

Como funciona un códec de vídeo? Parte 1: Fundamentos

Supoñemos que as cores se espallan verticalmente no marco. O que significa que a cor dos píxeles descoñecidos conterá os valores dos seus veciños.

Como funciona un códec de vídeo? Parte 1: Fundamentos

Tal previsión pode resultar incorrecta. É por este motivo polo que cómpre aplicar este método (previsión interna) e despois restar os valores reais. Isto daranos un bloque residual, o que dará lugar a unha matriz moito máis comprimida en comparación coa orixinal.

Como funciona un códec de vídeo? Parte 1: Fundamentos

Se queres practicar con predicións internas, podes crear un vídeo de macrobloques e as súas predicións usando ffmpeg. Para comprender o significado de cada cor de bloque, terás que ler a documentación de ffmpeg.

Como funciona un códec de vídeo? Parte 1: Fundamentos

Ou pode usar Intel Video Pro Analyzer (como mencionei anteriormente, a versión de proba gratuíta está limitada aos primeiros 10 fotogramas, pero isto será suficiente para vostede ao principio).

Como funciona un códec de vídeo? Parte 1: Fundamentos

A segunda parte: Como funciona o codec de vídeo

Fonte: www.habr.com

Engadir un comentario