Bonjour,
Je suis en train de travailler sur des sounds .wav avec la librairie Libsndfile et j’ai un petit souci quand je veux extraire un bout de musique puis l’écrire dans un nouveau fichier.
Sur mon interface graphique, j’affiche un graphique du son et l’utilisateur fait sa sélection grâce à deux marqueurs.
Si on n’a pas déjà modifié le fichier original (audFile) on utilise le fichier temporaire (tempFile)
J'ai vérifier les variables en déboguant et les valeurs sont bonnes. sf_readf_short et sf_writef_short retournent le nombre de frames qu'elles lisent/écrivent et c'est correct.
Par contre, le résultat est finale est plus ou moins n'importe quoi, je me trouve avec un son d 800 000 frames pour une sélection d'environ 10 000 frames. Et la tête du graphique sortant n'est pas du tout ressemble à la sélection original.
voici un petit exemple en image,
Le son original :
Après le traitement :
Ma méthode :
J'ai l'impression que mon tableau "selection" ne se remplit pas avec les nouvelles valeurs. Mais je ne sais pas comment je pourrais vérifier ça.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32 /*Méthode pour tout supprimer sauf la selection. Les paramètres begin et end correspondent au début et à la fin de la sélection.*/ bool File::removeAllWithoutSelection(int begin, int end){ //Je créer le fichier qui recevra la selection tempFile = sf_open(("Temp\\"+getFileName()).c_str(),SFM_RDWR,&tempInfo); int size=(end-begin)*audInfo.channels; short selection[size]; //Je cherche quel fichier je dois utiliser if(useTemp && tempFile!=NULL){ //On se place au début de la sélection sf_seek(tempFile,begin,SEEK_SET); //On lit les données et on les mets dans le tableau "selection" sf_readf_short(tempFile,selection,size); } else if(!useTemp && audFile!=NULL){ sf_seek(audFile,begin,SEEK_SET); sf_readf_short(audFile,selection,size); } else{ sf_close(tempFile); return false; } //on écrit le tableau dans le fichier sf_writef_short(tempFile,&selection[0],size); sf_command(tempFile,SFC_UPDATE_HEADER_NOW,NULL,0); sf_close(tempFile); useTemp=true; return true; }
Merci d'avance
Bonne soirée
Olivier
Partager