Silverlight 4 中的新网络摄像头非常酷。通过将其暴露为画笔,它可以实现超出 Flash 所拥有的任何场景。
同时,在本地访问网络摄像头似乎只是故事的一半。没有人会购买网络摄像头,这样他们就可以为自己拍照并做出有趣的表情。他们购买网络摄像头是因为他们希望其他人看到生成的视频流,即,他们希望将该视频流式传输到 Internet、外行 Skype 或其他数十个视频聊天站点/应用程序中的任何一个。到目前为止,我还没有想出如何做到这一点
事实证明,获取原始(Format32bppArgb 格式)字节流非常简单,如此处所示。
但除非我们想将原始字节流传输到服务器(这会占用太多带宽),否则我们需要以某种方式对其进行编码。这更复杂。MS 已经在 Silverlight 中实现了几个编解码器,但据我所知,它们都专注于解码视频流,而不是首先对其进行编码。除此之外,我首先不知道如何直接访问 H.264 编解码器。
有大量的开源编解码器(例如,在此处的 ffmpeg 项目中),但它们都是用 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 项目中的 mooncodecs 文件夹(此处)有几个 C# 音频编解码器(ADPCM 和 Ogg Vorbis)和一个视频编解码器(Dirac),但它们似乎都实现了各自格式的解码部分,就像 java移植它们的实现。
我找到了一个用于 Ogg Theora 的 C# 编解码器(csTheora,http ://www.wreckedgames.com/forum/index.php?topic=1053.0 ),但同样,它只是解码,它所基于的 jheora 编解码器也是如此。
当然,从 Java 移植编解码器可能比从 C 或 C++ 移植编解码器更容易,但我发现的唯一 Java 视频编解码器是仅解码(例如jheora或 jirac)。
所以我有点回到第一方了。看起来我们通过 Silverlight 将网络摄像头(或麦克风)连接到 Internet 的选项是:
(1) 等待微软对此提供一些指导;
(2) 花费脑力将 C 或 C++ 编解码器之一移植到与 Silverlight 兼容的 C#;
(3) 将原始的、未压缩的字节流发送到服务器(或者可能用 zlib 之类的东西稍微压缩),然后在服务器端对其进行编码;或者
(4) 等待比我聪明的人解决这个问题并提供解决方案。
其他人有更好的指导吗?我是否错过了对其他人来说非常明显的东西?(例如,Silverlight 4 是否有一些我错过的课程可以解决这个问题?)