Hei.
Osaisikohan joku teistä mahdollisesti autaa. Tarkoituksena olisi saada mikrofonista nauhoitettua ääntä siten, että se sitä mukaa streamaisi äänen UDP-protokollaa käyttäen toiselle tietokoneelle, jossa toinen tietokone sitten soittaisi sitä streamia suoraan.
Mikähän olisi mahdollisimman lyhyt ja helppo tapa tähän?
Winsock-kontrollin käyttö ei ole ongelma, vaan lähinnä tuo kuinka saisi ääntä reaaliaikaisesti lähetettyä nettiin ja toisella koneella luettua sitä.
Skype?
Tarkoitus olisi itse saada toteutettua moinen, ei niinkään käyttää valmista ohjelmaa.
Merrenger ja skype käyttää äänen pakkausta, joka onkin vähän hankala homma. Jos pärjäät ilman, niin saat olla tyytyväinen.
lainaus:
Merrenger ja skype
Mää en tiennytkään että oon jossain vaiheessa toteuttanut ton oman yhteydenpitosoftani. Oon varmaan koodannu unissani.
Jussir: Kiitos linkistä, tosin, olen jo katsonut sen aikaisemmin. Lähinnä kysyin tätä siksi, että onko kukaan tehnyt mahdollisimman lyhyttä koodia. Nuo samplet kun ovat suhteellisen pitkiä, joten epäolennaisuuksia on omaa projektia ajatellen varmaan yli puolet ja niiden etsiminen selaaminen ja karsiminen on turhauttavaa.
Noh, täytynee koettaa silti noita käyttää. Kiitos.
No niin. Tällä hetkellä onnistuu äänen nauhoittaminen pieneen puskuriin omalla koneelle (käyttää waveInOpen, waveInPrepareHeader yms. API-kutsuja) ja sen jälkeen vielä onnistuu kuunnellakkin se (waveOutOpen, waveOutPrepareHeader yms. API-kutsuilla).
Ongelmaksi muodostuu striimaus netin ylitse. Kun kuuntelen datan ennen lähetystä, se on kaikin puolin kunnossa. Ei siis mitään ongelmaa sen suhteen.
Kun lähetän koko WaveHeaderin (joka on WAVEHEADEREX-tyyppiä) ja toisessa koneessa otan vastaan ja kuuntelen, ääni muuttuu ihme surinaksi/rätinäksi/mitä tahansa muuta kuin siksi, mitä se alunperin oli.
Kuten ehkä joku jo ajattelikin, User Defined Typeähän ei voida suoraan lähettää. Se täytyy pistää byte-arrayhyn tai string-arrayhyn tjsp. jotta voidaan lähettää ja toisessa päässä se täytyy kasata uudelleen. Eli on tehty sillä tapaa.
Onko mitään ideoita missä voisi olla vika? Miksi ääni korruptoituu matkalla?
Josko osa lähetyksestä katoaa bittiavaruuteen matkalla, kun käsittääkseni UDP ei kauheasti jaksa stressata pakettihäviöistä. Tämä siis vain villi arvaus.
Mahtaako nettiyhteyden nopeus riittää datan lähetykseen reaaliaikaisesti?
Setä - Riittää varmasti, koska testaan localhostilla. Mutta kiitos kuitenkin hyvästä ehdotuksesta, luultavasti olisi aiheuttanut tuo sen jos olisi verkon yli oikeastikkin ja hidas yhteys :)
TsaTsaTsaa - Samaa kuin ylempänä, ts. ei tunnu kovin uskottavalta koska testaan localhostissa ja jos lähetän muuta dataa niin toimii.
Nyt tässä aikani funtsattuani tuota ongelmaa, on tullut eräs vaihtoehto mieleen jota täytyy tutkia itseni.
Ongelma SAATTAISI olla siinä, että koska lähetän dataa ja otan sitä vastaan ns. "User Defined Typeen" ja ennen lähetystä se pitää purkaa byte-arrayksi ja vastapäässä taas kasata, niin koska se sisältää wavedataa yms. niin ennen kuin sijoitan vastaanotetun datan muistiin, pitänee minun varata muistialue sille käyttäen GlobalAlloc API-kutsuja yms.
Tuli mieleen että se saattaisi aiheuttaa sen rutinan yms, koska jos data luetaan ensin muistialueelle ja jos siellä on entuudestaan röhnää, ei muistialueelle ehkä onnistuta viitata oikein -> jää vanha roska sinne muistialueelle (mitä nyt muistalueella onkin) -> kuuluu vain rutinaa ja ritinää kun waveOut koettaa tulkita sen äänidataksi.
Ainakin "napsumista" ilmeni siten, että waveIn:stä kun nauhoitin ja suoraan toistin waveOuttiin ja JOS olin ENNEN soittamista vahingossa vapauttanut muistin GlobalFree:llä, tuli häiriötä ääneen. Ts. kenties sama voisi aiheutua toisessa päässä, koska vastaanottajahan ei tietenkään ole saanut muistipaikkoihinsa wave-dataa. Ts. "se on kuin vapautettu muistialue", jos ymmärrätte mitä tarkoitan.
Mutta kuten sanoin, tämä on vain yksi teoria jota täytyy tutkia :)
Jos muita tulee mieleen, niin saa ehdotella! Kiitoksia vastauksistanne. =)
Ongelma ratkesi.
Unohdin sen, että WAVEHDR:ssä ei ole lainkaan dataa, vaan pelkkä pointteri dataan.
Ts. kun ensin nauhoitin äänen ja tallensin tiedot WAVEHDR:iin, ei se tietenkään itsessään sisältänyt ääntä, vaan ainoastaan pointterin. Jotta sai toimimaan, piti data lukea muistista byte arrayhyn API-kutsulla CopyMemory ja sen jälkeen lähettää ko. byte array.
Vastaanottavassa päässä luetaan Byte Array muistiin ja luodaan WAVEHDR siten, että tallennetaan siihen manuaalisesti wavedatan osoite.
Eli jos esimerkiksi winsockin tuleva data tallentuu bData() taulukkoon, viitataan wWaveHeaderin arvoon lpData siten, että sijoitetaan siihen pointteri bDataan.
Eli selvemmin (Winsockin DataArrivaliin) tälläinen:
wWaveHeader.lpData = VarPtr (bData(0))
Nyt on kuitenkin toisenlainen ongelma. Tähän kaipaisin apua kanssa.
Kun lähetän dataa, käytän kaksoispuskuria (kaksi puskuria, kun toinen täyttyy, aloitetaan nauhoittamaan toiseen ja päinvastoin). Sitten lähetän dataa sitä mukaa kun nauhoitan.
Kuitenkin, ongelma on että miten saisin käytettyä kahta puskuria waveOutille?
Ideoita?
Aihe on jo aika vanha, joten et voi enää vastata siihen.