Parameterstreitigkeit bei PCM-Audio
-
Hallo alle miteinander.
Ich habe mir einen Audio-Konverter geschrieben, der normale PCM Daten in MP3 Daten umwandelt. Das klappt auch hervorragend, solange es eine PCM Datei mit 16 kHz und 16 Bit ist. Wenn ich allerdings eine PCM Datei mit 8 kHz und 16 Bit habe, dann liefert er mir unten beim lRet (Kontrollwert) 32. Was eigentlich mit Einbeziehung der Flags auf eine bereits verwendete Datei hinweist. Da die Datei erstellt wird, ist das aber nicht möglich. Zu mal er das bei 16 - 16 auch macht. Hat von euch noch jemand zufällig eine Idee?
Ich bedanke mich schon mal im vorraus.
int main(int argc, char* argv[]) { if (3 != argc) return 1; // argv[1] <input> if (!IsFile(argv[1])) return 2; // argv[2] <output> //if (!IsFile(argv[7])) return 2; // commandline ok - continue // open inputfile CWaveFile wfin; DWORD dwFlags = MMIO_READ; long lRet = wfin.Open(argv[1], dwFlags, NULL); if (SK_OK == lRet) { LPWAVEFORMATEX pwfx = wfin.GetWaveFormat(); if (pwfx) { // open outputfile MPEGLAYER3WAVEFORMAT mwf; memset(&mwf, 0, sizeof(MPEGLAYER3WAVEFORMAT)); mwf.wfx.wFormatTag = WAVE_FORMAT_MPEGLAYER3; mwf.wfx.nChannels = pwfx->nChannels; mwf.wfx.nSamplesPerSec = pwfx->nSamplesPerSec; mwf.wfx.nAvgBytesPerSec = 4000; /// http://support.microsoft.com/kb/152180/de *** 56 kBit Stereo MP3 : 7000, 48 kBit Stereo MP3 : 6000 .... in 1000 er Schritte runter mwf.wfx.nBlockAlign = 1; mwf.wfx.wBitsPerSample = 0; mwf.wfx.cbSize = MPEGLAYER3_WFX_EXTRA_BYTES; mwf.wID = MPEGLAYER3_ID_MPEG; mwf.fdwFlags = MPEGLAYER3_FLAG_PADDING_OFF; mwf.nBlockSize = (WORD)((mwf.wfx.nAvgBytesPerSec * 576) / pwfx->nSamplesPerSec);/// Frame Size = ( (Samples Per Frame / 8 * Bitrate) / Sampling Rate) + Padding Size *** 56 kBit Stereo MP3 : 252, 48 kBit Stereo MP3 : 216 .... in 36 er Schritte runter mwf.nFramesPerBlock = 1; mwf.nCodecDelay = 1393; /// nCodecDelay von FhG codec [http://dotnetfire.com/news.aspx?newsID=131183] CWaveFile wfout; dwFlags = MMIO_CREATE | MMIO_WRITE; lRet = wfout.Open(argv[2], dwFlags, (LPWAVEFORMATEX)&mwf); if (SK_OK == lRet)
-
schonmal was vom "debugger" gehört?
guck wo die 32 herkommt, dann weisst du vermutlich auch was sie bedeutet.