TLDR? Certifique-se de que o seu regulador de frequência da CPU não esteja sendo alterado por algum daemon ou script acionado por evento (por exemplo, um script de gerenciamento de energia).
História (entediante)
Eu tive esse problema em dois sistemas Ubuntu diferentes, especialmente quando reproduzo vídeos h264 / x264. A reprodução de vídeo fica lenta, enquanto o áudio continua normalmente. Às vezes, ele alcança sozinho, mas às vezes leva 30 segundos antes que isso aconteça!
Usando um gráfico em tempo real do uso da CPU, notei que o uso da CPU fica muito maior quando o problema ocorre (pelo menos como uma proporção da frequência atual, que infelizmente não estou rastreando).
Uma correção temporária é interagir com o MPlayer, fazendo com que ele o acompanhe rapidamente, usando um dos seguintes métodos:
- Altere a velocidade de reprodução pressionando
[
, em seguida, ]
- Mude para dentro / fora da tela inteira pressionando
F
duas vezes
- Retroceder e avançar, pressionando Esquerda e Direita
Mas, curiosamente, quando eu escrevi um script para enviar essas chaves automaticamente, a solução não alcançou como esperado! Parece que a interação física real com o teclado foi necessária ...
A causa: governador de economia de energia!
Finalmente, descobri que o problema estava relacionado ao governador da CPU. Parece que o script /etc/pm/power.d/cpu_frequency
(no meu Ubuntu 12.04) está configurando intermitentemente o regulador de frequência para powersave
, mesmo que eu permaneça conectado à energia CA. (Isso pode ser devido a um bug de software ou hardware, por exemplo, um cabo de força desonesto.)
Pouco depois (às vezes segundos, às vezes minutos) o script define o governador de volta para ondemand
, então pode não ser fácil detectar isso acontecendo! (Eu detectei adicionando alguns logs no script: echo "[$(date)] $0 was run with args $*" >> /tmp/cpu_frequency.log
)
Solução temporária (boa para teste)
Inicialmente, resolvi o problema executando este pequeno script em um terminal enquanto assistia a um vídeo:
while true; do cpufreq-set -c 0 -g performance ; cpufreq-set -c 1 -g performance ; sleep 2; done
Este script requer que você tenha o pacote cpufrequtils
installed: sudo apt-get install cpufrequtils
.
Ele simplesmente garante que a CPU funcione a toda velocidade a todo momento, forçada a cada 2 segundos. (Muito ocasionalmente eu vejo o A / V perder a sincronia por um momento, mas depois ele alcança.)
Como você pode ver, esse script foi escrito para dois núcleos. Mas eu adaptei este script para trabalhar com qualquer número de núcleos:
#!/bin/bash
while [[ 1 ]]
do
for CPUFREQ in /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
do
[ -f $CPUFREQ ] || continue
echo -n performance > $CPUFREQ
done
sleep 2
done
Isso faz exatamente a mesma coisa e não requer o pacote cpufrequtils
, mas não é uma linha única.
Solução permanente
Em vez de usar um desses scripts acima, podemos tornar a solução mais permanente, desativando o script que está causando problemas.
Uma maneira de fazer isso é remover o script problemático:
sudo rm /etc/pm/power.d/cpu_frequency
Mas uma maneira menos destrutiva seria editar o script. Basta adicionar duas linhas em algum lugar perto da parte superior do arquivo:
# <date_here> Disabled by <your_name> to assist mplayer A/V sync
exit 0
Mas cuidado, esta solução permanente significa que o script não mudará para o modo de economia de energia quando você realmente estiver desconectado da energia CA, para que sua bateria não dure tanto quanto o normal!
(Embora no meu sistema, um Asus X453M, ele não mudou para a economia de energia permanentemente até que a carga da bateria tenha caído muito de qualquer maneira.)
Espero que isso ajude você. Esse problema foi muito frustrante para mim!