[Bruno F. M. Souza] Distribuição de vídeos em Flash com P2P

A Octoshape lançou seu plugin (Octoshape Grid Delivery Enhancement for Adobe Flash Player) para players de vídeo em Flash visando a distribuição de vídeos ao vivo codificados em VP6 (On2) utilizando uma arquitetura peer-to-peer.

O case que tive contato é a CNN Live. Mas vi que outros big players também estão adotando a solução. Exemplos são a transmissão ao vivo da NBA e dos jogos olímpicos de Pequim.

Como?

O funcionamento é, mais ou menos, assim: após a instalação, o player faz o GET da playlist (ASX) que possui como primeira entrada a URL para consumo do vídeo através do plugin da Octoshape. Caso o usuário não tenha o mesmo instalado, ele será direcionado para os demais streams unicast que são distribuídos por suas CDN`s via rtmp.

<asx>
    <!-- file written from rtm2 template on cdn8mon1 -->
    <entry>
        <ref href="octoshape://octodir.hwcdn.net/hwo.u4j9w4s3.cnn_stream1_high"
            clients="0" highwater="250000" lowwater="200000"/>
        <!--
        Below here are the regular cdns, randomly sorted by weight
        -->
        <ref href="rtmp://cp44679.live.edgefcs.net/live/cnn_stream1_low@2785"
            weight="100"/>
        <ref href="rtmp://cnntriallivefs.fplive.net/cnntriallive-live/cnntrialstream1"
            weight=""/>
        <ref href="rtmp://cnn.fc.llnwd.net/cnn/cnn_stream1_low" weight=""/>
    </entry>
</asx>

Ao fazer o GET para o plugin da Octoshape, conforme indicado na playlist acima, a requisição é redirecionada para um GET local na porta 5861/TCP, que é a porta que o plugin realiza a comunicação para o delivery do vídeo para o Flash Player, como se este último estivesse realizando um download progressivo de um vídeo com tamanho “infinito”:

(Request-Line)	GET /pm/1/1228133155182/hwou4j9w4s3cnnstream1high HTTP/1.1
Host	        localhost:5861

(Status-Line)	HTTP/1.0 200 OK
Content-Length	2147483647
Content-Type	video/x-flv

Apesar do baixíssimo consumo de memória e CPU, a qualidade do vídeo final (lembrando que trata-se de um vídeo ao vivo) é muito boa. Fontes ocultas disseram que estão codificando a uma taxa de 600kbps com VP6:

VIDEO:  [VP6F]  576x324  0bpp  15.000 fps    0.0 kbps ( 0.0 kbyte/s)
=======================================================================
Opening video decoder: [ffmpeg] FFmpeg's libavcodec codec family
Selected video codec: [ffvp6f] vfm: ffmpeg (FFmpeg VP6 Flash decoder)
=======================================================================
=======================================================================
Opening audio decoder: [mp3lib] MPEG layer-2, layer-3
mpg123: Can't rewind stream by 584 bits!
AUDIO: 44100 Hz, 2 ch, s16le, 48.0 kbit/3.40% (ratio: 6000->176400)
Selected audio codec: [mp3] afm: mp3lib (mp3lib MPEG layer-2, layer-3)

E não é só a qualidade da imagem - na verdade, a Octoshape não possui nenhuma interferência nas etapas de processamento de imagens, visto que o foco deles é o delivery do stream. E aí sim vale ressaltar a boa capacidade de adaptação às condições da rede, evitando situações de re-buffering e fazendo um bom uso das bandas de download e upload.

Instalação

Para a instalação, vi que, ao entrar no site para visualizar o stream de vídeo ao video, o player faz a validação da versão do Flash Player. Através do Express Install, ele sugere a atualização para a versão 10.

...
    useExpressInstall:function(_d){
        this.xiSWFPath=!_d?"expressinstall.swf":_d;
        this.setAttribute("useExpressInstall",true);
    }
...

Depois, verifica se o mesmo é compativel com a extensão da Octoshape:

LivePlayer.prototype.isOctoCapable = function(){
    var os = navigator.userAgent.toLowerCase();
    return !(os.indexOf("mac") > -1 && os.indexOf("10.3") > -1);
}

E sugere a instalação da mesma.

Aceita-se os termos de uso e, pronto.

Então…

Minha única dúvida ficou por conta da necessidade de instalação do Flash Player 10 para poder utilizar o plugin. Provavelmente, o mesmo deve ter algum tipo de integração com o Flash Media Server 3.5. Um dos pontos seria o chaveamento automático do stream de acordo com a disponibilizade de banda do usuário (Dynamic Streaming) - procurando sempre a melhor relação qualidade de imagem/consumo de banda.

Enfim, uma ótima alternativa para baratear os custos de servir vídeo de qualidade na internet…