
Eu tenho um arquivo de vídeo theora/vorbis ogg. Porém, o que noto é que usar gzip/xz pode reduzir o tamanho do arquivo em 20%/75%. Portanto, suspeito que o formato interno não comprima bem o conteúdo. Existe uma maneira de compactar o vídeo/áudio sem perdas, sem usar um formato de compactação externo? Uma solução usando ffmepg é preferida.
Saída de mediainfo
:
Format : Ogg
File size : 90.9 MiB
Duration : 27 min 52 s
Overall bit rate mode : Variable
Overall bit rate : 456 kb/s
Writing application : Lavf57.56.101
Video
ID : 1911251410 (0x71EB61D2)
Format : Theora
Duration : 27 min 52 s
Bit rate : 298 kb/s
Width : 1 920 pixels
Height : 1 080 pixels
Display aspect ratio : 16:9
Frame rate : 30.000 FPS
Compression mode : Lossy
Bits/(Pixel*Frame) : 0.005
Stream size : 59.4 MiB (65%)
Writing library : Lavf57.56.101
Audio
ID : 2001534440 (0x774CFDE8)
Format : Vorbis
Format settings, Floor : 1
Duration : 27 min 52 s
Bit rate mode : Variable
Bit rate : 131 kb/s
Channel(s) : 2 channels
Sampling rate : 48.0 kHz
Compression mode : Lossy
Stream size : 26.1 MiB (29%)
Writing library : Lavf57.56.101
Responder1
A resposta curta é:não.
Quando você compacta seu arquivo em um arquivo (como zip, 7z, rar, gzip,...), o algoritmo procura maneiras de armazenar as informações fornecidas de forma mais curta. Isto é feito, por exemplo, através deCodificação de Huffman, onde o algoritmo verifica a frequência dos valores e então armazena o valor mais frequente no número mais curto, o segundo mais usado no segundo menor número,... (isso é extremamente simplificado- leia o artigo da Wikipedia vinculado para uma explicação melhor. Além disso, é claro, a codificação de Huffman é apenas um – muito simples – exemplo de compressão). Isso também explica por que compactar um arquivo muitas vezes reduz ainda mais o tamanho do arquivo.
Portanto, a redução de 75% no tamanho do arquivo ocorre porque a ferramenta de compactação encontra uma maneira mais eficiente de armazenar as informações do que o codificador de vídeo e áudio. Porém, normalmente, não há como dizer a um codificador como armazenar as informações, pois isso é algo especificado no padrão. Às vezes, uma versão mais recente do programa de codificação pode ajudar devido a melhores implementações do padrão, mas geralmente isso se aplica apenas a codecs totalmente novos.
Seu reprodutor de vídeo, entretanto, não consegue lidar com múltiplas compressões simultaneamente. Acho que isso ocorre principalmente porque seriam necessários alguns recursos (RAM e CPU) para descompactar o arquivo compactado e depois ler o próprio arquivo. Além disso, ainda seria necessário descompactar tudo primeiro, exatamente como você precisa fazer, porque é muito difícil estimar a partir de um arquivo que você não tem onde qual fluxo está armazenado e assim por diante.
Portanto, se você precisa trabalhar com theora/vorbis, não há muito que você possa fazer a respeito. Caso contrário, se o tamanho do arquivo for sua prioridade, recomendo investigarVP8/VP9/x264/x265. Se você quiser seguir o caminho VP9, recomendo algo ao longo do Encode/VP9-Guide do FFmpeg (link logo acima):
ffmpeg -i <input> -c:v libvpx-vp9 -crf 15 -b:v 0 -c:a copy <output>
substitua <input>
e <output>
pelos respectivos nomes de arquivo (e extensões de arquivo). Ambos *.mkv e *.webm funcionam (só tentei esses dois), no entanto, *.webm parece exigirVorbiscomo um codec de áudio (por exemplo, -c:a libvorbis -q:a 6
em vez de -c:a copy
), onde *.mkv não parece ter requisitos.
-crf
especifica um fator de taxa constante (imagine-o como "qualidade visual constante"), onde valores mais baixos significam melhor qualidade.
Tudo o que foi dito acima pressupõe que seus arquivos foram codificados de forma eficiente (por exemplo, não especificando uma taxa de bits de 6 Gb/s) e com um programa funcionando corretamente. Eu, pelo menos, nunca fui capaz de compactar muito de qualquer arquivo de áudio ou vídeo compactado com perdas (mas raramente uso theora ou vorbis).