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)?
fonte
Respostas:
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.
fonte
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.
fonte
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 .
fonte