Новый материал для веб-камеры в Silverlight 4 проклят. Выставляя его как кисть, он позволяет сценариям, выходящим за рамки всего, что есть в Flash.
В то же время доступ к веб-камере локально кажется ему всего лишь наполовину. Никто не покупает веб-камеру, поэтому они могут фотографировать себя и делать из них забавные лица. Они покупают веб-камеру, потому что хотят, чтобы другие люди увидели результирующий видеопоток, т.е. Они хотят транслировать это видео в Интернет, проложить Skype или любой из десятков других сайтов/приложений для видеочата. И пока я не понял, как это сделать с помощью
Оказалось, что довольно просто заполучить исходный (Format32bppArgb отформатированный) поток, как показано здесь.
Но если мы не хотим передавать этот необработанный поточный поток на сервер (который пережевывал бы слишком большую пропускную способность), нам нужно каким-то образом закодировать его. И это более сложно. MS реализовала несколько кодеков в Silverlight, но, насколько я могу судить, все они ориентированы на декодирование видеопотока, а не на кодирование в первую очередь. И это, кроме того, что я не могу понять, как получить прямой доступ, скажем, к кодеку H.264.
Существует тонна кодеков с открытым исходным кодом (например, в проекте ffmpeg здесь), но все они написаны на 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 (здесь) содержит несколько аудиокодеков в С# (ADPCM и Ogg Vorbis) и один видеокодек ( Dirac), но все они, похоже, реализуют только часть декодирования своих соответствующих форматов, также как и реализации Java, из которых они были перенесены.
Я нашел кодек С# для Ogg Theora (csTheora, http://www.wreckedgames.com/forum/index.php?topic=1053.0), но опять же, он декодирует только, как и кодек jheora на котором она основана.
Конечно, было бы проще переносить кодек из Java, чем из C или С++, но единственные видеокодеки java, которые я нашел, были только для декодирования (например, jheora, или jirac).
Итак, я вернулся на круги своя. Похоже, что наши возможности подключения веб-камеры (или микрофона) через Silverlight к Интернету:
(1) Подождите, пока Microsoft предоставит некоторые рекомендации по этому поводу;
(2) Проведите мозговые циклы, переносящие один из кодеков C или С++ на Silverlight-совместимый С#;
(3) Отправьте необработанный, несжатый поточный поток до сервера (или, возможно, слегка сжатый с чем-то вроде zlib), а затем закодируйте его на стороне сервера; или
(4) Подождите, пока кто-нибудь умнее меня, чтобы понять это и предоставить решение.
Есть ли у кого-нибудь еще лучшее руководство? Я пропустил что-то, что просто ослепительно очевидно для всех остальных? (Например, у Silverlight 4 есть какие-то классы, которые я пропустил, которые позаботятся об этом?)