Streamming e download ao mesmo tempo.

Há um vídeo enoooorme na internet em que você tem muito interesse. Por exemplo, a palestra de tableless que eu publiquei esse dias. Você quer baixar e guardar o vídeo, mas ao mesmo tempo quer assistí-lo logo. Se você iniciar o download e tentar assistir via streamming ao mesmo tempo, vai consumir o dobro da banda necessária, o streamming vai ficar pausando a cada dois segundos e o download vai levar muito tempo. O que fazer? Não sei se há no Windows algum player que faça download e toque ao mesmo tempo. No linux[bb] eu resolvo assim, numa janela de terminal:

wget -c http://files.elcio.com.br/tableless.wmv

Em outra:

tail -c 10000000000 -f tableless.wmv |mplayer -

Explicando, o primeiro comando, o wget, faz o download do vídeo. O parâmetro -c faz com que, se o arquivo existir, o download seja continuado de onde parou. Isso é útil porque se o download for interrompido, depois você pode continuá-lo com o mesmo comando.

O segundo é uma concatenação de comandos Unix[bb]. A parte “tail -c 10000000000 -f tableless.wmv” é um comando e “mplayer -” é outro. O primeiro usa o tail, que imprime o final de um arquivo. Experimente, por exemplo:

tail /var/log/syslog

Você vai ver as últimas linhas do log do sistema. O parâmetro -c recebe um número, o número de bytes a imprimir a partir do fim do arquivo. Você pode colocar qualquer número que seja maior que o arquivo inteiro. O parâmetro -f faz o tail ficar esperando por conteúdo novo no fim do arquivo. Experimente rodar num terminal, por exemplo:

tail -f /var/log/syslog

Você vai ver as últimas linhas do syslog e o tail vai ficar esperando por conteúdo novo. Abra programas, execute ações no sistema, pare e inicie daemons e você vai ver as novas linhas aparecendo ali. A mesma coisa acontece como vídeo. O tail vai despejar na tela todo o conteúdo do arquivo, e vai ficar esperando. A medida que o wget baixa mais dados, o tail vai imprimindo o que chega.

O caracter |, chamado pipe, direciona a saída de um comando para outro. Assim, o tail, ao invés de imprimir os dados do vídeo na tela, os envia para o mplayer. Ao invés de indicar ao mplayer um arquivo ou url que ele deva tocar, colocamos como parâmetro um hífen (-) que diz que ele deve ler da entrada padrão. Assim, ele lê os dados que o tail envia para ele.

Percebe o que fizemos? Colocamos para trabalhar juntos três programas diferentes, escritos por pessoas diferentes, e tudo funcionou. As coisas geralmente são assim no Linux, porque os programas Unix são feitos para que você possa usá-los juntos. Se você quiser saber mais sobre isso, recomendo um livro, disponível gratuitamente online: The Art of Unix Programming, do Eric Raymond.

Publicado por

Elcio

Elcio é sócio fundador da Visie Padrões Web. Pioneiro no uso e divulgação dos padrões do W3C no Brasil, Elcio já treinou equipes de dezenas de empresas como Globo.com, Terra, Petrobras, iG e Locaweb. Além disso, tem dirigido as equipes da Visie no desenvolvimento de projetos web para marcas como Brastemp, Itaú Unibanco, Johnson & Johnson e Rede Globo.

7 comentários em “Streamming e download ao mesmo tempo.”

  1. Podria me mandar o Wget para windows e algumas digas??
    Se possivél e interface em delfhi também.

    Veja só, tenho a neessidade de duas vezes por dia buscar um arquivo txt em um determinado servidor, sem burocracia, de um maneira automatica, me disseram que o wgetwin devidamente configurado como script funcionaria.

    Vc pode me ajudar??

  2. Olá Elcio,

    Tem uma versão do Wget para windows que faz o mesmo esquema que a do Linux.

    Tem uma opção -c para continuar. Com isso o arquivo de vídeo é gerado e assim posso assistir o vídeo enquanto faço download.

    Se quiser, posso te mandar o Wget para windows (juntamente com uma interface em Delphi que fiz).

    []s
    Gustavo

  3. Não sou muito versado em Linux (ou Unix), mas se o propósito é colocar um comprimento maior que o próprio arquivo, não bastaria usar cat -f?

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *