Codificação para reprodução suave de vídeos para frente e para trás

1

Existe uma maneira de codificar um vídeo para que a reprodução para frente e para trás seja muito suave? É possível em h264?

Meu entendimento da estrutura básica da codificação de vídeo é que, se o vídeo for composto de quadros

f1  f2  f3  f4  f5  f6  f7  f8  f9  f10 ...

que são codificados como

i1  d2  d3  d4  d5  i6  d7  d8  d9  d10 ...

onde

i(k) == f(k), d(k) == f(k) - f(k-1)

ou seja, i é um iframe e d é uma diferença de quadros, de modo que o tamanho do vídeo é muito menor que o tamanho de todas as imagens (quadros) porque os deltas são menores que os quadros inteiros. Então, para obter f8 , preciso transmitir e decodificar o iframe anteriori6 mais próximo e aplicar os deltas.

Assim, o custo de decodificação / streaming por quadro daqui para frente é, no máximo, o custo de um iframe. Mas indo para trás, pode ser muito mais. Por exemplo, se em f6 eu quiser ir para o quadro anterior f5 , preciso decodificar tudo do iframe anteriorf1. Existe uma maneira de codificar as coisas para que isso não aconteça, por exemplo, além de contar as informações convenientes (e de alguma forma redundantes) f6 - f5 ?

Estou familiarizado com o ffmpeg e, idealmente, gostaria de usá-lo.

Meu caso de uso é o seguinte:

Estou transmitindo um vídeo para um cliente móvel. O vídeo é sempre pausado e o usuário procura para frente e para trás por meio de um controle deslizante. A busca por trás às vezes congelou, e eu acredito que é quando está passando por um quadro-chave e tem que voltar muito e redecodar para alcançar o quadro anterior. A busca avançada está bem.

    
por Guig 28.10.2016 / 04:25

1 resposta

2

Parece que você deseja usar um quadro chave para cada quadro, para que não haja compactação direta. Se cada quadro é armazenado inteiramente (embora compactado), o custo de retroceder e avançar seria o mesmo (exceto o custo do espaço de armazenamento adicional). M-JPEG faz isso naturalmente, por exemplo.

Com o H264, você pode definir a distância mínima e máxima entre os quadros principais (iframes) ao usar o ffmpeg:

--keyint <integer> (x264)
-g <integer> (FFmpeg)
Keyframe interval, also known as GOP length. This 
determines the maximum distance between I-frames. 
Very high GOP lengths will result in slightly more 
efficient compression, but will make seeking in the 
video somewhat more difficult. Recommended default: 250 

--min-keyint <integer> (x264)
-keyint_min <integer> (FFmpeg)
Minimum GOP length, the minimum distance between I-frames. 
Recommended default: 25 

Se você definir ambos para 1, isso deverá forçar um iframe por quadro e nenhum quadro de previsão ou delta.

    
por 28.10.2016 / 04:53