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)];
Mono項目(here)內的mooncodecs文件夾在C#幾個音頻編解碼器(ADPCM和Ogg Vorbis),和一個視頻編解碼器(Dirac),但它們似乎都只實現了各自格式的解碼部分,就像它們所移植的Java實現一樣。
我發現了Ogg Theora的C#編解碼器(csTheora,http://www.wreckedgames.com/forum/index.php?topic=1053.0),但它只是解碼,就像它所基於的jheora編解碼器一樣。當然,它可能比從C或C++更容易移植來自Java的編解碼器,但是我發現的唯一的Java視頻編解碼器只是解碼(例如jheora或jirac)。
所以我有點回到原點。它看起來像我們通過Silverlight將互聯網攝像頭(或麥克風)連接到互聯網的選項是:
(1)等待Microsoft爲此提供一些指導; (2)花大腦循環將C或C++編解碼器之一移植到Silverlight兼容的C#中; (3)將未壓縮的原始未壓縮字節流發送到服務器(或者稍微用類似zlib的方式壓縮),然後對服務器端進行編碼;或
(4)等一個比我聰明的人解決這個問題並提供一個解決方案。
其他人有沒有更好的指導?我錯過了對其他人顯而易見的事情嗎? (例如,Silverlight 4的某個地方是否有一些我錯過了的類來處理這個問題?)
謝謝你的例子,肯。我有一個silverlight應用程序,我願意允許上傳用戶創建的視頻到Facebook。但是,儘管我使用了m-jpeg編碼,但這不是通過FB支持的編解碼器。 GRRRR。這是一個恥辱MS不幫我們在這裏。 – tyshock 2010-07-15 20:02:28