Skinney Skrevet 4. september 2010 Del Skrevet 4. september 2010 Hei! Skriver for øyeblikket en klient-server løsning for streaming av media til telefonen min. Serveren bruker ffmpeg for å gjøre om videoen og lyd til xvid/mp3 og splitter opp videoen i 10-sekunders videoer. Serveren sender så del for del til klienten, som spiller av filene etter hverandre i riktig rekkefølge. Dette fungerer dessverre ikke så godt. Selv om du ikke kan "se" når klienten spiller av neste klipp, så kan du høre at lyden hakker, noe som er kjedelig når det skjer hvert tiende sekund... Har noen forslag på bedre måte å gjøre dette? Lenke til kommentar
TheMaister Skrevet 4. september 2010 Del Skrevet 4. september 2010 Det virker som at lydkortet lukkes og åpnes for hver gang du får et nytt klipp. Du trenger i såfall gapless playback om dette skal funke. Lenke til kommentar
Skinney Skrevet 4. september 2010 Forfatter Del Skrevet 4. september 2010 Sikker? Mulig jeg misforstår måten dette fungerer på, men hvis jeg spiller en mp3 i bakgrunnen så hører jeg fortsatt lyden... Da skal jeg vel forhindre lydkortet i å "lukke" seg? Lenke til kommentar
[kami] Skrevet 6. september 2010 Del Skrevet 6. september 2010 Dette er en kjent "feature" i mp3'er. Det leggest til tomme frames i slutten og starten på filer. Med mp3'er feks, så vil det bli en hørbar glitch om du setter en 10 sekunders mp3 til å loope. Dette har med formatet/komprimeringa å gjøre. kanskje denne linken kan gi deg mer informasjon: http://www.compuphase.com/mp3/mp3loops.htm Lenke til kommentar
Skinney Skrevet 6. september 2010 Forfatter Del Skrevet 6. september 2010 Er det andre formater som har dette? Vil jeg i teorien unngå problemet med å bruke AAC til lyd? Kan det ha noe med video kontainer å gjøre og? Lenke til kommentar
[kami] Skrevet 6. september 2010 Del Skrevet 6. september 2010 wav (rå lyddata) vil ikke ha dette. er usikker på ogg, men tror ikke den har denne forsinkelsen. Hvorfor splitter du forresten opp filene. hvorfor ikke bare streame dataen over og ha en 10mb buffer eller noe lignende? Lenke til kommentar
Skinney Skrevet 6. september 2010 Forfatter Del Skrevet 6. september 2010 Kan en fil streames MENS den konverteres? Lenke til kommentar
[kami] Skrevet 7. september 2010 Del Skrevet 7. september 2010 seff kan du det! du kan jo gjøre den om til det formatet du vil ha på serveren og streame (hele) resultatet til telefonen. å lese/skrive til Nettverk er omtrent det samme som å lese/skrive til en fil, når alt kommer til alt. det eneste du må gjøre på telefon clienten din da, er å lese fra nettverket og ha en passende buffer for å kompansere for tregt/utilgjenglig nettverk. Lenke til kommentar
Skinney Skrevet 7. september 2010 Forfatter Del Skrevet 7. september 2010 Men kan jeg gjøre om formatet samtidig som jeg streamer? Og kan jeg gjøre det ved ett eksternt kall til ffmpeg? Har ikke funnet svar på det noe sted... Skal nevnes at løsningen jeg har nå nesten fungerer, det er bare detta med lyden... Lenke til kommentar
[kami] Skrevet 8. september 2010 Del Skrevet 8. september 2010 Men kan jeg gjøre om formatet samtidig som jeg streamer? Og kan jeg gjøre det ved ett eksternt kall til ffmpeg? Har ikke funnet svar på det noe sted... Skal nevnes at løsningen jeg har nå nesten fungerer, det er bare detta med lyden... jeg har ikke brukt ffmpeg. Da må du nesten sjekke hvilken api kall du har. Det er ingenting som forhindrer deg å kunne konvertere noe mens du streamer. vanligvis vil dette kun være en funksjon: ie char * orginaldata = ....; char * konvertert; konvertert = encode(orginaldata); sendToClient(konvertert); Men du konverterer vel allerede i dag til 10 mbs filer, så ser ikke helt hva problemet blir om du konverterer til èn stor? Lenke til kommentar
Skinney Skrevet 8. september 2010 Forfatter Del Skrevet 8. september 2010 Har ikke api kall, kaller eksternt program. Selve konverteringsprossesen er ikke ett problem, men det er ikke alle format man kan se på samtidig som de konverteres (og se ferdig filmen på denne måten), så jeg ser ikke hvordan filmen så skal spilles av før den er ferdig nedlastet... Lenke til kommentar
TheMaister Skrevet 8. september 2010 Del Skrevet 8. september 2010 (endret) Kaller du på et eksternt program kan du bruke pipes, fylle pipen med data, ta i mot data, send i en kontinuerlig strøm. (Antar at du kaller på programmene direkte fra koden din.) Dessverre takler bare popen() enveiskjøring. Hvis du sitter i et POSIX-basert OS kan du bruke socketpair()/fork() klassikeren. Om ikke formatet tillater streaming er det et crap format (hvilke er det snakk om?). (Transkoding?) Bør ikke være verre enn dette: #include <unistd.h> #include <stdio.h> #include <stdlib.h> #include <sys/socket.h> #include <sys/wait.h> int main(void) { int fd[2]; // Parent får fd[0], child får fd[1] if (socketpair(AF_UNIX, SOCK_STREAM, 0, fd) < 0) { perror("socketpair"); exit(1); } // Vi er i child. Reroute stdout/stdin til fd[1] if (fork() == 0) { close(0); dup(fd[1]); close(1); dup(fd[1]); if (execlp("sed", "sed", "s|OMG|ZOMG|", NULL) < 0) { char tmp[] = "Halp :v Couldn't start process."; write(1, tmp, sizeof(tmp)); } exit(1); } // Vi er i parent. Ta i mot data fra annen prosess. else { char tmp[] = "OMG"; // Send data til annen prosess via fd[0]. Prosessen vil kunne lese fra fd[1] via stdin. if (write(fd[0], tmp, sizeof(tmp)) < (int)sizeof(tmp)) { perror("write"); exit(1); } // Shutter ned write-delen av fd[0]. stdin/fd[1] vil da få hangup hvis den prøver å lese mer, som avslutter sed. shutdown(fd[0], SHUT_WR); char buffer[2048] = {0}; // Mottar dataene som prosessen sendte fra stdout, via fd[1] til fd[0]. if (read(fd[0], buffer, sizeof(buffer) - 1) <= 0) { perror("read"); exit(1); } puts(buffer); int status; wait(&status); // wait()-er på en zombie-prosess. :3 printf("Process exited with status: %d\n", (int)WEXITSTATUS(status)); } return 0; } Istedenfor sed, ffmpeg. Og send() istedenfor puts(). Endret 8. september 2010 av TheMaister Lenke til kommentar
Skinney Skrevet 9. september 2010 Forfatter Del Skrevet 9. september 2010 Ok... Får se litt nærmere på denne pipe prosessen... Og dette sendes over vanlig tcp og åpnes som en vanlig film da eller? Fungerer på windows og? For øyeblikket er det snakk om h264 og aac lyd... Lenke til kommentar
TheMaister Skrevet 9. september 2010 Del Skrevet 9. september 2010 Hm, Win32 har ikke socketpair()/fork() osv, så vet ikke hvordan jeg ville ha løst det i Win32. Fifoer har den heller ikke... Cygwin er jo en mulighet, men. Lenke til kommentar
Skinney Skrevet 16. september 2010 Forfatter Del Skrevet 16. september 2010 Okay... Ser ut til at Qt er litt kresen på hva den tilater "Streaming" fra, så som en workaround har jeg laget min egen lille http server, slik at klient-programmet mitt tror den streamer fra en vilkårlig webside... Problemet er at jeg ikke helt vet hva jeg skal svare på forespørselen... Søkt rundt på google men finner ingen konkrete svar, og er tydeligvis ikke bare å sende avgårde en ByteArray heller... Noen som vet hva Apache eller lignende http servere svarer på en forespørsel som dette? "GET /test.avi HTTP/1.1 Host: 127.0.0.1:8080 Accept: */* User-Agent: QuickTime/7.6.6 (qtver=7.6.6;cpu=IA32;os=Mac 10.6.4) Connection: close " Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå