Publishing RTSP Streams on FMS! How?

For those who have ever used the Flash Media Server for video streaming, the idea of publishing a stream encapsulated in RTSP (Real Time Streaming Protocol) may seem quite strange, maybe even impossible. This is because the basic (and only) protocol used for FMS client-server communication is the RTMP (and its variations), a proprietary protocol for media streaming, from Adobe. However, in some circumstances the use of an RTMP input is almost impossible, especially when this input stream comes from legacy systems, or from external services. These specific cases require an approach where the content from a RTSP source is delivered using RTMP, that is, a translation from RTSP to RTMP via content repackaging.

The easiest way to perform this translation is using Wowza Media Server, an alternative to FMS that has many interesting features, including the RTSP input support. The problem is that sometimes is impossible to change the video architecture from FMS to other solution, especially when we have developed several applications, or when the whole environment is integrated, up, and running.

In this situation, the intuitive solution would be: we can setup a layer of Wowza Media Server before FMS Servers, working like a translation layer. With this layer, the FMS would receive a RTMP stream exactly like it receives from Flash Media Encoder, making the translation fully transparent. The challenge of this solution is that the Wowza Server cannot publish streams on FMS, so, it cannot act like a FME (from FMS perspective).

To deal with this limitation, we need to change the stream flow paradigm from push to pull, or, in other words, we need to force FMS to get the stream from Wowza. With this architecture configuration, the FMS is no longer a passive component. It is its responsibility to, not only get the video stream, but to perform the failover of the input streams, which can be done through stream multiplexing.

This change in FMS role is only possible if we use server side action script, to connect to Wowza, and to pull the stream flow. Basically, we use NetConnection and Stream classes, to establish a remote connection and to play some content (Wowza stream) through it:

myRemoteConn = new NetConnection();
myStream = Stream.get("myStream");"my_stream.sdp", 0, -1, true, myRemoteConn);

As we can see, we can use the FMS to delivery RTSP streams without great architecture changes. With Wowza Media Servers and some server side AS, it’s not too hard to make the impossible, possible!

QoS Parameters for Video Streaming

When we talk about professional media streaming, there is a lot concern with the quality of service, especially when we have large volumes of requests, or when we delivery contents in high definition. In this scenario, is essential to have a fairly clear idea about what is quality of service, and how we can identify, through objective parameters, if we’re or not at an acceptable level, which ensures a high quality experience for end users.

In the case of video streaming, quality of service means that the user should watch a certain content, without interruption (rebuffering), and without degradation of video quality caused by the delivery process (loss of frames, problems in the reconstruction of b-frames and p-frames due packet loss).

Thus, the best known parameter for evaluating the quality of a streaming service is the buffer length, which is the ability to maintain the user’s buffer always at an acceptable level, being greater enough to ensure a continuous experience independent of small variations in bandwidth available, and in the bitrate of the encoded video. Associated with this parameter, we have the average rebuffering rate, which consists of a ratio between the total time used filling the buffer, and the total playing time. This parameter is very interesting to assess the quality of service for live streaming, where users can stay connected for a long time, and, of course, they would like to play the content without interruptions.

A high quality streaming service should always keep the rate of rebuffering below 0.5%, discarding the initial buffer, at normal bandwidth availability. Moreover, this parameter can be very useful to identify network bottlenecks at content distribution process.

Another key parameters are the average frame rate and the rate of frame loss. These two parameters give us an overview of the capacity, of the server to stream the video content, and, of the users to receive and decode the stream. In case of server overloading , one of the first alternatives used to maintain a continuous experience is to reduce the frame rate, or basically, drop frames. These parameters usually indicate that either the server is not able to serve the content, or, the clients do not have the minimum conditions to receive and decode the video. These problems are usually associated with intensive CPU usage, due an excess of clients in the server side, or by lack of resources for decoding the video on the client.

For Flash Media Server specifically, some parameters related with memory usage for input and output buffer, size of buckets, and use of aggregated messages, can influence directly in the video frame rate, but in this case, we can detect the problem even with a small amount of users.

Finally, we have some parameters, not least importants, to complement the set of basic checkpoints to ensure the quality of streaming video service, including, the time to establish the connection, the rate of reconnection, the sync between audio and video, and psnr between the video decoded by the user and the video that comes out of encoder (since the loss of packets may influence the reconstruction of the frames, especially for temporal video compression). Measuring and evaluating all these parameters we can identify with much more efficiency any problem that might compromise the quality of service, which is essential for professional media streaming business.

Stream Multiplexing for FME Failover in Flash Media Server

As some may wonder, I decided write my posts in English from now, so, anyone can follow the ideas that are discussed here. To start this new era, I decided to talk a bit about how we can do the failover of live streams in Flash Media Server through internal multiplexing of signals, that is, how we can use a single live stream as a backup of several others, without burdening bandwidth available between the Flash Media Encoder and the Flash Media Server.

To get the goal of this idea a little clearer, let’s suppose that we want to perform a live transmission, where we have 3 servers running an instance of Flash Media Encoder each, and we have 3 different signals (eg cameras), linked to a each encoder. If one of these servers crashes, the stream will no longer be published on Flash Media Server, and inevitably users connected to this content will have their experience interrupted. In order to avoid this problem, we can detect that a stream is no longer running, and then send to users the signal of another encoder, in a transparent way, without playback interruption (lost of connection or rebuffering). This approach dispenses the use of a backup server for each active server, which significantly reduces the investment in hardware and bandwidth, in environments with high availability needs.

The main concept behind this approach is the separation between the publishing streams and the viewing streams, which means that the users should not connect directly into the stream published for Flash Media Encoder. In fact, users should connect to a fake stream, and the published content will be dynamically linked to it via a server side Action Script. This idea is very well explained in the article “Building a Live Video Switcher with Flash Communication Server MX“, which was the base of multiplexing for failover concept. To automate this association between publisher stream and viewers, we can use the application.onPublish and application.onUnpublish events, which are triggered when a signal is, or ceases to be published in Flash Media Server.

The challenge now is how to control, automatically, which is the backup stream and which is the main, that is, not simply store a list of active streams, we need to know which stream will be displayed to users if a failure occurs in main stream. One approach is to isolate each stream in a different instance of application, and, in addition, create two different types of applications, one for the main streams (master) and one for the backups. Each master instance will have only one stream available so that users can connect, which means that we will need to have as many instances as the number of live signals.

The main application should store/remove from a list all the active/inactive live streams (via events), so that the first stream of the list always will be associated with the stream being viewed by users. If this stream is unpublished, the application should join the users stream to the next item, which means that the backup will always be the next stream on the list.

The backup application should receive a live signal and publish it in the main applications, performing an internal multiplexing. These internal streams will be stored on main instances as backups, so, all main applications will have the same backup streams. This internal multiplexing can be implemented in a very simple way using the NetConnection and NetStream classes, also available for server side scripting.

To make clear the idea presented above, let’s take a look at this picture:

Failover for FME Streams

Failover for FME Streams

As we can see, this approach is a simple and efficient way to implement the failover of streams published by FME, which is very important in environments where high availability is a imperative requirement, and where the investment resources for bandwidth and hardware are limited.

More information about Flash Media Server Development can be found in Adobe Developer Connection

Globo Vídeos para iPhone

A lançou hoje, oficialmente, seu portal de vídeos para iPhone: Agora é possível ver os vídeos da de qualquer celular que suporte vídeos H.264!!!

Globo Videos para iPhone

Globo Vídeos para iPhone

Foi desenvolvida do zero uma nova versão do site, otimizada para iPhone e iPod Touch, com os já conhecidos efeitos de transição. Todo este trabalho foi realizado em pouco mais de um mês, desde a criação até o desenvolvimento, passando pelo setup da infra-estrututra de distribuição, estudos e pesquisas para otimizar a qualidade dos vídeos, implementação, etc, e isto só foi possível devido à utilização de metodologias ágeis, que definitivamente mudaram a forma como trabalhamos aqui, o que sem dúvida nenhuma permite uma resposta mais eficiente às demandas do mercado de internet.

Além de ver os vídeos no site, é possível reproduzir todos os vídeos do portal, mesmo aqueles que estão embedded em matérias, como os que encontramos no G1 e

Com relação à qualidade dos vídeos, posso dizer que conseguimos uma otimização bem legal, onde temos um vídeo de ótima qualidade (33dB) para o bitrate que escolhemos, que é limitado ao throughput máximo das redes 3G.

Video da no iPhone

Vídeo da no iPhone / iPod Touch

Mais uma vez conseguimos entregar um produto inovador, de qualidade, o que prova que estamos no caminho certo. Parabéns galera!!!

Otimizando um Servidor Web para Download Progressivo

No dia 27 do mês passado estive no Congresso SET, da Sociedade Brasileira de Engenharia de Televisão e Telecomunicações, onde apresentei junto com o Marcello Azambuja um artigo sobre Arquiteturas de Distribuição de Vídeos na Internet. Porém, devido ao tempo bastante limitado da apresentação, não pude entrar em detalhes mais específicos de como otimizar as arquiteturas para obter um melhor desempenho. Por isso, resolvi colocar um pouco do que está no artigo aqui no blog, já que nem todo mundo que tem interesse neste assunto estava na apresentação. (O slides podem ser vistos aqui)

Assim, resolvi começar falando especificamente sobre o Download Progressivo, ou seja, como podemos otimizar um Web Server para que ele seja capaz de servir a maior quantidade de usuários possível. No caso de distribuição de vídeos via Progressive Download temos algumas características básicas que devem ser consideradas para otimização:

  • As conexões com o WebServer são persistentes, ou seja, o usuário fica conectado ao servidor por uma quantidade razoável de tempo, até que o conteúdo seja completamente copiado;
  • Dependendo da quantidade de vídeos diferentes podemos ter diversos conteúdos diferentes sendo acessados simultaneamente;
  • Os arquivos de mídia não estão necessariamente nos discos do servidor. Eles podem estar em um repositório central sendo acessados pelo servidor Web através de NFS/CIFS;
  • A quantidade de acessos ao serviço pode aumentar rapidamente, variando de acordo com o conteúdo disponibilizado;

Com estas características já podemos identificar alguns gargalos principais:

  • Tráfego de rede: muitos usuários conectados realizando download irão rapidamente ocupar a banda disponível. Além disso, existe a ocupação de banda pela cópia dos arquivos do repositório central para o servidor;
  • IO (Repositório Central e Disco Local): muitos usuários realizando download significa muito IO de leitura, que é maior a medida que temos mais usuários acessando arquivos diferentes;
  • Memória: quanto mais usuários, mais memória o Apache irá precisar para atendê-los, e quanto mais arquivos, mais memória o kernel irá utilizar para cache;
  • CPU: quanto mais usuários mais processamento para organizar e servir as requisições;

Na verdade, se queremos obter o máximo de uma arquitetura não podemos nos limitar a olhar apenas um componente. O primeiro ponto, e mais simples, consiste em alterar as configurações do Apache, escolher a versão correta (2.X), e compilar uma versão do Web Server que tenha apenas aquilo que é relevante para a distribuição de arquivos, ou seja, devemos evitar incluir na configuração de compilação módulos que não serão utilizados, como mod ssl, por exemplo.

Uma vez compilado cabe a nós decidir qual arquitetura interna de funcionamento possui uma performance maior: se é a multi-process (Apache Prefork) ou a multi-process/multi-thread (Apache Worker).

Basicamente, no prefork, para cada conexão será criado um processo específico para atendê-la, de modo que a quantidade de processos httpd será sempre maior ou igual a quantidade de clientes. Nesta arquitetura, temos uma quantidade inicial que processos que são pré-criados para atender as conexões, sendo que a medida que os clientes se conectam, eles são atendidos por estes processos. No prefork, temos basicamente dois problemas em termos de performance:

  • Memória: cada processo criado ocupa uma porção da memória, de modo que a memória disponível para cache do kernel é cada vez menor, ao ponto que toda ela é preenchida pelos processos httpd, momento onde o servidor começa a fazer swap em disco;
  • Load: a criação de novos processos (fork) gera um overhead no sistema, de modo que quanto maior a taxa de conexão, maior será o overhead no fork para atender as novas conexões;

A outra opção de MPM, o worker, trabalha com o conceito multi-thread, onde as requisições são atendidas por threads e não por processos. Assim, teríamos apenas um ou poucos processos com múltiplas threads em cada um deles, atendendo cada uma das conexões. Com o worker, minimizamos a utlização de memória, já que as threads compartilham a mesma área de memória do processo pai, e reduzimos o overhead na criação de processos. Na verdade, no caso do worker, definimos a quantidade de threads por processo de modo que só realizamos um fork quando este limite é atingido.

A escolha entre prefork ou worker deve ser realizada caso a caso, ou seja, dependendo da situação de uso e da configuração de hardware uma escolha poderá ser melhor que a outra. No caso específico de servidores para utilização em distribuição de vídeos em Progressive Download, a escolha do MPM Worker é recomendada, com o objetivo de reduzir a ocupação de memória pelo servidor Web, deixando-a livre para que o kernel possa utilizá-la para cache de conteúdo, reduzindo o IO no disco e conseqüentemente o tempo de resposta da requisição. Uma configuração interessante seria neste caso seria forçar a criação de todos os processos filho (children) e suas threads no momento que o servidor Web for iniciado, reduzindo assim o overhead de controle de threads.

Além de configurar o MPM, o Apache permite diversas outras configurações capazes de aumentar o desempenho do mesmo, como a possibilidade de desabilitar Hostname Lookups e DNS resolving, e outras que podem ser encontradas na documentação do Apache.

Entretanto, quando falamos de arquiteturas de distribuição de vídeo que recebem grandes volumes de acesso, devemos nos preocupar um pouco mais em como otimizar o processo de distribuição. Uma das maneiras mais eficientes de aumentar a capacidade de uma infra-estrutura de Download Progressivo consiste em realizar um processo de cache intensivo. Ter uma estratégia de cache de conteúdo é fundamental quando falamos de alta performance com um grande volume de acessos. Quando temos um volume muito grande, temos também diversos requests ao mesmo conteúdo. Processar todo o request para cada cliente consistiria em repetir as mesmas operações diversas vezes, sem aproveitar para um request os dados processados por outro. Assim, fica claro que podemos otimizar este processamento, simplesmente aproveitando aquilo que serve para mais de uma requisição.

Em situações onde temos uma arquitetura onde o Apache funciona como uma espécie de “proxy” entre o usuário e um repositório central de vídeos, essa necessidade é ainda mais latente, uma vez que não faz sentido obter um mesmo arquivo diversas vezes neste repositório para servir para os clientes a cada request semelhante. Uma vez copiado do storage para o Apache, para servir uma requisição, o arquivo pode ser mantido no servidor Web para as requisições posteriores realizadas ao mesmo vídeo. Com essa abordagem, reduzimos a carga no storage e o tráfego de rede e de operações de cópia.

Para realizar o cache de conteúdo existem diversas alternativas, como o Squid e o mod_cache. O mod_cache, por estar integrado ao Apache e por ser bastante conhecido e utilizado, além de apresentar uma ótima performance, é uma excelente opção para cache em arquiteturas de distribuição em Download Progressivo.

O mod_cache permite duas abordagens principais de cache: disco ou memória. O mod_disk_cache é o módulo responsável pelo cache em disco, e funciona da seguinte forma: ao receber um request, o mod_disk_cache verifica se o conteúdo solicitado já está no cache em disco. Se estiver, o módulo valida se o conteúdo não está expirado e serve o mesmo a partir do cache, sem que a requisição seja passada aos demais módulos do Apache. Caso, não esteja cacheado, o request passa pelo path normal de atendimento ao request, sendo que, ao finalizar o processamento, o mod_cache escreve a resposta no cache antes de servir a mesma. Assim, ele cria dois arquivos em disco: o .data, com o conteúdo do request, e o .header com os headers da resposta. O nome dos arquivos criados é criado a partir de um hash, para evitar que o conteúdo seja sobre-escrito.

O mod_mem_cache, é o módulo responsável pelo cache em memória, e funciona de forma semelhante ao mod_disk_cache, porém armazenando o conteúdo em memória.

A escolha de um dos módulos para utilização em um servidor de Download Progressivo também depende da configuração do hardware. Entretanto, em servidores que rodam em Linux, o uso do mod_disk_cache é recomendada, uma vez que o gerenciamento do cache em memória feito pelo kernel é bastante eficiente.

Com um web server bem otimizado e configurado, e com uma estratégia de cache eficiente, temos uma arquitetura de distribuição muito mais robusta e capaz de atender um volume até 70% maior que o volume que atenderíamos utilizando apenas um servidor com as configurações “default”, o que reduz de forma significativa os custos de investimento para expansão da capacidade, tornando esta uma opção bastante interessante para distribuição de vídeos na internet.

Generalizando os conceitos de Integração Contínua

A utilização de processos de integração contínua no desenvolvimento de software, é hoje algo bastante corriqueiro em ambientes onde existe uma preocupação com a qualidade do código. A implementação de testes unitários e a execução dos mesmos de forma periódica, garante que o funcionamento de cada um dos componentes seja validado, o que impede a introdução de bugs, principalmente quando estamos falando do desenvolvimento de novas funcionalidades em uma aplicação já existente. Este conceito de integração contínua é tão importante para o processo de desenvolvimento, que por várias vezes me perguntei como poderíamos generaliza-lo para utilização em situações diferentes.

Quando conhecemos a complexidade dos processos de codificação de vídeos, nos deparamos com uma imensa quantidade de variáveis que podem interferir na qualidade do vídeo codificado, de modo que é praticamente impossível garantir que um determinado processo de codificação sempre irá gerar resultados satisfatórios. Além disso, fatores externos, como sistema operacional, hardware, etc, também influenciam nos resultados obtidos, seja na velocidade de codificação, seja na própria integridade do conteúdo.

Em ambientes de produção de vídeo em alta escala, é fundamental garantir que todas as variáveis que influenciam no processo de codificação estejam sob controle, de modo que os impactos de qualquer alteração sejam rapidamente identificados, antes que elas sejam efetivamente aplicadas no ambiente de produção. Se fizermos um paralelo com os processos de desenvolvimento de software, o que precisamos é exatamente o que a execução contínua de build e testes faz, ou seja, garante que não houve quebra de funcionalidades gerada por alterações no software.

Para exemplificar, podemos citar um processo de codificação com o Windows Media Encoder (Para quem não conhece, o Windows Media Encoder é um codificador WMV da Microsoft, bastante popular para quem usa Windows Media Video). Devido à uma alteração nas bibliotecas utilizadas pelo WME feita pela atualização do SP2 do Windows XP, podemos ter um aumento no tempo de codificação, além de alguns erros com arquivos específicos. Isto significa que a simples atualização do Service Pack do sistema operacional pode influenciar bastante no processo de codificação. Se, neste cenário, temos um processo de codificação contínuo, então essas diferenças seriam facilmente identificadas, antes que esta atualização fosse efetivamente aplicada.

Entretanto, ter simplesmente um processo de codificação que roda constantemente não é o suficiente para garantirmos a integridade de um ambiente. É de fundamental importância ter uma quantidade grande de mídias de diferentes perfis, ou seja, ter diversas mídias, de diversas durações, com vários tipos de conteúdo distintos e de várias fontes diferentes. Desta forma, com uma biblioteca de conteúdo diversificada e com um processo de verificação contínuo, temos como analisar de forma eficiente um ambiente de codificação.

Outro ponto importante no processo de codificação de vídeos é que a maioria deles não é “binário”, ou seja, se você codificar o mesmo vídeo 100 vezes, você não terá a mesma saída 100 vezes. Por isso, além de codificar continuamente diversos vídeos diferentes, é bastante importante codificar o mesmo vídeo repetidamente, sendo que este vídeo deve ser escolhido dentre um universo por ser aquele que apresenta a maior taxa de erros. Desta forma, estamos introduzindo mais uma validação de integridade.

Não conheço nenhuma ferramenta pronta para execução de testes desta natureza, porém, é relativamente simples escrever uma. Claro que se você deseja um output gráfico, em tempo real, é necessário dedicar um tempo razoável para isto, mas nada que não seja justificado pelos ótimos benefícios obtidos com esta prática.

TV Digital e a Interatividade, Portabilidade e Mobilidade

Para quem ainda não sabe, amanhã, dia 16/06, a TV Globo inicia sua transmissão de TV Digital para o Rio de Janeiro, durante a exibição do Jornal Nacional. Depois de mais de 5 anos de muita burocracia governamental finalmente estamos implantando o novo sistema, processo que deve demorar, pelo menos, mais uns dois anos para ter toda a cobertura que a TV analógica possui hoje (99% do território nacional). A pergunta que me faço neste momento é quais serão as reais vantagens do SBTVD, além do ganho de qualidade é claro, considerando o grande atraso no processo de definição/implantação.

O comitê para definição do SBTVD foi criado em 2003 com o objetivo de pesquisar os padrões existentes e escolher um para utilização no Brasil. Depois de muita pesquisa e discussão, chegou-se a conclusão de que o ISDB-T (padrão de TV Digital Terrestre do Japão) era o que oferecia as melhores condições, já que possuía características que permitiam a recepção por dispositivos móveis e portáteis. Porém, o ISDB-T utilizava o MPEG-2 como codec de vídeo, e, devido a demora na definição do padrão brasileiro, já existia uma corrente muito forte em prol da utilização do H.264 como codec de vídeo, devido a melhor eficiência em relação ao MPEG-2. Foi então que decidiu-se pela criação de um sistema híbrido, utilizando a modulação ISDB-T com o H.264 como algoritmo de compressão de vídeo. Esta, no meu ponto de vista, foi a única vantagem de termos demorado tanto em definir um padrão de TVD.

Entretanto, a interatividade, uma das grandes vantagens da TVD além da qualidade, está praticamente esquecida, e, pelo ritmo que as coisas caminham, ainda vai demorar muito para que funcionalidades descentes sejam implementadas. A ausência de um processo interativo mais estruturado na TV acaba abrindo caminho para a expansão da distribuição de vídeo na internet, que já lida com este processo de interação desde seu nascimento, e que ainda pode evoluir bastante.

O problema é que quando a interatividade finalmente chegar à TV pode ser tarde demais. Dizer que a TV vai acabar e que o consumo de conteúdo em vídeo será realizado via internet é ser um tanto quanto radical. Na verdade, acredito em um processo de convergência, onde os grandes broadcasters continuarão gerando conteúdo, que será consumido e distribuído de diversas formas. A única certeza que eu tenho é que o modelo comercial que temos hoje será completamente substituído, já que o processo de consumo de conteúdo será alterado.

Com relação à mobilidade e portabilidade, acredito que a distribuição de vídeos via redes de dados 3G irá predominar sobre a TVD por dois motivos: primeiro, porque as redes 3G já estão sendo implantadas, e existe uma demanda forte que impulsiona a expansão; segundo, pelo processo de consumo “on demand” que já existe na internet e que esta sendo expandido para experiências mobile, e que faz muito mais sentido em relação ao modelo de distribuição da TV, do ponto de vista de consumo de conteúdo em celulares.

Resumindo, é necessário uma mudança de mentalidade daqueles que hoje lidam com TV para que seja possível aproveitar de forma ampla os benefícios que a TV Digital nos oferece, atendendo assim as expectativas de consumo do mercado. Caso contrário, a TV irá perder cada vez mais sua força, abrindo caminho para novas possibilidades e experiências que ela não é capaz de suprir.

[WWDC] iPhone 3G e Lançamento no Brasil

Hoje, precisamente às 11:32am horário de San Francisco, o iPhone 3G foi anunciado no keynote do Steve Jobs na WWDC, notícia já bastante esperada por todos aqueles fanáticos por tecnologia, porém mais comemorada que um gol do Brasil pelos geeks de plantão aqui da, que acompanharam o keynote ao vivo pela internet (inclusive eu). Para alegria de todos, o iPhone 3G já vem com suporte Tri-Band, o que significa que ele irá funcionar na rede 3G do Brasil sem problemas. Além disso, o iPhone 3G também conta com um GPS integrado, é um pouco mais fino que o iPhone atual e vem em duas cores básicas (preto ou branco). Especificações

A melhor de todas as novidades, ou pelo menos, a que ninguém esperava, foi o preço: $199 para o de 8GB e $299 para o de 16GB!!!!! Realmente é para destruir a concorrência. A notícia triste ficou por conta das datas. O iPhone 3G já pode ser comprado agora na Apple Store dos US, porém o shipping será apenas no dia 11 de julho. Nesta data, o novo iPhone estará disponível em 25 países, porém, no Brasil, ainda não existe uma data definida. A única certeza, neste caso, é que a Claro será a distribuidora “oficial” do iPhone no Brasil.

Quem quiser saber mais sobre o iPhone 3G e sobre o keynote de abertura da WWDC pode conferir os detalhes aqui.

Fugindo um pouco do assunto iPhone 3G, também foi anunciado hoje o Samsung Omnia, um clone do iPhone, porém com o terrível Windows Mobile instalado. O único ponto positivo deste lançamento, fato pelo qual eu estou mencionando ele aqui no blog, é o suporte nativo ao H.264, consolidando o novo padrão de vídeos para celulares, em convergência com os padrões de TV, e também Web.

DimP – A Direct Manipulation Video Player

DimPO Aviz, um time de pesquisa do INRIA (Instituto Nacional de Pesquisa em Informática e Automação da França), divulgou recentemente na SIGCHI Conference, um protótipo de um player de vídeo que permite a navegação no vídeo através da manipulação direta do conteúdo. Isto significa que, para realizar um “seek” no vídeo, o usuário pode simplesmente clicar em um objeto do mesmo, e, em seguida, arrastá-lo na direção desejada.

Para implementar este novo tipo de navegação, o player identifica os objetos de uma determinada cena, e, em seguida, mapeia o movimento para cada frame de vídeo, estabelecendo um caminho ao longo do tempo. Assim, ao contrário do que parece, os objetos não são “destacados” do vídeo.

Este conceito de navegação é extremamente interessante, principalmente por ser muito mais intuitivo que o seek tradicional. Para quem quiser mais informações, recomendo bastante a leitura do artigo Video browsing by direct manipulation, que explica com detalhes a implementação.

[Streaming Media East 2008] Novidades e Resumo do Evento

Na última semana estive no Streaming Media East 2008, em Nova York, para conferir as novidades sobre streaming de mídia na internet, e posso dizer que o evento foi bem legal, e bastante proveitoso, mesmo tendo algumas sessões lamentáveis. Porém, antes de mais nada, gostaria de pedir desculpas pois não consegui atualizar o blog com a freqüência que eu queria, já que, por incrível que pareça, existem mais hot-spots abertos no Rio que em NYC!!!

No primeiro dia de evento, assisti dois workshops de 3hrs cada: “Comparing and Using Video Codecs” e “Microsoft Silverlight”. Estava especialmente interessado no primeiro deles, já que a descrição do workshop dizia que seria apresentada uma comparação entre WMV, VP6 e H.264. Infelizmente fiquei bastante frustrado, e acredito que esta tenha sido a apresentação sobre codecs de vídeo mais rídicula e inútil que eu já vi. O palestrante foi totalmente superficial, não entrando em nenhum detalhe mais específico de nenhum dos codecs. Durante a apresentação, ele ignorou toda e qualquer solução open-source, de qualquer codec, inclusive a libx264, que é sem dúvida nenhuma a melhor implementação de H.264, inclusive quando comparamos com implementações proprietárias. Não citou o ffmpeg ou o mencoder, e ainda desconversou quando foi perguntado à respeito delas. Finalmente, para perder completamente o crédito, apresentou um comparativo de encoders com notas dadas subjetivamente para critérios que ele definiu como importante, ignorando absolutamente todos os métodos objetivos/científicos de avaliação de qualidade (PSNR, SSIM, MSE, etc). Ele ainda criticou bastante o Sorenson, e parecia um representante comercial da On2 querendo vender o VP6, apesar de não ter argumentos quando questionaram sua posição dizendo que o YouTube usa Sorenson.

O segundo workshop, de Silverlight, foi bastante proveitoso, já que confirmou todas as críticas que faço, além de reforçar minhas convicções de que ele é uma porcaria que a Microsoft está tentando empurrar para o mercado. Durante 3hrs, o Silverlight Evangelist não conseguiu fazer sequer um exemplo, conseguiu crashear o IE duas vezes, e desconversou quando pediram um comparativo com o Flash. Como mais da metade dos presentes foi embora antes de 2hrs, acho que todos estão convencidos de que não dá para fazer muita coisa com o Silverlight não, então, se vocês querem um conselho, esqueçam que ele existe.

Apesar de um primeiro dia terrível, o segundo dia valeu por cada centavo pago na inscrição. O keynote de abertura, com o CDO da NBC, foi bem legal, principalmente para saber o que grandes broadcasters como a NBC estão fazendo, e o que eles esperam do mercado. Em seguida, assisti uma mesa redonda sobre a convergência H.264, onde estavam presentes o Product Manager do Flash Media Server e o Video Architect do Yahoo!, além de um representante da Akamai e um da Move Networks. O grande ponto desta sessão foi opinião unânime de que o H.264 é o formato da nova geração de vídeos que irá ser responsável pela convergência de conteúdo entre TV, Internet e Celular. A Adobe está apostando bastante nisso, e certamente a parte de streaming/vídeo vai receber bastante investimento nos próximos anos. Um ponto importante que todos lembraram é a questão do licenciamento do H.264, que será revisado pelo MPEG/LA em dezembro de 2010, e pode impactar bastante à indústria.

Outra sessão bem interessante foi sobre os preços de CDN’s e sobre P2P, onde houve muita discussão sobre a queda que vem ocorrendo nos preços para utilização de CDN’s, e sobre as alternativas para delivery de vídeos, como P2P. Na verdade, o grande problema que todos enxergam no P2P é a necessidade de instalação de um software adicional, que realmente prejudica a experiência do usuário.

No segundo dia, fui à um keynote com o responsável pelo, onde ele apresentou como é a estrutura de publicação/produção deles. Apesar de ter uma produção bem pequena (20 vídeos por dia), foi legal ver como é o processo desde a captura no estúdio (com câmeras HD da Sony e Anycast) até a publicação na internet, depois de editar o conteúdo no Final Cut Pro.

Além disso, a pergunta que eu mais ouvi durante todo o evento é como ganhar dinheiro com vídeo na internet, ou seja, como transformar todas as iniciativas, desde VoD até Lifecasting, em um negócio rentável, principalmente através de publicidade. A verdade é que ninguém sabe ao certo como transformar toda a audiência dos sites de vídeo em dinheiro, e estão todos experimentando suas soluções. Neste ponto específico, acho que a está com um modelo bem interessante, que deve se firmar no mercado.

Em resumo, valeu bastante a ida ao evento, e recomendo para todos que tiverem algum interesse no mercado de streaming, principalmente para aqueles que estão começando agora.

Se alguém tiver interesse, algumas apresentações do evento estão aqui.