gpt4 book ai didi

silverlight - 从 Silverlight 4(测试版)流式传输网络摄像头

转载 作者:行者123 更新时间:2023-12-03 15:03:12 25 4
gpt4 key购买 nike

Silverlight 4 中的新网络摄像头非常酷。通过将其暴露为画笔,它允许出现超出 Flash 所具有的任何场景的场景。

与此同时,在本地访问网络摄像头似乎只是故事的一半。没有人会购买网络摄像头,这样他们就可以给自己拍照并用它们制作有趣的面孔。他们购买网络摄像头是因为他们希望其他人看到生成的视频流,即,他们希望将该视频流式传输到 Internet、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 (csTheora, http://www.wreckedgames.com/forum/index.php?topic=1053.0) 找到了一个 C# 编解码器,但同样,它只是解码,它基于的 jheora 编解码器也是如此。

当然,从 Java 移植编解码器可能比从 C 或 C++ 移植编解码器更容易,但我发现的唯一 Java 视频编解码器是仅解码的(例如 jheora 或 jirac)。

所以我有点回到了第一站。看起来我们通过 Silverlight 将网络摄像头(或麦克风)连接到 Internet 的选项是:

(1) 等待微软对此提供一些指导;

(2) 花费大脑周期将 C 或 C++ 编解码器之一移植到与 Silverlight 兼容的 C#;

(3) 将原始的、未压缩的字节流发送到服务器(或者可能用 zlib 之类的东西稍微压缩),然后在服务器端对其进行编码;或者

(4) 等待比我更聪明的人来解决这个问题并提供解决方案。

有没有其他人有更好的指导?我是否错过了其他人都非常明显的东西? (例如,某处的 Silverlight 4 是否有一些我错过的类来处理这个问题?)

最佳答案

我刚刚在我的博客上收到 Jason Clary 的回复:

在 Mike Taulty 的博客上看到了您关于 Silverlight 4 测试版中的 VideoSink/AudioSink 的帖子。

我想我会指出 VideoSink 的 OnSample 为您提供了一个未压缩的 32bpp ARGB 帧,可以直接将其复制到 WritableBitmap 中。

用它来抓取 FJCore,一个 C# 中的 jpeg 编解码器,并将其修改为不输出 JFIF header 。然后将它们一个接一个地写出来,你就拥有了一个 Motion JPEG 编解码器。 RFC2435 解释了如何将其填充到用于 RTSP 流的 RTP 数据包中。

将 PCM 音频压缩为 ADPCM 也相当容易,但我还没有找到现成的实现。 RFC3551 解释了如何将 PCM 或 ADPCM 放入 RTP 数据包中。

将 MJPEG 和 PCM 或 ADPCM 填充到 AVI 文件中也应该相当容易。 MS 有一些关于 AVI 修改后的 RIFF 格式的不错的文档,MJPEG 和 ADPCM 都是广泛支持的编解码器。

总之是个开始。

当然,一旦您解决了所有这些麻烦,下一个 Beta 版可能会提供本地支持,以使用更好的 WMV 编解码器压缩和流式传输到 WMS。

以为我会发布它。这是迄今为止我见过的最好的建议。

关于silverlight - 从 Silverlight 4(测试版)流式传输网络摄像头,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1773330/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com