Новый материал для веб-камеры в 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)];
Папка mooncodecs в рамках проекта Mono (here) имеет несколько аудиокодеки в C# (ADPCM и Ogg Vorbis), а также один видеокодек (Dirac), но все они, похоже, реализуют только часть декодирования своих соответствующих форматов, также как и реализации Java, из которых они были перенесены.
Я нашел кодек C# для Ogg Theora (csTheora, http://www.wreckedgames.com/forum/index.php?topic=1053.0), но опять же, это только декодирование, как и кодек jheora, на котором он основан.
Конечно, было бы проще переносить кодек из Java, чем из C или C++, но только видеокодеки java, которые я нашел, были только декодированными (например, jheora или jirac).
Так что я вернусь на квадратный. Похоже, что наши возможности подключения веб-камеры (или микрофона) через Silverlight к Интернету:
(1) Подождите, пока Microsoft предоставит вам некоторые рекомендации;
(2) Проведите мозговые циклы, перенося один из кодеков C или C++ на Silverlight-совместимый C#;
(3) Отправьте необработанный несжатый поток на сервер (или, возможно, слегка сжатый с помощью чего-то вроде zlib), а затем закодируйте его на стороне сервера; или
(4) Подождите, пока кто-нибудь умнее меня, чтобы понять это и предоставить решение.
Есть ли у кого-нибудь еще лучшее руководство? Я пропустил что-то, что просто ослепительно очевидно для всех остальных? (Например, есть ли у Silverlight 4 какие-то классы, которые я пропустил, которые позаботятся об этом?)
Спасибо, например, Ken. У меня есть приложение silverlight, которое я ЛЮБЛЮ, чтобы разрешить загрузку созданных пользователем видео в facebook. Однако, несмотря на то, что я работал с m-jpeg-кодированием, это не поддерживаемый кодек через FB. Grrrr. Жаль, что MS не помогает нам здесь. – tyshock