Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Récupération du son d'un fichier AVI

4 réponses
Avatar
ChP
Bonjour à toutes et à tous,

Je souhaite développer (DELPHI 6) ne petite application qui, à partir
d'un fichier AVI en fabrique un autre mais dans lequel j'ai fait tourner
de 90° les images.

J'utilise pour cela les fonctions de l'API "AVIFile32.dll".

En ce qui concerne la vidéo, j'ai réussi. Mon problème est que je
n'arrive pas (je ne sais pas comment m'y prendre) à extraire la partie
son du fichier d'origine pour la placer dans le fichier de sortie.

Si vous avez une expérience ou des exemples à me donner ...

Merci de votre aide.

Pierre

4 réponses

Avatar
Christian ASTOR
ChP wrote:

En ce qui concerne la vidéo, j'ai réussi. Mon problème est que je
n'arrive pas (je ne sais pas comment m'y prendre) à extraire la partie
son du fichier d'origine pour la placer dans le fichier de sortie.



AVIFileGetStream()
Avatar
ChP
Christian ASTOR a écrit :
ChP wrote:

En ce qui concerne la vidéo, j'ai réussi. Mon problème est que je
n'arrive pas (je ne sais pas comment m'y prendre) à extraire la partie
son du fichier d'origine pour la placer dans le fichier de sortie.



AVIFileGetStream()



Effectivement, j'en suis passé par là et cela fonctionne pour
l'extraction. J'ai :

AVIFileOpen(PtrAVI, Pchar(Filename), OF_READ, nil); {Ouvre le fichier}
AVIFileInfo(PtrAVI, FInfos, SizeOf(TAVIFileInfo)); {Infos sur fichier}
AVIFILEGetStream(PtrAVI, PtrVideo, streamtypeVIDEO, 0); {Flux Vidéo}
AVIFILEGetStream(PtrAVI, PtrAudio, streamtypeAUDIO, 0); {Flux Audio}
...
for N:= 0 to NbTrame do {Récup Vidéo}
AVIStreamGetFrame(ObjFrame, Frame);
....
{Lecture Flux Audio}
AVIStreamRead(PtrAudio, 0, Len, @MemSon[0], Len, @SizeSon, @SizeFrame);

Mon problème est maintenant de placer ce flux audio dans le fichier de
sortie :

AVIFileOpen(AVIFile,@Name[1],OF_CREATE or OF_WRITE,nil);{Créé fichier S}
...
AVIFileCreateStream(AVIFile, AVIStream, AVIStreamInfo); {Flux vidéo}
...
AVIStreamSetFormat(CompStream,0,@bmiHeader,SizeOf(TBitmapInfoHeader));
...
for N:= 0 to NbTrame do (Ecriture flux vidéo}
AVIStreamSetFormat(CompStream,0,@bmiHeader,SizeOf(TBitmapInfoHeader));
...
{Ecriture du flux Audio}
AVIFileCreateStream(AVIFile, PtrSon, InfosSon);
with WaveStruc do
begin
wFormatTag:= 0;
nChannels:= 1;
nSamplesPerSec:= 7830 ;
nAvgBytesPerSec:= 15600;
nBlockAlign:= 2;
end;
Err1:= AVIStreamSetFormat(PtrSon, 0, @WaveStruc, SizeOf(TWaveStruc));
Err2:= AVIStreamWrite(PtrSon, 0, 1, @BandeSon[0], Length(BandeSon),
0, @NbS, @NbB);

Dans l'écriture du flux Audio, si je ne place pas l'instruction
"AVIStreamSetFormat" --> "AVIStreamWrite" plante. Si je place
l'instruction "AVIStreamSetFormat" --> "AVIStreamWrite" ne plante plus
mais pour autant, le fichier résultant n'e comporte pas de son.

Par ailleurs, quelle est l'instruction qui permet de récupérer la
structure "WAVEFORMAT" ou "WAVEFORMATEX".

Merci de votre aide.

Pierre
Avatar
Christian ASTOR
ChP wrote:

Mon problème est maintenant de placer ce flux audio dans le fichier de
sortie :



AVISaveV()
Avatar
ChP
Christian ASTOR a écrit :
ChP wrote:

Mon problème est maintenant de placer ce flux audio dans le fichier de
sortie :



AVISaveV()


C'est un autre manière de fermer le fichier.

En fait, le problème venait du fait que j'utilisais la structure
WAVEFORMAT au lieu de WAVEFORMATEX qui définit en plus le nombre de bits
de codage du son.

Merci quand même.

Pierre