La nuova roba della webcam in Silverlight 4 è dannatamente cool. Esponendolo come un pennello, consente scenari che vanno ben oltre qualsiasi cosa che Flash ha.Streaming di una webcam da Silverlight 4 (Beta)
Allo stesso tempo, l'accesso alla webcam localmente sembra che sia solo metà della storia. Nessuno compra una webcam in modo da poter scattare foto di se stessi e fare facce buffe da loro. Comprano una webcam perché vogliono che le altre persone vedano il flusso video risultante, cioè, vogliono trasmettere il video in streaming a Internet, un laico Skype o una qualsiasi delle dozzine di altri siti/applicazioni di chat video. E finora, non ho capito come farlo con
Si scopre che è piuttosto semplice ottenere una sospensione del raw (Format32bppArgb formattato) da test, come dimostrato here.
Ma a meno che non desideriamo trasmettere quel grezzo puntatore ad un server (che potrebbe trangugiare troppo banda), dobbiamo codificarlo in qualche modo. E questo è più complicato. MS ha implementato diversi codec in Silverlight, ma per quanto posso dire, sono tutti focalizzati sulla decodifica di un flusso video, non sulla codifica in primo luogo. E questo a parte il fatto che non riesco a capire come ottenere l'accesso diretto, per esempio, al codec H.264, in primo luogo.
Ci sono un sacco di codec open source (ad esempio, nel progetto ffmpeg here), ma sono tutti scritti in C, e non sembrano facili da portare in C#. A meno che non traducendo 10000+ righe di codice che assomigliano a questa è la vostra idea di divertimento :-)
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)];
La cartella mooncodecs nell'ambito del progetto Mono (here) ha diversi codec audio in C# (ADPCM e Ogg Vorbis), e un codec video (Dirac), ma sembrano tutti implementare solo la parte di decodifica dei rispettivi formati, così come le implementazioni java da cui sono stati portati.
Ho trovato un codec C# per Ogg Theora (csTheora, http://www.wreckedgames.com/forum/index.php?topic=1053.0), ma ancora una volta, è solo decodificare, come è il codec jheora su cui è basato.
Ovviamente, sarebbe presumibilmente più semplice effettuare il porting di un codec da Java che da C o C++, ma gli unici codec video java che ho trovato erano solo decodificati (come jheora o jirac).
Quindi sono tornato al punto di partenza. Sembra che le nostre opzioni per collegare una webcam (o un microfono) tramite Silverlight a Internet siano:
(1) Aspettare che Microsoft fornisca indicazioni su questo;
(2) Passa i cicli cerebrali a trasferire uno dei codec C o C++ su C# compatibile con Silverlight;
(3) Inviare il sommario, non compresso su un server (o forse leggermente compresso con qualcosa come zlib), quindi codificarlo sul lato server; oppure
(4) Attendere qualcuno più intelligente di me per capirlo e fornire una soluzione.
Qualcun altro ha una guida migliore? Ho perso qualcosa che è semplicemente apparentemente ovvio per tutti gli altri? (Ad esempio, Silverlight 4 da qualche parte ha alcune classi che ho perso che si prendono cura di questo?)
Grazie per l'esempio, Ken. Ho un'applicazione Silverlight che mi piacerebbe poter consentire di caricare i video creati dagli utenti su Facebook. Tuttavia, anche se ho la codifica m-jpeg funzionante, non è un codec supportato tramite FB. Grrrr. È un peccato che la SM non ci stia aiutando. – tyshock