Mit MCI WAVE-Datei aufnehmen



  • Ja hallo, ich bins schon wieder.

    Mein Problem diesmal nicht so gravierend, es fehlt nur der letzte Hinweis.
    Und zwar, ich habe eigentlich schon alles geschafft:
    - Ich kann aufnehmen
    - Ich kann speichern

    Aber:

    - Der Media-Player will die Datei nicht abspielen!
    (Nero Wave-Editor & Audio Recoder tun das!)

    Hier erstmal mein Code:
    [cpp]Case IDREC:
    mciSendString("OPEN NEW TYPE WAVEAUDIO ALIAS mysound", NULL, 0, NULL);
    mciSendString("SET mysound TIME FORMAT MILLISECONDS BITSPERSAMPLE 16 CHANNELS 2 SAMPLESPERSEC 44100 BYTESPERSEC 5000 ALIGNMENT 4",NULL,128,NULL);
    mciSendString("RECORD mysound", NULL, 0, NULL);
    return TRUE;



  • [/cpp]

    case IDSTOP:
    mciSendString("STOP mysound", NULL, 0, NULL);
    return TRUE;
    
    case 3:
    mciSendString("SAVE mysound test.wav", NULL, 0, NULL);
    mciSendString("CLOSE mysound", NULL, 0, NULL);
    return TRUE;
    

    Ich denke ich mache was bei dem Setzen der Eigenschaften was falsch, aber vielleciht weiß einer Rat.

    mfg Chris



  • So ist das schwer nachvollziehbar...prüf mal die Return Werte, um den Fehler zu lokalisieren.

    Etwas genauer: Wann tritt der Fehler denn GENAU auf...Wo steht die Funktion, deren Return-Wert als erstes ein Fehler signalisiert.



  • @CodeFinder: Genau lesen! Er kann doch Wave-Dateien erstellen, welche sich auch mit allem möglichem außer dem Windows Media Player Abspielen lassen. Also wird sein Code schon laufen 💡

    @-=Chris=-: Was sagt den der WMP zu der von dir erstellten Datei?

    Greetz, Swordfish



  • Hallo und danke für die Rückmeldung (trotz des etwas zerstückelten Code),

    ich habe die Datei nun einmal mit dem "Windows Media Player 11 Beta" getestet,
    der dann behauptete es sei kein richtiger Codec vorhanden. Ich vermutete, dass
    das an der Beta-Version liegt. Der "Windows Media Classic" allerdings sagte ebenso,
    dass ein Fehler vorliegt, nannte es aber so:

    Ein Vorgang ist aufgrund eines
    Zertifizierungsfehlers fehlgeschlagen.

    Ein entsprechendes Dekomprimierprogramm konnte für diese Datei nicht gedownloadet werden. (Fehler=80040200)

    Ein entsprechendes Dekomprimierprogramm konnte für diese Datei nicht gedownloadet werden. (Fehler=80040200)

    Ein Vorgang ist aufgrund eines Zertifizierungsfehlers fehlgeschlagen. (Fehler=80040295)

    (Eigentlich sagt der auch, dass kein Codec da ist, drückt es nur anders aus.
    Aber wie gesagt, andere Programme spielen die Datei ab.)



  • So,

    da mein Problem echt kompliziert zu sein scheint und mir eben keiner weiterhelfen
    konnte, habe ich mich den halben Tag lang damit befasst. Und vor ein paar Minuten
    habe ich sie gefunden, die Lösung!

    Man muss um eine "saubere" WAVE-Datei zu erzeugen aus den Werten:

    Bits, Channels und Sampling-Rate die Bytes pro Sekunde errechnen

    und aus

    Bits und Channels das Alignment (keine Ahnung wie die deutsche Übersetzung ist)
    errechnen.

    Das geht so:

    include <stdio.h>
    include <mmsystem.h>
    
    int iChannels=2;
    int iBits=16;
    int iAlignment=0;
    unsigned int uiAvgBytes=0;
    unsigned int uiSamplingRate=44100;
    char szSetParms[256];
    
    			...
    
    	uiAvgBytes = (iBits * iChannels * uiSamplingRate) / 8;
    	iAlignment = (iBits * iChannels) / 8;
    
    	mciSendString("OPEN NEW TYPE waveaudio ALIAS mysound", NULL, 0, NULL); 
    
    	sprintf(szSetParms,"SET mysound BITSPERSAMPLE %i CHANNELS %i ALIGNMENT %i SAMPLESPERSEC %u BYTESPERSEC %u FORMAT TAG pcm,
    	iBits,iChannels,iAlignment,uiSamplingRate,uiAvgBytes);
    
    	mciSendString(szSetParms,NULL,0,NULL);
    
    			...
    

    Und danach dann wie schon oben aufnehmen und speichern. Und der WMP nervt auch
    net mehr.

    P.S. Wenn einer eine Funktion der WinAPI kennt, die wie "sprintf" ist kann er
    mir diese gerne posten 😃



  • wsprintf(
             LPTSTR lpOut,	  // pointer to buffer for output 
             LPCTSTR lpFmt,    // pointer to format-control string 
             ...	           // optional arguments
             );
    

    is das sowas was du brauchst statt sprintf? ich weiß grad net genau was sprintf ist aber es müsst eigentlich das sein was du meinst (vom Aussehen her...^^)



  • -=Chris=- schrieb:

    P.S. Wenn einer eine Funktion der WinAPI kennt, die wie "sprintf" ist kann er
    mir diese gerne posten 😃

    WinAPI basiert auf der Programmiersprache C, sprintf ist wie wsprintf eine C-Funktion.


Anmelden zum Antworten