2010-08-26 8 views
1

J'ai un fichier audio brut capturé à partir d'une caméra au format U-law mono 8KHZ (pas d'en-têtes wav). Le problème que je rencontre est que lorsque j'essaie de lire le fichier, il semble que je reçois un mauvais bruit. J'ai branché l'audio brut à travers un programme appelé goldwave, et il est capable de lire le fichier parfaitement. Je suis sûr que je manque juste quelque chose de simple.impossible de lire le fichier audio brut

J'ai essayé d'utiliser les fonctions de waveout mais sans chance. Dois-je d'abord décoder les données de la loi avant d'essayer de les faire passer à travers les fonctions de waveout?

+0

Quels extensions de fichiers utilisez-vous? Comment jouez-vous vos fichiers? Vous pourriez manquer un codec, ou ne pas donner assez d'informations à la couche audio de Windows pour sélectionner le bon codec. –

Répondre

0

Si vous êtes juste à l'aide des fonctions waveout dans l'API Windows, le troisième paramètre à waveOutOpen est un pointeur vers une structure WAVEFORMATEX:

MMRESULT waveOutOpen(
    LPHWAVEOUT phwo, 
    UINT_PTR uDeviceID, 
    LPWAVEFORMATEX pwfx, 
    DWORD_PTR dwCallback, 
    DWORD_PTR dwCallbackInstance, 
    DWORD fdwOpen 
); 

Structure WAVEFORMATEX vous permet de spécifier le format, et Windows devrait être capable de faire u-Law sans avoir besoin d'installer quoi que ce soit.

typedef struct { 
    WORD wFormatTag; 
    WORD nChannels; 
    DWORD nSamplesPerSec; 
    DWORD nAvgBytesPerSec; 
    WORD nBlockAlign; 
    WORD wBitsPerSample; 
    WORD cbSize; 
}WAVEFORMATEX; 

Set wFormatTag-WAVE_FORMAT_MULAW ou 0x0007. Assurez-vous de remplir correctement les autres paramètres pour 1 canal avec 8000 échantillons/s et 8 bits/échantillon.

En cas d'échec, veuillez écrire le code dans lequel vous ouvrez le périphérique audio et lisez le fichier. Ou voici une implémentation delphi de décodage u-loi sur PCM linéaire (ulawDecode) de sorte que vous pouvez décoder vous-même:

http://www.koders.com/delphi/fidEAA58384F59968FEDD0670F6EABF09DF3A5C58A5.aspx?s=algorithm#L19

+0

Merci d'avoir signalé cela. J'ai finalement réussi à jouer correctement. Le problème principal était que l'on m'a dit que c'était un peu 16 en droit, mais en fait c'était une loi en 8 bits. Une fois que j'ai mis cela en place comme vous l'avez mentionné, cela a bien fonctionné. – LomWoss

0

Oui. Les fonctions de waveout attendent un son non compressé et ce n'est pas ce que vous avez. Mais ulaw est presque PCM et c'est très facile à décoder. Une recherche rapide m'a conduit à la source C pour l'algorithme donc il est définitivement disponible, mais je n'ai pas trouvé de source pascal/delphi facilement. http://www.programmersheaven.com/download/3826/download.aspx est la version C. Il semble que traduire cela serait assez facile.

Questions connexes