MPlayer: seu sistema é muito lento para jogar isso!

6

Eu apenas tentei reproduzir um arquivo de vídeo AVCHD de 1080p gravado a 60 FPS com minha Sony DSLR na minha estação de trabalho Ubuntu 12.04, e para minha surpresa, o MPlayer não conseguiu reproduzir o vídeo sem problemas. Eu copiei o arquivo para um disco rígido local.

O vídeo é reproduzido mais lentamente do que deveria e o A-V desync continua crescendo de forma constante (cerca de 1 segundo de dessincronização por 10 segundos de reprodução). Um dos 8 encadeamentos da CPU dispara até 100%.

Eu queria saber se isso é esperado no meu hardware. É um pouco difícil de acreditar, considerando que meu laptop T60 reproduz o vídeo muito bem, então eu suspeito de problemas de software.

Especificações da estação de trabalho:

  • CPU: Intel Quad Core i7-920 @ 2.67GHz
  • GPU: Nvidia GeForce 9600 GSO 512
  • RAM: 8Gb
  • Compiz se estiver funcionando corretamente, embora eu tenha desativado para este teste (sem melhora na reprodução de vídeo)
  • O sistema geralmente é extremamente rápido e responsivo.
  • Reproduzir um MP4 com fluxo 1080p h264 a 30 FPS funciona bem.
  
root@boss:~# glxinfo | grep direct
direct rendering: Yes

root@boss:~# glxinfo | grep vendor
server glx vendor string: NVIDIA Corporation
client glx vendor string: NVIDIA Corporation
OpenGL vendor string: NVIDIA Corporation


Saída do Mplayer:

valprj@boss:~$ mplayer 00006.MTS 
MPlayer svn r34540 (Ubuntu), built with gcc-4.6 (C) 2000-2012 MPlayer Team
mplayer: could not connect to socket
mplayer: No such file or directory
Failed to open LIRC support. You will not be able to use your remote control.

Playing 00006.MTS.
libavformat version 53.21.1 (external)
Mismatching header version 53.19.0
TS file format detected.
VIDEO H264(pid=4113) AUDIO A52(pid=4352) SUB Teletext(pid=4608)  PROGRAM N. 1
FPS seems to be: 59.940060
Load subtitles in ./
==========================================================================
Opening video decoder: [ffmpeg] FFmpeg's libavcodec codec family
libavcodec version 53.35.0 (external)
Mismatching header version 53.32.2
Selected video codec: [ffh264] vfm: ffmpeg (FFmpeg H.264)
==========================================================================
==========================================================================
Opening audio decoder: [ffmpeg] FFmpeg/libavcodec audio decoders
AUDIO: 48000 Hz, 2 ch, s16le, 256.0 kbit/16.67% (ratio: 32000->192000)
Selected audio codec: [ffac3] afm: ffmpeg (FFmpeg AC-3)
==========================================================================
AO: [alsa] 48000Hz 2ch s16le (2 bytes per sample)
Starting playback...
Unsupported PixelFormat 61
Unsupported PixelFormat 53
Unsupported PixelFormat 81
Movie-Aspect is 1.78:1 - prescaling to correct movie aspect.
VO: [vdpau] 1920x1080 => 1920x1080 Planar YV12 
A:   6.6 V:   6.1 A-V:  0.496 ct: -0.017 453/453 96% 10%  0.6% 221 0 


           ************************************************
           **** Your system is too SLOW to play this!  ****
           ************************************************

Possible reasons, problems, workarounds:
- Most common: broken/buggy _audio_ driver
  - Try -ao sdl or use the OSS emulation of ALSA.
  - Experiment with different values for -autosync, 30 is a good start.
- Slow video output
  - Try a different -vo driver (-vo help for a list) or try -framedrop!
- Slow CPU
  - Don't try to play a big DVD/DivX on a slow CPU! Try some of the lavdopts,
    e.g. -vfm ffmpeg -lavdopts lowres=1:fast:skiploopfilter=all.
- Broken file
  - Try various combinations of -nobps -ni -forceidx -mc 0.
- Slow media (NFS/SMB mounts, DVD, VCD etc)
  - Try -cache 8192.
- Are you using -cache to play a non-interleaved AVI file?
  - Try -nocache.
Read DOCS/HTML/en/video.html for tuning/speedup tips.
If none of this helps you, read DOCS/HTML/en/bugreports.html.

A:   7.8 V:   7.2 A-V:  0.602 ct: -0.017 520/520 97% 10%  0.6% 286 0 
[h264 @ 0x7fe0a0468380]concealing 136 DC, 136 AC, 136 MV errors
A:  17.1 V:  15.6 A-V:  1.495 ct: -0.017 1022/1022 97%  9%  0.6% 779 0 

Exiting... (Quit)


Coisas que tentei

  • Jogar com -vc ffh264vdpau ajudou um pouco. A taxa de desassociação se tornou 1 segundo de dessincronização por 34 segundos de reprodução, e a velocidade do vídeo está quase correta. O uso da CPU caiu significativamente (20% no maior segmento cpu). Ainda assim eu recebo o:

    Your system is too SLOW to play this!

    mensagem do MPlayer.

  • Jogar com -lavdopts skiploopfilter=all fez o vídeo ser reproduzido corretamente. A CPU gira em torno de 93% e a sincronização A-V gira em torno de 0,263s


Pergunta

Então minha pergunta é: você diria que é razoável para o mplayer ter tantos problemas em reproduzir esse vídeo no meu hardware, ou você acha que há um problema de software aqui? Talvez o driver nvidia?

Qualquer ideia seria apreciada!

    
por Val Blant 08.03.2013 / 08:46

2 respostas

9

Eu não tenho certeza se você ainda precisa de ajuda, mas vou postar para futuros usuários ... Eu acredito que o problema que você está tendo é que a configuração padrão do mplayer usa apenas um núcleo de processador. Tente passar a opção "-lavdopts threads = n" (onde 'n' é o número de threads a serem usados).

mplayer -lavdopts threads=4 00006.MTS
    
por BuddyLuvve 28.04.2013 / 17:55
3

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!

    
por joeytwiddle 16.07.2015 / 22:43

Tags

Vantagens da partição separada / home na configuração HDD + SSD Como copiar / sda3 para / sda1? UUIDs não podem ser semelhantes ______ qstntxt ___

/ dev / sda é um drive de 400 gig. É partições WERE: / sda1 - partição de inicialização do Windows (100 meg); / sda2 Windows "C: \" (68 gig); / sda3 é a partição de inicialização do Linux; / sda5 é a partição / home; / sda6 é troca de linux.

/ sda1 e / sda2 foram eliminados e / sda2 expandidos para / sda1.

Eu quero clonar / sda3 para / sda1 E ter o 12.04 (pangolin preciso) conhecido para inicializar de / sda1 e não de / sda3.

Como edito o / etc / fstab e o GRUB2 para que ele seja adequado (não tenho idéia de como usar palavras para expressar essa ideia) UUID? Eu sei que usando o GParted para "copiar" / sda3 para / sda1 requer a edição para fazer a partição copiada ter um UUID que não é uma correspondência (ou o mesmo número UUID como) a partição original (/ sda3). Que outros passos devo dar para não confundir o GRUB2 e o fstab para que eles funcionem harmoniosamente e eu não prejudique o sistema operacional / dados / outras coisas no disco rígido?

Em seguida, quero encolher / sda1 para 25 gig (atualmente 68 gig) e continuar / sda1 como inicialização. Então eu quero usar 43 gig de encolher / sda1, e adicioná-lo ao (ser) não utilizado / sda3 e depois expandir / sda5 para o / sda3 expandido

Não posso postar uma captura de tela do gparted, então aqui está o fdisk -l:

%pre%     
______ azszpr254018 ___

A maneira mais fácil, IMO, é inicializar o CD de desktop do Ubuntu. Você pode usar o gparted para copiar e colar suas partições.

O único truque com o gparted é que você deve aplicar as alterações um setp de cada vez.

Exclua sda1 - > aplicar alterações - > cópia sda3 - > colar - > aplicar alterações.

Depoisdetercopiadoapartição,vocêtambémpodeusarogpartedparacriarumnovoUUID

Selecioneapartição→NovoUUID

Monteapartiçãoem/mnt

%pre%

Editefstab,insiraonovoUUIDsobaentradadosistemadearquivosraiz.

RelacioneoUUID,senecessário,comoblkid

%pre%

Reinstale/atualizeogrub

%pre%

Vejatambém:

______ azszpr253997 ___

Existe uma razão específica pela qual você deseja mover a partição do Linux de 3 para 1? Você aponta para um ganho de desempenho ou é apenas por hábito?

O caminho mais fácil

  1. Encolher a partição do Linux a partir de um Live CD
  2. Excluir partição sda1
  3. Mova a partição sda2 para o início do seu disco rígido e sda3 para trás
  4. Estenda a partição estendida que contém sda5 e sda6

O caminho correto

  1. Encolher a partição do Linux para o mínimo a partir de um Live CD
  2. Mova as partições sda2 e sda3 o mais longe possível
  3. Redimensionar e formatar sda1
  4. Copie tudo de sda3 para sda1 com %code% , modyfiy fstab de acordo com sda1
  5. Reinstale o grub com %code%
  6. Excluir partição sda1
  7. Estenda a partição estendida que contém sda5 e sda6

Pro: A partição Linux está fisicamente em primeiro lugar (e também desfragmentou a partição Linux)

Con: Envolve a reinstalação do carregador de inicialização

O caminho sujo

  1. Divida a partição / dev / sda2 (o dispositivo) com %code% em um arquivo (como um disco rígido externo), anote o tamanho exato da partição e exclua-o assim como sda1
  2. Redimensione o sda3 para o tamanho desejado e mova-o para o início do seu disco rígido
  3. Recrie a partição do Windows e grave o dump de volta na partição (alterne arquivos / dispositivos de entrada e saída)
  4. Estenda a partição estendida que contém sda5 e sda6

Pro: A partição do Linux está fisicamente em primeiro lugar, não é necessário reinstalar o gerenciador de inicialização

Con: sda3 ainda é sda3 e o que foi sda2 pode ser sda1, tome cuidado para não gravar na partição errada com %code% , o despejo leva mais tempo enquanto copia tudo (até arquivos e fragmentos de arquivos que não existem mais)

Recomendação

Siga o caminho mais fácil. Se o desempenho for importante, compre um SSD. (Eu sei que esta é a frase mais usada nos dias de hoje, mas vale a pena o esforço.)

    
___