acm
-
hallo leute
hat von euch jemand nen source, wo ich mir angucken kann, wie das mit dem aufnehmen ueber das mikrofon, abspielen und on-the-fly komprimieren (gsm usw.) funktioniert ? oder vielleicht n tutorial ?
hab im netz schon rumgesucht. aber nicht das richtige gefunden. zu mindest nicht in C(++). delphi dafuer zum saufuttern, bringt mir aber nicht wirklich was.
vorallem krieg ich es nicht auf die reihe wie das mit den callback-funktionen funktionieren soll.
Meep Meep
-
tja, im grunde brauchst du nur ein paar api-functions für die wave-geschichte
- waveInOpen()
- waveInPrepareHeader()
- waveInStart()
- waveInProc() // CALLBACK
über die Callback function bekommst du folgende events wenn das device mit dem entsprechenden parameter geöffnet ist:
WIM_OPEN
WIM_CLOSE
WIM_DATAfür die kompression hängst du einen entsprechenden encoder in den datenstrom rein - fertig
steht aber eigentlich auch alles in der MSDN
-
hallo RockNix
die MSN is mir persoenlich etwas zu umstaendlich zulesen. d.h. ich nix kapieren. vorallem macht mir das komprimieren große probleme.
wenn ich nun die aufnahme mit zwei buffer loese, muß ich dann wenn der erste buffer voll is, den dann mit dem acm komprimieren oder kann man dem das so sagen, das er das automatisch macht, wenn der buffer gefuellt wird ?
vorallem, was mach ich dann damit, wenn ich WIM_OPEN, WIM_CLOSE und WIM_DATA
bekome ?entweder parke ich seit paar tagen auf der leitung oder ich bin einfach nur doof. oder beides. *multi*prozess*nix*in*kopf*reingeh* ;o)
wenn er zuerst den buffer fuellt und ich dann erst komprimieren kann, muesste ich naemlich recht kleine buffer verwenden damit das halbwegs gleichzeitig aufnimmt und abspielt. aber scheinbar darf man da auch nicht zukleine buffer verwenden, da man sonst wieder probleme bekommt. (hab ich schon paar mal in newsgroups gelesen. was noch staerker zum tragen kommt, weil man vor dem abspielen ja auch zuerst wieder dekomprimiren muß.
waere da dann meine rechnung richtig ?
aufnahme: 100 ms
komrimieren: z.b. 20 ms
dekomprimieren: z.b. wieder 20 ms
dann erst abspielen. das waere dann ne differenz von 140 ms ?ich hoffe es war halbwegs verstaendlich.
bin grad erst aufgestanden und habe noch keinen Kaffee intus ;o)Meep Meep
-
ich hatte da noch eine wichtige funktion vergessen
waveInAddBuffer()
also du musst midestens 2 buffer verwenden sonst wird das nichts. die länge der buffer ist massgebend für die i/o latenz. 1024 samples sollten ausreichend sein.
auf WM_OPEN synchronisierst du waveInStart(), bei WM_DATA kopierst du den aktuell gefüllten buffer lokal und schiebst ihn dann mit waveInAddBuffer() wieder an den treiber zurück. derweil kannst du den lokalen buffer schonmal zum encoder übergeben. WM_CLOSE muss man nicht zwingend handeln.
wie gross deine max. latenz letztlich sein darf, hängt natürlich davon, was du machen willst.
und zu MSDN, wer ernsthaft proggen will, kommt nicht herum, auch mal komplizierte literatur zu lesen