【发布时间】:2010-12-18 21:39:51
【问题描述】:
Silverlight 4 中的新网络摄像头非常酷。通过将其暴露为画笔,它可以实现超出 Flash 所拥有的任何场景。
同时,在本地访问网络摄像头似乎只完成了一半。没有人会购买网络摄像头,这样他们就可以为自己拍照并做出有趣的表情。他们购买网络摄像头是因为他们希望其他人看到生成的视频流,即,他们希望将该视频流式传输到互联网、外行 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 编解码器也是如此。
当然,从 Java 移植编解码器可能比从 C 或 C++ 移植更容易,但我发现的唯一 Java 视频编解码器是仅解码(例如 jheora 或 jirac)。
所以我有点回到第一方了。看起来我们通过 Silverlight 将网络摄像头(或麦克风)连接到 Internet 的选项如下:
(1) 等待微软对此提供一些指导;
(2) 花费脑力将 C 或 C++ 编解码器之一移植到与 Silverlight 兼容的 C#;
(3) 将原始的、未压缩的字节流发送到服务器(或者可能用 zlib 之类的东西稍微压缩),然后在服务器端对其进行编码;或
(4) 等待比我聪明的人解决这个问题并提供解决方案。
还有其他人有更好的指导吗?我是否错过了对其他人来说非常明显的东西? (例如,Silverlight 4 是否有一些我错过的课程可以解决这个问题?)
【问题讨论】:
标签: silverlight silverlight-4.0 webcam