2009-02-06 9 views
0

Pourquoi dois-je obtenir une sortie déformée si je convertir un fichier wav en utilisant libsox à:libsox encodage

&in->encoding.encoding = SOX_ENCODING_UNSIGNED; 
&in->encoding.bits_per_sample = 8; 

utilisant le code ci-dessus?

Le fichier d'entrée a bits_per_sample = 16.

+0

où puis-je obtenir cette suce sox fichiers source et comment ajouter au projet xCode pour iphone ??? – Biranchi

Répondre

0

Donc, vous dites que vous dites SOX de lire un fichier WAV exemple 16 bits comme un exemple de fichier 8 bits? Ne sachant rien sur SOX, je m'attendrais à ce qu'il lise chaque échantillon de 16 bits comme deux échantillons de 8 bits ... l'octet de poids fort et l'octet de poids faible comme ceci: ... HLHLHLHLHL ...

Pour simplifier, nous appellerons des échantillons «A» d'échantillons de poids fort. Les échantillons «A» transmettent le son original avec une gamme moins dynamique, car l'octet de poids faible avec la précision supplémentaire a été coupé.

Nous appellerons les échantillons d'octets de poids faible "échantillons B". Ceux-ci seront à peu près aléatoires et encoderont le bruit. Donc, en conséquence, nous aurons le son original, les échantillons «A», décalés de moitié en fréquence. C'est parce qu'il y a un échantillon 'B' entre chaque échantillon 'A' qui réduit de moitié le taux des échantillons 'A'. Les échantillons 'B' ajoutent du bruit au son original. Nous aurons donc le son original, décalé de moitié, avec du bruit.

Est-ce ce que vous entendez?

Édition Le client a indiqué que l'objectif est de convertir un fichier WAV en audio 8 bits. En lisant le manpage for SoX, il semble que SoX utilise toujours l'audio 32 bits en mémoire grâce à sox_read(). Le passage d'un format ne fera que tenter de lire de ce format.

Pour Downconvert en mémoire, utilisez SOX_SAMPLE_TO_SIGNED_8BIT ou de SOX_SAMPLE_TO_UNSIGNED_8BIT sox.h, à savoir:

sox_format_t ft = sox_open_read("/file/blah.wav", NULL, NULL); 
if(ft) { 
    sox_ssample_t buffer[100]; 
    sox_size_t amt = sox_read(ft, buffer, sizeof(buffer)); 
    char 8bitsample = SOX_SAMPLE_TO_SIGNED_8BIT(buffer[0], ft->clips); 
} 

pour produire un fichier downconvertis, utiliser le format 8 bits lors de l'écriture au lieu de la lecture.

+0

je veux le convertir en 8 bits par échantillon. comment je fais ça? –