Diferença entre H.264 e x264 e como reproduzi-lo

23

Isenção de responsabilidade : esta não é uma pergunta real, mas "compartilhe seu conhecimento, estilo de perguntas e respostas"

Então, eu estou executando o Xbmc no meu Raspberry Pi e estou tendo problemas para entender o que realmente posso jogar com ele e o que não.

Li que o RPi pode reproduzir vídeos codificados em H.264 , mas só consigo encontrar vídeos codificados em x264 . Isso funcionará também? E se sim, por que alguns arquivos provavelmente não funcionarão?

Lukas Knuth
fonte

Respostas:

41

Parece haver muitos mal-entendidos sobre o que realmente é o H.264 (com um ponto). Então, citando da Wikipedia :

H.264 / MPEG-4 Part 10 ou AVC (Advanced Video Coding) é um padrão para compactação de vídeo e atualmente é um dos formatos mais usados ​​[...]

A parte importante a ser destacada aqui é que é apenas um padrão . Isso significa que os vídeos não são realmente codificados com o H.264, mas com um codec que atenda ao padrão H.264. Um dos mais comuns é x264 (x minúsculo, sem ponto):

x264 é uma biblioteca de software livre para codificação de fluxos de vídeo no formato AVC H.264 / MPEG-4.
[...]
x264 implementa um grande número de recursos em comparação com outros codificadores H.264.

Portanto, o H.264 é uma espécie de interface e x264 é uma implementação (com a funcionalidade real) dessa interface.

Portanto, o Pi reproduzirá arquivos codificados x264 muito bem.


Então por que alguns arquivos x264 codificado não jogar sem problemas, mas parar a cada 4-6 segundos (dependendo da quantidade de GPU-Ram)?

Na maioria das vezes, é o som . Como o x264 é um codificador para arquivos de vídeo HD, a maioria desses arquivos vem com uma trilha sonora digital de alta qualidade, que usa o codec DTS .

O Pi (no momento) não é capaz de decodificar por hardware a trilha DTS e sua CPU não é poderosa o suficiente. Há uma discussão sobre isso nos fóruns oficiais, que vale a pena examinar.

Para descobrir se esse é o seu caso, você pode usar a mediainfoferramenta - (deve ser instalada, os nomes dos pacotes dependem da sua distribuição):

[tv@raspberry]$ mediainfo some_random_movie.mkv 
# Shortened output!
Audio #2
ID                                       : 3
Format                                   : DTS
Format/Info                              : Digital Theater Systems
Codec ID                                 : A_DTS

Agora você tem duas opções:

  1. Compre um receptor compatível com DTS (talvez sua TV também faça isso?) E ative o "pass-through" (último ponto) no Xbmc (ou qualquer outro player que você esteja usando).
  2. Converta as trilhas DTS em AC3, que podem ser passadas (mais rapidamente) ou decodificadas pela CPU.

Para descobrir do que o seu receptor (o que você conectou no cabo HDMI) é capaz, use a tvserviceferramenta-(que não está no CAMINHO, para que você precise do caminho completo):

[tv@raspberry ~]$ /opt/vc/bin/tvservice -a
     PCM supported: Max channels: 2, Max samplerate:  48kHz, Max samplesize 24 bits.
     AC3 supported: Max channels: 6, Max samplerate:  48kHz, Max rate  640 kb/s.

Como você pode ver, meu receptor atual é capaz de decodificar PCM e AC3 (não DTS).

Minha solução para esse problema é converter as trilhas de áudio DTS para AC3. Aqui está um pequeno liner que converte todos os fluxos de áudio no infile.mkvAC3 e não toca no vídeo:

ffmpeg :

ffmpeg -i infile.mkv -map 0 -codec:v copy -codec:s copy -codec:a ac3 outfile.mkv

avconv :

avconv -i infile.mkv -map 0 -vcodec copy -acodec ac3 -ab 256k outfile.mkv

Nota: O comando acima também define a taxa de bits para o fluxo de áudio codificado em AC3 resultante (o que é necessário, ao que parece). Embora 256kbps seja razoavelmente bom (a maioria dos DVDs usa 192kbps), você pode querer aumentar / diminuir.

Felizmente, isso leva apenas cerca de 5 minutos (dependendo do seu hardware, é claro). Como um pequeno bônus, seu arquivo fica menor e, se você não for um audiófilo , não ouvirá diferença.


Ainda assim, os filmes em FullHD 1080p são gagos , a tela fica preta por alguns segundos sem som, mas a reprodução do vídeo parece continuar. O filme é codificado em H.264 em um contêiner MKV com faixas AC3. Qual é o problema?

Provavelmente, não há nada de errado com o arquivo de filme, mas com as configurações do Xbmc. No meu caso, o problema era a "taxa de atualização" do Xbmc . Isso é definido como 60Hz por padrão. Para 720p e quaisquer outros arquivos de vídeo pequenos, isso parece não ser um problema para o Pi, mas os arquivos 1080p resultam no problema acima.

Reduza a taxa de atualização para algo abaixo de 60Hz (pelo menos 24Hz são suficientes para filmes). Existem duas opções aqui:

  1. Xbmc global (incluindo o próprio Xbmc): System -> Settings -> System -> Video output -> Refresh rate
  2. Somente filmes (determinados pelo arquivo de vídeo): System -> Settings -> Video -> Playback -> Adjust display refresh rate to match video

Depois de diminuir a taxa de atualização, os filmes em 1080p também devem ser reproduzidos corretamente.

Lukas Knuth
fonte
7
Muito possivelmente, a melhor resposta em RaspberryPi.stackexchange.com.
Vincent P
Ah, também vejo que o ffmpeg está disponível para o RPI. sudo apt-get install ffmpeg. Você já tentou isso no RPI? Isso funciona bem?
Vincent P
3
@Raphael não, não é: stackoverflow.com/a/9477756/717341
Lukas Knuth
1
@ Rafael, depende da sua distribuição. No ArchLinux, não vejo esse problema.
Lukas Knuth
1
@LukasKnuth boa resposta, exceto que ffmpegnão é preterida. avconvé um garfo.
aergistal