Optage lyd

Tags:    c++

Jeg kunne godt tænke mig at lære at "optage" den lyd som kommer ud gennem højtalerne, for derefter at gemme dette i en lydfil af en eller anden "normal" art, så er der nogen som har nogle tutors omkring hvordan man gør dette?
det ville også være ok med et program man kan downloade (gratis) som gør dette hvis nogen kender et sådant?



Jeg har et simpelt program her:
http://home20.inet.tele.dk/midgaard/snip/recplay.html

Det optager lyd i op til 30 sekunder, eller indtil man trykker på en tast. Så gemmer det lyden i en wav fil og afspiller den igen.



Nu har jeg ikke prøvet det andet program, men jeg bruger selv http://audacity.sourceforge.net




ok har fået det til at fungere nu, mange tak for hjælpen :D

[Redigeret d. 16/06-05 19:44:25 af Andreas]



Du skal linke med winmm.lib (eller hvis det er g++ libwinmm.a)



Jeg synes at jeg leder og leder, men jeg kan ikke se hvor det er du bestemmer optagetiden?



Jeg synes at jeg leder og leder, men jeg kan ikke se hvor det er du bestemmer optagetiden?


I starten af main står der:
int NumSamples = 10*SAMPLE_RATE;

Det gør at der kan optages max 10 sek (jeg huskede forkert og påstod at det var 30 sekunder).

I Record() står der:
do
{
Sleep(100);
}
while(!KeyHit() && !(WaveHeader.dwFlags & WHDR_DONE));

Her har brugeren mulighed for at afbryde inden de 10 sekunder er udløbet.



Jeg synes at jeg leder og leder, men jeg kan ikke se hvor det er du bestemmer optagetiden?


I starten af main står der:
int NumSamples = 10*SAMPLE_RATE;

Det gør at der kan optages max 10 sek (jeg huskede forkert og påstod at det var 30 sekunder).

I Record() står der:
do
{
Sleep(100);
}
while(!KeyHit() && !(WaveHeader.dwFlags & WHDR_DONE));

Her har brugeren mulighed for at afbryde inden de 10 sekunder er udløbet.

Som jeg forstår heraf skal jeg bare ændre:
int NumSamples = 10*SAMPLE_RATE;
til f.eks.
int NumSamples = 30*SAMPLE_RATE;
men gør jeg dette får jeg følgende fejlmeddelelse "Failed to prepare header: Der blev givet en ugyldig parameter til en systemfunktion."
hvad gør jeg galt?

ps. denne fejl kommer når programmet går i gang med at optage, hvorved det ikke når længere.

[Redigeret d. 16/06-05 21:15:26 af Andreas]



Du skal rette linien hvor der bliver allokeret plads til lyden, det bedste er at ændre linien med malloc (den i main) til:

char *Buffer = (char *)malloc(NumSamples);

(Jeg bør vist ændre det i eksemplet...)



Når jeg optager et længere musikstykke, så laver den nogle "hack" i starten af det den optager, og der er også noget baggrundsstøj.
Hvordan fjerner jeg denne baggrundstøj og "hack'ne"?
ps. hvad gør SAMPLE_RATE, hvor mange bytes der optages per sekund?



SAMPLE_RATE bestemmer hvor mange samples der er pr sekund. Hvis det skal være i CD-plade kvalitet skal du sætte den til det dobbelte. Man kan ikke bare vælge tilfældige værdier. Til tale kunne 8000 bruges.

Programmet optager i mono og med 8 bit pr samples, det er ikke helt godt.

Jeg ved ikke hvorfor der kommer hak i lyden. Du kan prøve at stille på windows knapper for optagelse, så burde du kunne fjerne det meste støj.

Jeg vil prøve at lege lidt mere med det en af dagene. Det er måske bedre at bruge mange små buffere og ikke én stor.



t