Utveckla android app, 10 000 ljudfiler används - hur skulle du hantera dessa?

Trädvy Permalänk
Medlem
Plats
Norrköping
Registrerad
Dec 2009

Utveckla android app, 10 000 ljudfiler används - hur skulle du hantera dessa?

Hej!

Beskrivning av problemet:
Håller just nu på att utveckla en app i Android Studio (d.v.s. Java). I appen finns en funktionalitet där man kan söka på ett ljudklipp och spela upp ljudet. Tanken är att testa för 100 olika ljudklipp. Men vad händer om jag senare vill lägga till 10 000 ljudklipp!?
Ljudklippens namn ska vara sökbara. D.v.s. jag/användaren ska kunna söka på namnet och rätt sökord ger tillgång till att spela upp ljudklippet. Ljudklippen kan vara allt mellan 1 - 5 sekunder långa, d.v.s. väldigt korta ljudklipp.

Frågor:
1. Vilket ljudformat är det bäst att spara 5 sekunder långt ljudklipp, om man har 10 000 av dessa? Vill spara så mycket minne som möjligt. Vill helst att min app är mindre än 30 MB.
2. Tar det lång tid att söka efter ett ord i en lista på 10 000 ord? Om sökningen är linjär, d.v.s. O(n), så borde det gå hyfsat snabbt, eller? Måste jag använda mig av en Hashtable/Map?
3. Jag har tänkt att skapa en fil/databas för att läsa in ordlistan. Bör jag köra JSON? Eller fungerar vanlig .txt?

Jag kan inget om ljud men har funderat på att spara i ljudfromatet .ogg. Verkar vara väldigt bra.

Tacksam för all hjälp!

Trädvy Permalänk
Medlem
Plats
Bålsta
Registrerad
Nov 2010

@Alotiat: Bygg ett webapi som du söker i och serverar dina ljudfiler ifrån. Då kan du lägga till och ta bort ljud "on the fly" utan att behöva uppdatera användarnas app.

Det kan ju dock vara bra att cache ljudfilerna en stund i appen

~. Citera så jag hittar tillbaka .~

Trädvy Permalänk
Medlem
Plats
Norrköping
Registrerad
Dec 2009
Skrivet av KeVVa:

@Alotiat: Bygg ett webapi som du söker i och serverar dina ljudfiler ifrån. Då kan du lägga till och ta bort ljud "on the fly" utan att behöva uppdatera användarnas app.

Det kan ju dock vara bra att cache ljudfilerna en stund i appen

Menar du hämta ljudklipp från en server? Hur fungerar ett webapi? Kan tyvärr inte mycket om webapi. : (

Kan tillägga att jag har väldigt liten erfarenhet för dessa typer av projekt.

Men jag är tacksam för det snabba svaret!

Trädvy Permalänk
Medlem
Plats
Bålsta
Registrerad
Nov 2010
Skrivet av Alotiat:

Menar du hämta ljudklipp från en server? Hur fungerar ett webapi? Kan tyvärr inte mycket om webapi. : (

Kan tillägga att jag har väldigt liten erfarenhet för dessa typer av projekt.

Men jag är tacksam för det snabba svaret!

Du bygger en enkel webbapplikation som returnerar json data. T.ex. för att hämta en lista med alla ljud filer för du ett GET request till min-site.se/api/soundfiles/

Varje soundfile i din json feed har också ett id. Med det här idt kan du ladda ner binären som är ljudfilen. T.ex. min-site.se/api/soundfiles/1337 och filen laddas ned till enheten.

I din android applikation gör du bara enkla http requests. Precis som om du skulle ladda ned filen från vilken hemsida som helst

Skickades från m.sweclockers.com

~. Citera så jag hittar tillbaka .~

Trädvy Permalänk
Medlem
Plats
Norrköping
Registrerad
Dec 2009
Skrivet av KeVVa:

Du bygger en enkel webbapplikation som returnerar json data. T.ex. för att hämta en lista med alla ljud filer för du ett GET request till min-site.se/api/soundfiles/

Varje soundfile i din json feed har också ett id. Med det här idt kan du ladda ner binären som är ljudfilen. T.ex. min-site.se/api/soundfiles/1337 och filen laddas ned till enheten.

I din android applikation gör du bara enkla http requests. Precis som om du skulle ladda ned filen från vilken hemsida som helst

Skickades från m.sweclockers.com

Tack för utförligt svar! Ska testa att bygga ett webb-api i ASP/.NET/C#. Får se hur det går.

Sedan är frågan om man ska låta ljudfilen ligga kvar när användaren laddat ner filen. Men det kan man klura på sen. Tusen tack för förslaget!

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Jan 2004
Skrivet av Alotiat:

Tack för utförligt svar! Ska testa att bygga ett webb-api i ASP/.NET/C#. Får se hur det går.

Sedan är frågan om man ska låta ljudfilen ligga kvar när användaren laddat ner filen. Men det kan man klura på sen. Tusen tack för förslaget!

Du behöver ju inte bygga något API alls utan JSON-filen med all data över ljudfilerna kan ju vara statisk och ljudfilerna likaså, JSON-filen regenererar du om något ska uppdateras och sen laddar du upp den på webbhotellet.
Då duger vilket webbhotell som helst så länge det inte rör sig om större mängder trafik.
JSON-listen laddas ner när den har förändrats vilket kan notifieras antingen via en datumfil eller DNS (version.mindomain.tld) som sen jämförs med datumet på filen man senast laddade ner. DNS-versionen är smart om man har mycket trafik då TTL gör att det cachas hos användarens ISP så om 1000 användare under en kort tid använder appen så kanske det endast går ett fåtal anrop mot den authorativa DNS-servern.

Och att bygga en enkel cache-funktion gör du säkert på en kvart (cacha X antal element, om listan är full ta bort äldsta).

Trädvy Permalänk
Medlem
Plats
Karlskrona
Registrerad
Aug 2009

Din ursprungliga post nämner inget om att att filerna skall finnas på en central server. Om så inte är fallet så är en webapplikation med ett publikt api lite overkill. För att inte nämna att det gör dig beroende av en massa fler parametrar förutom användarens mobiltelefon.
Men om du önskar detta pga platshantering på klieten, dynamiskt innehåll osv så kan det var en idé.
Ett helt api kan dock vara lite overkill ändå och en fil på en given adress kan innehålla ljudfilsinformation med namn och url till filen. Du kan då vid uppstart ladda ner senaste verisonen av den filen och sedan sköta sökningar lokalt på klienten. Plocka ut URL och ladda ner ljudklippet och spela upp det. Cacha de x senaste ljudklippen lokalt hos klienten om samma ljudklipp ofta lyssnas på för att undvika hämda det igen i onödan osv.

Asus Zenith Extreme | 32gb DDR4 3200MHZ CL14 | Threadripper 1950X | 1080Ti
Asus Z97 Pro Gamer | 32gb ram DDR3 2400MHz | i7 4790k | 2 x R9 390 - Barnen fått ta över
Asrock P67 Extreme4 rev3 | 16gb DDR3 2400MHz | i7 2600K | R9 290 - Barnen fått ta över
En massa bärbara, servrar, RPi's och andra boxar

Trädvy Permalänk
Medlem
Plats
Norrköping
Registrerad
Dec 2009
Skrivet av iXam:

Du behöver ju inte bygga något API alls utan JSON-filen med all data över ljudfilerna kan ju vara statisk och ljudfilerna likaså, JSON-filen regenererar du om något ska uppdateras och sen laddar du upp den på webbhotellet.
Då duger vilket webbhotell som helst så länge det inte rör sig om större mängder trafik.
JSON-listen laddas ner när den har förändrats vilket kan notifieras antingen via en datumfil eller DNS (version.mindomain.tld) som sen jämförs med datumet på filen man senast laddade ner. DNS-versionen är smart om man har mycket trafik då TTL gör att det cachas hos användarens ISP så om 1000 användare under en kort tid använder appen så kanske det endast går ett fåtal anrop mot den authorativa DNS-servern.

Och att bygga en enkel cache-funktion gör du säkert på en kvart (cacha X antal element, om listan är full ta bort äldsta).

Skrivet av inquam:

Din ursprungliga post nämner inget om att att filerna skall finnas på en central server. Om så inte är fallet så är en webapplikation med ett publikt api lite overkill. För att inte nämna att det gör dig beroende av en massa fler parametrar förutom användarens mobiltelefon.
Men om du önskar detta pga platshantering på klieten, dynamiskt innehåll osv så kan det var en idé.
Ett helt api kan dock vara lite overkill ändå och en fil på en given adress kan innehålla ljudfilsinformation med namn och url till filen. Du kan då vid uppstart ladda ner senaste verisonen av den filen och sedan sköta sökningar lokalt på klienten. Plocka ut URL och ladda ner ljudklippet och spela upp det. Cacha de x senaste ljudklippen lokalt hos klienten om samma ljudklipp ofta lyssnas på för att undvika hämda det igen i onödan osv.

Nej det finns inget krav på att det ska vara ett api. Är som sagt oerfaren så jag vet inte vad som är enklast.

Jag har hunnit kolla lite på hur man utvecklar ett api i C# och jag tror, som ni säger, att det är lite överdrivet för just det här projektet. Om jag förstått rätt så vill jag i princip ha såhär:

  1. Användaren startar appen och JSON-filen med alla ljudklippens namn laddas ned.

  2. Användaren söker ett ord. Sökningen sker hos klienten.

  3. Ljudfilen laddas ner (jag har kollat och det är mellan 10-30 kB för .ogg filer på 1 - 5 sek. Det är väl inte mycket, eller?)

  4. Ljudet spelas upp och sparas i en cache-lista.

Det lät ju lite enklare. Vill gärna ha så enkel implementering som möjligt.

Tusen tack för input! Har ni fler tankar och idéer så släng gärna upp dem här. Annars tänkte jag köra igång med detta upplägg

EDIT: Nej det är inte många som kommer att använda min app. Däremot vet jag inte hur mycket trafik det skulle skapas om varje användare laddade ner 30 kB för varje lyckad sökning. Någon som vet hur mycket 30 kB/sökning per användare är i server-trafik? Mycket eller lite?

Typo
Trädvy Permalänk
Medlem
Plats
Karlskrona
Registrerad
Aug 2009
Skrivet av Alotiat:

Nej det finns inget krav på att det ska vara ett api. Är som sagt oerfaren så jag vet inte vad som är enklast.

Jag har hunnit kolla lite på hur man utvecklar ett api i C# och jag tror, som ni säger, att det är lite överdrivet för just det här projektet. Om jag förstått rätt så vill jag i princip ha såhär:

  1. Användaren startar appen och JSON-filen med alla ljudklippens namn laddas ned.

  2. Användaren söker ett ord. Sökningen sker hos klienten.

  3. Ljudfilen laddas ner (jag har kollat och det är mellan 10-30 kB för .ogg filer på 1 - 5 sek. Det är väl inte mycket, eller?)

  4. Ljudet spelas upp och sparas i en cache-lista.

Det lät ju lite enklare. Vill gärna ha så enkel implementering som möjligt.

Tusen tack för input! Har ni fler tankar och idéer så släng gärna upp dem här. Annars tänkte jag köra igång med detta upplägg

EDIT: Nej det är inte många som kommer att använda min app. Däremot vet jag inte hur mycket trafik det skulle skapas om varje användare laddade ner 30 kB för varje lyckad sökning. Någon som vet hur mycket 30 kB/sökning per användare är i server-trafik? Mycket eller lite?

Har du inte tusentals användare som kontinuerligt gör säkningar så rär det ingen fara. Om du som sagt även cachar lokalt så minskar ju trfikenb i och med det också. OM det är så att filerna är "fasta" och inte ändras så KAN du ju även göra dem en del av installationen och ha även dem lokalt. Även 10.000 filer á typ 30kb blir bara ett par 100MB. Men är som sagt bara en hållbar lösning om det inte tillkomemr nya filer löpande osv.

Asus Zenith Extreme | 32gb DDR4 3200MHZ CL14 | Threadripper 1950X | 1080Ti
Asus Z97 Pro Gamer | 32gb ram DDR3 2400MHz | i7 4790k | 2 x R9 390 - Barnen fått ta över
Asrock P67 Extreme4 rev3 | 16gb DDR3 2400MHz | i7 2600K | R9 290 - Barnen fått ta över
En massa bärbara, servrar, RPi's och andra boxar

Trädvy Permalänk
Inaktiv
Registrerad
Mar 2010
Skrivet av Alotiat:

EDIT: Nej det är inte många som kommer att använda min app. Däremot vet jag inte hur mycket trafik det skulle skapas om varje användare laddade ner 30 kB för varje lyckad sökning. Någon som vet hur mycket 30 kB/sökning per användare är i server-trafik? Mycket eller lite?

Det är precis det du säger 30 kB/sökning/användare

Trädvy Permalänk
Medlem
Plats
Finland
Registrerad
Maj 2004

Vi kan räkna lite för att se vilken storlek filerna skulle ta om alla sparades lokalt i appen.

Säg att du har 10 000 filer som du nämnde, och i medeltal är de 3 sekunder långa. Om appen skall hållas på 30 MB får varje sekund av en ljudfil ta upp 1 kB, d.v.s. 8 kbps.

Här har du exempel på olika bitrates.

I min mening, på basis av videon, är 64 kbps den absolut minsta som man alls kan överväga. Är kvaliteten av någon vikt så är det 128 kbps och uppåt som gäller. Det här ger alltså en absolut minsta storlek på appen på ca. 240 MB och gärna 480 MB+ om du ska lagra 10000 3-sekundersklipp på telefonen.

Trädvy Permalänk
Medlem
Registrerad
Jul 2013

Låter som du bör iaf sätta upp en databas om du på ett smidigt sätt ska kunna söka efter namn eller taggar eller lite vad som.

Om du vill kan du få kod och hjälp med ett c# web api mot mongodb.