Samples in WAV-Files
-
Hallo Leute!
wie komme ich an die einzelnen Samples einer WAV-Datei ran?
angenommen ich habe eine unkomprimierrte WAV-Datei (PCM, 16Bit, 44.1KHz, Stereo), dann möchte ich quasi pro Sekunde 44100 16-Bit Werte für den rechten und 44100 16-Bit Werte für den linken Kanal.habe mich schon mal auf www.wotsit.org schlau gemacht, wo das WAV-Format beschrieben ist. Kann mir nicht vorstellen, dass ich die Datei wirklich byteweise zerlegen muss. komm ich da auch irgendwie bequemer per WinAPI ran? gibt ja jede menge WinAPI-Funktionen in Zusammenhang mit der Soundschnittstelle und WAV-Dateien!
irgendwelche Ideen? oder kennt jemand schon ne fertige Lib dazu?
-
Du bist dumm.
@Mods: bitte schließen!
-
scheinen ja wieder ferien zu sein
die kinder langweilen sich zu tode, vielleicht mal raus und basketball?
-
hab schon gegoogelt und einiges gefunden, z.b. das hier: http://bdn.borland.com/article/0,1410,21300,00.html
bin aber für alle tipps offen (bzgl. WINAPI), falls jemand noch was intelligentes zu sagen hat
-
flosko du ******
da steht doch alles in dem dokument
von wegen "gelesen" HAHAHAHA
du bist so blöd dass sich die balken biegen
-
ich glaube es reicht wenn du ab einer bestimmt stelle einfach alle daten hintereinander ausließt, dann bekommt man das wav dingen was man abspielen kann.
es gibt auch plugins für z.B. winamp womit du raw-wav daten auf platte speichern kannst, wenn du das format kennst (also 44100 16bit stereo) dann sollte es kein problem sein das auszulesen
bei stereo stehen die daten abwechselnd da, also 16bit link .. 16 bit rechts... 16bit links...
wenn meine ausführungen zu blöd waren, frag nochma
rapso->greets();
-
Original erstellt von elise:
**scheinen ja wieder ferien zu seindie kinder langweilen sich zu tode, vielleicht mal raus und basketball?**
Basketball draussen im Winter?
-
-> mail
-
bei einer wave-datei ist der header immer 44 byte lang ... die samples liegen dahinter, im alternated l/r mode ...
bei einer 16 bit / stereo datei sind demnach die ersten 2 bytes hinter dem header für den einen, die nächsten 2 byte für den anderen kanal usw. ...
die lassen sich dann einfach mit einem short-pointer auslesen ...
rocknix ///
-
Ähhhh sacht mal ihr habt doch nicht mehr alle Tassen im Schrank, oder? Das hier ist ein Programmierforum und keine Beleidigungsgroup für kontaktarme Deppen, die wohl nicht den Arsc h versohlt bekommen! Benehmt euch doch mal wie anständige Informatiker und nicht wie kleine Pissblagen!
*grrrrrrrrr*
code_pilot
-
@code_pilot: Du scheinst offensichtlich genau das gleiche Problem zu haben wie die "kleinen Pissblagen".
-
Original erstellt von WebFritzi:
@code_pilot: Du scheinst offensichtlich genau das gleiche Problem zu haben wie die "kleinen Pissblagen".GARANTIERT nicht!
Mich regt dies einfach nur auf weil ich das schon in so vielen Threads gesehen habe! Und nur solche blöden Idioten die wirklich dumm sind kommen darauf, mal einfach jemanden als "DUMM" zu bezeichnen weil er nicht weiter weis und seine Fragen in dieses FORUM postet um eine Antwort zu erhalten, das regt mich einfach auf...Wozu ist dieses Forum da? Genau, um untereinander zu helfen und nicht um sich zu beleidigen ... das ist der Punkt!
Grüsse, code_pilot
-
das ist ein auszug aus einer DirectSounf Wrapper klasse, die ich vor ewigkeiten mal (nach)geschrieben habe ...
Da gibts auch eine Funktionssammlung zum laden von Wave Dateien ... Dabei werden die Funktionen
mmioOpen(), mmioSeek(), mmioRead(), mmioDescend() und mmioClose()
benutzt um auf die daten innerhalb der wave datei zuzugreifen ...Auszug aus MyDirecSound.cpp
// läd ein WAV File, und füllt die übergebenen pointer entsprechend BOOL CMyDirectSound::LoadWave(const char *ccFileName, WAVEFORMATEX *wf, DWORD *pdwLength, PBYTE *ppbyWData) { HMMIO hmmio; //datei öffnen hmmio = mmioOpen( (char*)((LPCTSTR)ccFileName), NULL, MMIO_READ ); if( !hmmio ){ MessageBox( m_hWnd, "LoadWave:mmioOpen failed !!", NULL, MB_OK ); return FALSE; } // WaveFormat einlesen if( !WaveFormat( hmmio, wf ) ){ MessageBox( m_hWnd, "LoadWave:WaveFormat failed !!", NULL, MB_OK ); return FALSE; } // WaveDaten einlesen if( !WaveData( hmmio, pdwLength, ppbyWData ) ){ MessageBox( m_hWnd, "LoadWave:WaveData failed !!", NULL, MB_OK ); return FALSE; } mmioClose( hmmio, 0); return TRUE; } BOOL CMyDirectSound::WaveFormat(HMMIO hmmio, WAVEFORMATEX *wf) { // verschiedene stellen der datei anspringen und das WaveFormat auslesen MMCKINFO mmWave; MMCKINFO mmFmt; MMRESULT mmResult; ZeroMemory(&mmWave, sizeof(mmWave) ); ZeroMemory(&mmFmt, sizeof(mmFmt) ); mmResult = mmioSeek( hmmio, 0, SEEK_SET); if( FAILED(mmResult) ){ MessageBox( m_hWnd, "WaveFormat:mmioSeek failed !!", NULL, MB_OK ); return FALSE; } mmWave.fccType = mmioStringToFOURCC( "WAVE", 0 ); mmFmt.ckid = mmioStringToFOURCC( "fmt", 0 ); mmResult = mmioDescend( hmmio, &mmWave, NULL, MMIO_FINDRIFF); if( FAILED(mmResult) ){ MessageBox( m_hWnd, "WaveFormat:mmioDescend:MMIO_FINDRIFF failed !!", NULL, MB_OK ); return FALSE; } mmResult = mmioDescend( hmmio, &mmFmt, &mmWave, MMIO_FINDCHUNK); if( FAILED(mmResult) ){ MessageBox( m_hWnd, "WaveFormat:mmioDescend:MMIO_FINDCHUNK failed !!", NULL, MB_OK ); return FALSE; } mmResult = mmioRead(hmmio, (HPSTR)wf, sizeof(WAVEFORMATEX) ); if( FAILED(mmResult) ){ MessageBox( m_hWnd, "WaveFormat:mmioRead failed !!", NULL, MB_OK ); return FALSE; } return TRUE; } BOOL CMyDirectSound::WaveData(HMMIO hmmio, DWORD *pdwLength, PBYTE *ppbyWData) { // Hier werden die eigentlichen WAV daten eingelesen // Es werden wieder spezielle stellen im File angesprungen und ausgelesen MMCKINFO mmWave; MMCKINFO mmData; MMRESULT mmResult; ZeroMemory(&mmWave, sizeof(mmWave) ); ZeroMemory(&mmData, sizeof(mmData) ); mmResult = mmioSeek( hmmio, 0, SEEK_SET); if( FAILED(mmResult) ){ MessageBox( m_hWnd, "WaveData:mmioSeek failed !!", NULL, MB_OK ); return FALSE; } mmWave.fccType = mmioStringToFOURCC( "WAVE", 0 ); mmData.ckid = mmioStringToFOURCC( "data", 0 ); mmResult = mmioDescend( hmmio, &mmWave, NULL, MMIO_FINDRIFF); if( FAILED(mmResult) ){ MessageBox( m_hWnd, "WaveData:mmioDescend:MMIO_FINDRIFF failed !!", NULL, MB_OK ); return FALSE; } mmResult = mmioDescend( hmmio, &mmData, &mmWave, MMIO_FINDCHUNK); if( FAILED(mmResult) ){ MessageBox( m_hWnd, "WaveData:mmioDescend:MMIO_FINDCHUNK failed !!", NULL, MB_OK ); return FALSE; } // ab hier wirds interessant !!! *pdwLength = mmData.cksize; *ppbyWData = (PBYTE)malloc(*pdwLength); if( !ppbyWData ){ MessageBox( m_hWnd, "WaveData:malloc failed !!", NULL, MB_OK ); return FALSE; } ZeroMemory(*ppbyWData, *pdwLength ); mmResult = mmioRead( hmmio, (HPSTR)*ppbyWData, *pdwLength); if( FAILED(mmResult) ){ MessageBox( m_hWnd, "WaveData:mmioRead failed !!", NULL, MB_OK ); return FALSE; } return TRUE; }
vielleicht hilf das weiter
grüsse