Tīmekļa kamera
Feb 15, 2004
Nepacietīgajiem, - tas, ko šoreiz gribu rādīt, atrodas šeit.
Kā zināms, nesen tika iegādāta tīmekļa kamera. Meklējām veidus, kā panākt, ka vēl kāds bez mums pašiem to kameras bildi var redzēt. Visideālāk būtu straumēt (stream :) ) tīklā video un skaņu (mikrofonu arī nopirkām). Dabūjām strādājošā kārtībā 2 variantus -
- NSVTools + ShoutCast + Winamp (straumējam NSV formātā (VP3 video kodētājs), skatamies ar jebkuru daudzmaz jaunu winampu). Procesora noslodze turējās 50% - 80% - diezgan daudz (Athlon XP 2500+).
- Windows Media Encoder - straumējam ar mms protokolu, sakodējam ar Windows Media Video (WMV) kodētāju. Skatamies ar Media Player. Procesora noslodze 30% - 60%.
Abiem variantiem ir viens ļoti nopietns trūkums - esam LANET tīkla iekšpusē, starp LANET un ārējo pasauli ir ugunsmūris un no ārpuses nevienam portam savienojumi neiet cauri. Varianti -
- Lietot Shoutcast serveri ārpus LANET - cik meklēju, visi bija par $$$
- Lietot kādu servisu, kas ar saskaņotu servera un klienta puses programmatūru māk izmānīt tā, ka ienākošie savienojumi tomēr tiek pieņemti. Tādi atradās tikai ārzemēs un - ļoti lēni un par - $$$.
Kā redzams, sevišķi lielu iespēju straumēt video un audio mums nav. Paliek daudz primitīvākais variants savus datus publiskot, reizi noteiktā intervālā kopējot uzņemto bildi uz kādu FTP serveri. Šim darbam domātu programmu ir cik uziet, un šo ceļu mums arī nācās izvēlēties. Attēla atjaunošanas laika intervāls tika izvēlēts pats mazākais pieejamais - reize sekundē. Ik sekundi no mana datora tiek ielādēts attēls uz FTP serveri.
Šo augšupielādēto bildi var skatīties jebkurā pārlūkprogrammā, visu laiku to atsvaidzinot (refresh). Nav pārāk ērti visu laiku spaidīt F5 vai klikšķināt peli, tāpēc uztaisīju mazu html dokuemntiņu, kas reizi sekundē pats sevi ielādēja. Trūkums - bieži gadījās, ka attēlu mēģina lasīt tajā brīdī, kad tas tiek rakstīts, līdz ar to attēls raustījās, brīžam nerādījās, vai rādījās tikai daļēji.
Lai daļēji kompensētu zemu attēla atjaunināšanas ātrumu, sadomāju uztaisīt tā, lai ielādētie attēli plūstoši pāriet viens otrā. Sāku ar mēģinājumu šo lietu realizēt ar Flash un Actionscript, tad pārgāju pie JavaScript. Rezultāts.
Dažas interesantas lietas, ar ko saskāros -
- Nav standartizēta veida, kā uzstādīt attēla "caurspīdīgumu" - IE lieto savu īpašo filtru "alpha(opacity=x)", Mozilla lieto savu īpašo CSS definīciju "-moz-opacity:x".
- Lai pārlūku piespiestu vēlreiz ielādēt vienu un to pašu attēlu, tā url'am jāpievieno katru reizi cits "query string" - cam.jpg?1, cam.jpg?2, cam.jpg?3 ...
Lai novērstu problēmu, ka reizēm attēlu nevarēs ielādēt, ja tas tajā brīdī tiek rakstīts, lietojam trīs absolūti pozicionētas, vienu uz otras novietotas bildes, kas katra tiek ielādēta citā brīdī - varbūtība, ka neviena no trijām nebūs ielādējusies ir diezgan maza. Trūkums - trīsreiz vairāk lejupielādējam, trīsreiz vairāk aizņemam savu joslu.