Silverlight 4中的新摄像头内容令人沉醉。通过将其公开为画笔,它可以实现超出Flash所具有的任何形式。从Silverlight 4(Beta)流式传输摄像头
与此同时,在本地访问摄像头看起来只是故事的一半。没有人会购买摄像头,以便他们可以拍摄自己的照片,并制作出有趣的照片。他们购买网络摄像头是因为他们希望其他人看到最终的视频流,即他们想要将该视频流式传输到互联网,Skype或任何其他几十个视频聊天站点/应用程序。到目前为止,我还没有想出如何做到这一点
事实证明,这是非常简单的得到一个原始(Format32bppArgb格式化)字节流的保持,如演示here。但是,除非我们想将原始字节流传输到服务器(这会消耗太多的带宽),否则我们需要以某种方式对其进行编码。而这更复杂。 MS已经在Silverlight中实现了多个编解码器,但据我所知,他们都专注于解码视频流,而不是首先对其进行编码。除此之外,我无法弄清如何直接访问H.264编解码器。
有大量的开源编解码器(例如,在ffmpeg项目here),但它们都用C语言编写,并且它们看起来不容易移植到C#。除非翻译10000+行的代码看起来像这是你:-)乐趣所在
const int b_xy= h->mb2b_xy[left_xy[i]] + 3;
const int b8_xy= h->mb2b8_xy[left_xy[i]] + 1;
*(uint32_t*)h->mv_cache[list][cache_idx ]= *(uint32_t*)s->current_picture.motion_val[list][b_xy + h->b_stride*left_block[0+i*2]];
*(uint32_t*)h->mv_cache[list][cache_idx+8]= *(uint32_t*)s->current_picture.motion_val[list][b_xy + h->b_stride*left_block[1+i*2]];
h->ref_cache[list][cache_idx ]= s->current_picture.ref_index[list][b8_xy + h->b8_stride*(left_block[0+i*2]>>1)];
h->ref_cache[list][cache_idx+8]= s->current_picture.ref_index[list][b8_xy + h->b8_stride*(left_block[1+i*2]>>1)];
Mono项目(here)内的mooncodecs文件夹在C#几个音频编解码器(ADPCM和Ogg Vorbis),和一个视频编解码器(Dirac),但它们似乎都只实现了各自格式的解码部分,就像它们所移植的Java实现一样。
我发现了Ogg Theora的C#编解码器(csTheora,http://www.wreckedgames.com/forum/index.php?topic=1053.0),但它只是解码,就像它所基于的jheora编解码器一样。当然,它可能比从C或C++更容易移植来自Java的编解码器,但是我发现的唯一的Java视频编解码器只是解码(例如jheora或jirac)。
所以我有点回到原点。它看起来像我们通过Silverlight将互联网摄像头(或麦克风)连接到互联网的选项是:
(1)等待Microsoft为此提供一些指导; (2)花大脑循环将C或C++编解码器之一移植到Silverlight兼容的C#中; (3)将未压缩的原始未压缩字节流发送到服务器(或者稍微用类似zlib的方式压缩),然后对服务器端进行编码;或
(4)等一个比我聪明的人解决这个问题并提供一个解决方案。
其他人有没有更好的指导?我错过了对其他人显而易见的事情吗? (例如,Silverlight 4的某个地方是否有一些我错过了的类来处理这个问题?)
谢谢你的例子,肯。我有一个silverlight应用程序,我愿意允许上传用户创建的视频到Facebook。但是,尽管我使用了m-jpeg编码,但这不是通过FB支持的编解码器。 GRRRR。这是一个耻辱MS不帮我们在这里。 – tyshock 2010-07-15 20:02:28