_ 4.2.4 Sända och ta emot ljud över Internet Uppgiften belyser ljudöverföring. __ Uppgift Gör en app som kan sända och ta emot ljud via stream sockets eller datagram sockets. Appen ska kunna: = Spela in ett ljud = Sända ett ljud (med TCP eller UDP) = Ta emot ett ljud (med TCP eller UDP) = Spela upp ett ljud Man kan exempelvis göra en Walki-Talki (med stream sockets) eller en IP-telefon (med datagram sockets). __ Exempel Inget exempel ges. __ Tips När man använder ljud över Internet så är det mycket viktigt att man sänder så lite information som möjligt, speciellt om det finns användare som är uppkopplade via mobiler. Hur gör man det? Man använder två olika sätt: - Sampla ljudet med: -- Färre samples per tidsenhet, 8KHz är tillräckligt för tal -- Färre bitar för varje sample -- Färre kanaler, använd mono - Komprimera ljudet innan sändning och dekomprimera det efter mottagning: -- Metoder specialiserade för ljud komprimerar ofta så att information försvinner och det finns många olika metoder för detta (många olika codecs): --- En del specialiserade på talat ljud: ---- ALAW är en standard som används i telefonerna i Europa med mera, denna codec ingår i JDK och halverar mängden information men ljudet blir av ganska dålig kvalitet ---- ULAW är en standard som används i telefonerna i USA och Japan, denna codec ingår i JDK och halverar mängden information men ljudet blir av ganska dålig kvalitet ---- GSM är en standard som används av mobiltelefoner, denna codec ingår inte i JDK och informationen blir ca 10 gånger mindre och ljudet blir av ganska bra kvalitet --- En del specialiserade på musik: MP3, MP4 med flera --- Metoder som är generella, exempelvis ZIP, komprimerar ofta så att inte information försvinner Om man ska bygga en IP-telefon bör man använda effektiva datagram sockets. Vad händer när man sänder datagrampaket över Internet?: = Paket kan försvinna: -- 0-20% paketförlust är accepterbar (beroende på hur ljudet processas) -- 20-100% paketförlust är ej accepterbar = Paket fördröjs (olika tider): -- 0-150 millisekunder fördröjning märks inte -- 150-400 millisekunder fördröjning är accepterbar -- 400+ millisekunder fördröjning är ej accepterbar En bra IP-telefon försöker minimera dessa problem och grunden till många vanliga lösningar är: - Tillägg av ordningsnummer för varje paket - Tillägg av tidsstämpel för varje paket - Fördröjning av uppspelning (fixerad eller adaptiv) Genom att göra detta kan man se till att paketen spelas upp med rätt tidsintervall (och undviker "jitter", det vill säga att ljudet ibland spelas upp långsammare och ibland fortare) samt använda speciella metoder när ett paket saknas (exempelvis att spela upp tidigare paket igen eller interpolera mellan två paket). Man kan även använda speciella kodningsscheman hos både sändaren och mottagaren (antingen genom att inte utöka informationen som sänds (som vid en teknik kallad "interleaving") eller genom att öka informationen som sänds genom att lägga till redundant information (som vid en teknik kallad "forward error correction")). Se även tipsen för uppgifterna [5.2.1 Ljudöverföring med stream sockets, 05_ass/ip1/5.2.1.txt] och [5.2.2 Ljudöverföring med datagram sockets, 05_ass/ip1/5.2.2.txt] på kursen [Internetprogrammering – Stationära enheter, 01_intro/ip1.txt]. __ Hjälp ~ 05_ass/help/01.txt > [Klicka här för hjälp, helper.dsv@gmail.com, Prog mobil: 4.2.4 Sända och ta emot ljud över Internet: http://people.dsv.su.se/~pierre/i/i.cgi?href=05_ass/ip4/4.2.4.txt] ½===system_tutoring_message===½ < ~ 05_ass/help/02.txt