Como um computador reproduz um vídeo enquanto faz outra coisa?

8

Como é feita a reprodução de vídeo em um computador? Obviamente, não depende apenas da CPU, pois a reprodução de vídeo continua quando um usuário realiza outra atividade, como digitar em um campo de comentários do YouTube. Essa tarefa parece ainda mais complicada no caso de streaming de vídeo, onde presumivelmente é necessário transferir dados da interface de rede para o controlador de vídeo / gráficos.

EDIT: Eu deveria ter deixado claro que entendo que a CPU alterna entre vários processos e threads o tempo todo. Minha pergunta era para ser mais especificamente sobre a reprodução de vídeo. O processamento de vídeo é feito no chipset / placa gráfica? Normalmente, eles oferecem buffer? Ou tudo isso pode ser tratado por uma CPU de núcleo único com tempo de sobra para outras tarefas, ou estou errado ao pensar que as CPUs de baixo custo podem reproduzir vídeo sem atrasos (que não sejam da rede)?

Ellen Spertus
fonte
2
Qualquer núcleo pode apenas executar uma operação em um determinado intervalo de tempo discreto - mas, como é muito rápido, pode alternar entre fazer as coisas tão rapidamente que não conseguimos detectá-lo. Se pudéssemos ouvir ou ver a tempo etapas no intervalo de nanossegundos, pareceria / soaria como se estivesse gaguejando. Agendar seria o tópico aproximado para isso, presumo; o truque é provavelmente agendar coisas sensíveis ao tempo (como reproduzir mídia ou alterar o conteúdo da tela) com frequência suficiente para que nosso cérebro não consiga descobrir que algo foi feito no meio. (Nota: o acima é adivinhação áspero, mas que é onde eu ficaria.)
G. Bach
1
Adicione ao comentário anterior que os chips modernos têm vários núcleos (leia-se: vários CPUs) e que existem outros processadores para compartilhar a carga de trabalho, como o processador gráfico.
babou
Obrigado, mas pensei em vários núcleos e o rejeitei, pois parecia que mesmo os computadores antigos antigos podem fazer outra coisa enquanto exibem vídeos.
Ellen Spertus

Respostas:

3

Uma placa gráfica moderna funciona mais ou menos (um pouco) o mesmo que uma CPU comum.

Em uma placa gráfica, você terá (às vezes) vários processadores, cada processador terá (às vezes) vários multiprocessadores, cada um com vários núcleos.

Quando um vídeo é carregado em uma placa gráfica, ele é transcodificado no buffer de saída por uma certa alocação de núcleos de multiprocessador. Esse buffer de saída geralmente é uma memória acessível globalmente, o que significa que qualquer núcleo de qualquer multiprocessador de pelo menos um processador (mas geralmente todos) tem acesso direto a ele.

Normalmente, um multiprocessador é limitado a um conjunto de instruções, o que significa que uma placa de vídeo pode operar simultaneamente com tantos "sabores" diferentes de threads quanto os multiprocessadores na placa. Um "sabor" pode, por exemplo, ser uma simulação física, uma renderização de vídeo, uma renderização do SO ou uma função criptográfica. Naturalmente, um multiprocessador pode agendar vários tipos de encadeamentos para serem executados intermitentemente, mas isso geralmente não é necessário.

Decodificar um vídeo geralmente é muito trabalhoso, considerando como geralmente é compactado e às vezes criptografado, para que o buffer de exibição nem sempre esteja ocupado. Portanto, é relativamente fácil renderizar o cursor do mouse sobre um quadro de vídeo. No entanto, às vezes isso não funciona e você verá como, em alguns aplicativos, seu cursor desaparece. Isso não é necessariamente porque o aplicativo está "em cima" do sistema operacional, mas simplesmente porque está sobrecarregando parte do buffer de saída.

hóspede
fonte
3

Isso é implementado usando várias técnicas diferentes. Dentro do aplicativo (por exemplo, o navegador da web), o programa pode executar diferentes threads de execução. Um segmento pode executar a transmissão / reprodução de vídeo, enquanto um segmento diferente pode lidar com o usuário digitando no campo de comentário.

Esses threads, juntamente com muitos outros threads e processos, são agendados pelo sistema operacional (mesmo se você tiver apenas o navegador da web aberto, o sistema operacional terá muitas tarefas em segundo plano em execução, como o gerenciador de janelas, o spooler de impressão, o Gerenciador de dispositivos USB, etc). O trabalho do agendador do SO é determinar qual encadeamento pode ser executado ativamente, em qual núcleo do processador e por quanto tempo. Em um sistema típico, um encadeamento pode ser executado até algum valor limite, suponha 100 milissegundos, antes que o planejador permita que outra tarefa seja executada.

Essa alternância de tarefas é fundamental para todos os sistemas operacionais modernos (Windows, Linux, UNIX etc.) e geralmente é uma parte significativa de um curso de graduação em sistemas operacionais.

Ken P
fonte
Obrigado pela resposta. Eu deveria ter deixado claro que sei sobre multi-threading e multi-programação. (Na verdade eu estou ensinando um sistema operacional de graduação curso para sobre a décima vez.) Eu só não entendo especificamente como reprodução de obras de vídeo
Ellen Spertus
1
@espertus Aqui está um artigo sobre o agendamento de mídia contínua , talvez isso possa esclarecer algumas de suas preocupações. Embora ter que ler seja muito mais trabalhoso do que alguém apenas fornecendo uma resposta, achei que pelo menos é um ponto de partida, pois não tenho certeza se temos alguém neste fórum versado nas questões relevantes.
G. Bach
2

A reprodução de vídeo não é tão especial. Certamente, a decodificação acelerada por GPU é comum atualmente, o que libera a CPU para outros trabalhos, mas nem sempre foi assim. A reprodução suave de vídeo com apenas uma única CPU é definitivamente possível, desde que haja CPU suficiente disponível para a resolução e complexidade do algoritmo de compactação, e fazê-lo junto com outras tarefas seja o mais possível, desde que haja CPU suficiente para ambos, e o sistema operacional agenda bem. O vídeo a 30fps é comum, o que permite 33ms para decodificar cada quadro. Até chips bastante antigos podem gerenciar isso para MPEG-2 com qualidade SD, e chips modernos podem gerenciar para HD MPEG-4; o laptop em que estou digitando isso requer cerca de 20% da CPU para reproduzir o AVC de alto perfil em 720p.

Quanto ao buffer, há uma quantidade limitada disponível. O mínimo para qualquer coisa que não queira rasgar a tela é "buffer duplo", onde há dois quadros na memória: a placa de vídeo exibe um enquanto o software atualiza o outro, e as funções dos dois são trocadas durante o processo vertical. atualizar. Com o "buffer triplo", existem dois quadros fora da tela, o próximo e o próximo + 1, o que reduz a quantidade de tremulação. Em placas modernas com grandes quantidades de RAM, é possível ir além disso para um número maior de quadros, com as únicas desvantagens sendo a latência visível pelo usuário na busca, início da reprodução etc. e o fato de que outros aplicativos podem querer a RAM de vídeo para si mesmos .

hobbs
fonte