2010-03-24 21 views
3

Je regarde généralement les bibliothèques audio intégrées de SoX ou de Windows pour ce genre de choses, mais il semble que ni les codecs G.726 ne le soient. Donc j'ai une séquence d'octets que je connais et qui est encodée en G.726 bien que le débit binaire et que ce soit la loi mu ou la loi A ne soit pas connu à ce moment (l'expérimentation va déterminer ces paramètres), et j'ai besoin de les décoder en un signal PCM normal.Comment convertir un signal ADPCM G.726 en un signal PCM?

J'ai donc téléchargé la mise en œuvre de référence de l'UIT-T (Recommandation UIT-T G.191), mais je suis un peu confus sur la façon d'utiliser la fonction G726_decode. Selon la documentation inp_buf et out_buf besoin d'avoir la même longueur smpno et les deux tampons sont des tampons de 16 bits. Cela me semble qu'une étape est manquante; sinon, aucune compression n'est effectuée en utilisant G.726. Selon la page Wikipedia sur G.726 la taille de l'échantillon dépend du débit binaire (de 2 à 5 bits). Suis-je censé faire la décompression en échantillons moi-même? Donc, si je suppose une compression maximale (échantillons de 2 bits) alors chaque octet produira 4 échantillons.

Exemple:

char b = /* read the code from input */ 
short inp[4], output[4]; 
inp[0] = b & 0x0003; 
inp[1] = b & 0x000C >> 2; 
inp[2] = (b & 0x0030) >> 4; 
inp[3] = (b & 0x00C0) >> 6; 
G726_state state; 
memset(&state, 0, sizeof(G726_state)); 
G726_decode(inp, output, 4, "u", 2, 1, &state); 
/* ouput now contains 4 PCM samples */ 

Ou suis-je manque quelque chose de complètement?

Répondre

5

On dirait que ffmpeg n'est pas en mesure de le faire, car je pensais que ce serait sûrement possible ... cependant, pendant que je recherchais Google, j'ai trouvé ce post to the ffmpeg mailing list qui offre une solution.

Fondamentalement, il existe un programme distinct appelé g72x++ qui semble être en mesure de décoder l'audio en PCM brut pour vous.