Edição de vídeo parcial sem transcodificação

0

é possível fazer edições parciais em cada quadro de vídeo (por exemplo, adicionar um logotipo) sem transcodificar? E salve o vídeo com o mesmo formato?

Quero dizer, as posições dos pixels de cada quadro são calculáveis; então é possível modificar bytes de arquivo de tal forma que eles resultem na mudança desejada em um quadro (por exemplo, adicionando um logotipo)?

Sei que em formatos como XviD isso não é possível (pelo menos com facilidade), mas é completamente impossível ou é possível para alguns tipos de formatos (por exemplo, MPG ou AVI bruto)?

    
por RYN 30.04.2013 / 00:27

2 respostas

5

Isso é apenas (praticamente) possível para a codificação de vídeo sem perdas.

Sem perdas para sem perdas

É muito simples fazer o que você deseja para codecs de vídeo codificados sem perdas. Muitos deles armazenam os dados de vídeo pixel a pixel, principalmente no espaço de cores YUV . Além disso, cada quadro fica por conta própria.

Seria muito fácil editar esse vídeo porque você sabe onde cada quadro está e onde cada posição de pixel está no fluxo de bytes. Você pode simplesmente sobrescrever partes do fluxo de bytes sem consequências para o fluxo restante. Mesmo se o vídeo sem perda fosse comprimido aritmeticamente, você poderia descompactá-lo primeiro, editar e depois compactar e salvar novamente - não há problema com isso.

Assim, por exemplo, se você tiver um vídeo YUV bruto em um contêiner AVI, poderá editá-lo quadro a quadro e salvá-lo em YUV em AVI novamente.

Mantendo a codificação com perdas

Mas se você quiser fazer a codificação de vídeo com perdas - ou manter a codificação com perdas original - após a etapa de edição, isso é impossível. Existem dois problemas com isso: o próprio processo de codificação e o fato de que, frequentemente, os quadros dependem uns dos outros.

A compactação com perdas tenta remover a redundância o máximo possível, removendo detalhes que o olho humano não vê. Isso é feito em várias etapas, mas a mais importante envolve a transformação do domínio de pixel no domínio da frequência, geralmente com variantes da Transformação de cosseno discreta .

O que esta etapa faz é que ela leva um bloco de, digamos, 8 × 8 pixels e a transforma em um bloco de coeficientes de freqüência. A partir desse bloco, determinados coeficientes são descartados, o que reduz a quantidade de informações (e, portanto, comprime o tamanho), mas também elimina as informações visuais, o que reduz a qualidade do vídeo. Quais coeficientes são descartados depende da configuração de qualidade do codificador. O vídeo não é armazenado como pixels, mas como coeficientes de frequência.

Quando você quer editar um vídeo com perdas, você primeiro tem que reconstruir os coeficientes de freqüência em uma representação pixel a pixel novamente (como mencionado acima). Nesse ponto, você poderia editar o vídeo e inserir um logotipo, mas, depois de armazená-lo novamente, teria que executar a etapa de transformação novamente e descartar as informações. Esta é, em essência, a principal causa da perda de geração .

Outro problema é o fato de que, para a maioria dos vídeos com perdas, alguns quadros dependem das informações contidas em outros quadros . Mais especificamente, quadros B e P contêm apenas deslocamentos de quadros B / P ou I anteriores (ou posteriores). Se você alterar o conteúdo de um quadro I, todos os outros quadros dependentes serão alterados quando forem decodificados, o que normalmente não é o que você deseja. A resposta de Peter Cordes abaixo destaca esse ponto. E, de fato, ele está certo que em princípio , você poderia editar um vídeo com perda de quadros apenas em no lugar , mas seria praticamente muito difícil de realizar.

Então, de maneira muito simples, a menos que você consiga armazenar um vídeo sem perdas, não é possível editar um vídeo no local sem sacrificar a qualidade.

    
por 01.05.2013 / 14:25
2

O slhck está correto se estamos falando de codecs de vídeo complexos com vetores de movimento (edit: na verdade, qualquer tipo de previsão intra ou inter). Você pode modificar um fluxo h.264 recodificando somente os macroblocos na área que deseja substituir por seu logotipo. Logo em quadros I, pule blocos em quadros P e B. Mas toda vez que a câmera se movesse, haveria blocos próximos que pegariam seus dados de imagem copiando da parte da foto que agora tem o logotipo. Assim, as bordas do seu logotipo seriam copiadas, corrompendo outras partes da imagem até o próximo quadro.

Então ele está certo, mas é por causa de referências, não de perdas. (edit: Suas edições esclarecem a maior parte da confusão.)

Para codecs mais simples, em que cada bloco é independente (nem mesmo qualquer previsão intra), por ex. mjpeg, você poderia substituir os blocos codificados somente na área que você queria para o logotipo, sem decodificar / re-codificar o resto da imagem. Eu acho que há suporte para fazer isso em um único arquivo de imagem jpeg, mas IDK se qualquer coisa suportar isso para mjpeg, sem quebrar os quadros para separar arquivos jpeg.

link tem informações sobre como usar o jpegtran para substituir alguns blocos de arquivos jpeg, sem decodificar / codificar o restante a imagem.

Veja um exemplo de mexer com um fluxo de vídeo sem decodificação / recodificação. Ocultar dados em um fluxo h.264, nos baixos coeficientes de macroblocos iPCM. (literal, não DCTed, codificação.) Você tem que decodificar / recodificar a camada de codificação de entropia da CABAC. (É a compressão final do tipo zip para o fluxo de bits).

Se a fonte estiver em um formato sem perdas, você não estará incorrendo em um enorme custo de tamanho de arquivo, descompactando, editando e recompactando tudo, apenas CPU. Muitos formatos sem perdas essencialmente compactam cada quadro inteiro separadamente, em vez de operar em blocos, então você teria que fazer uma descompactação de edição de descompactação completa. O h.264 sem perdas tem toda a previsão inter e intra do h.264 com perdas normais, portanto, mesmo que tenha macroblocos, também é necessária uma codificação de edição de decodificação completa.

Nada disso muda nada para o objetivo prático real de marcar um vídeo, a menos que sua fonte com perdas seja mjpeg. Eu só estou escrevendo isso para aqueles curiosos sobre o porquê.

    
por 15.01.2015 / 06:34