IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MFC Discussion :

[vfw] Copy du flux audio.


Sujet :

MFC

  1. #1
    Membre averti Avatar de Flo.
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2002
    Messages : 379
    Points : 404
    Points
    404
    Par défaut [vfw] Copy du flux audio.
    Bonjour,

    je travaille sur une petite appli qui prend une vidéo (avi) en entrée et produit une vidéo (avi) aux mêmes caractéristique (frame rate, dimensions, etc, etc) en utilisant vfw.

    Cette appli doit juste modifier chacune des images de la vidéo d'entrée. Donc pour la création du flux vidéo aucun problème : la vidéo en sortie est la copie conforme de la vidéo en entrée (avec un traitement sur chaque image).

    Par contre je bute sur le transfert du flux audio de la vidéo en entrée a la video en sortie : je veux le transférer sans aucune modification.

    J'ai essayé avec AVIStreamRead et AVIStreamWrite mais le mieux que j'arrive à produire est un flux audio incompréhensible.

    Alors je voudrais savoir si je pouvais plutot utiliser la fonction EditStreamClone pour cloner le flux audio et comment m'y prendre ; j'avoue que les exemples et les explications sont rares sur la toile.

    J'ai produit ce code là :

    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
    bool CopyAudioStream(PAVISTREAM & audioStream)
    {
            PAVISTREAM newstream;
     
            // creation of an editable stream
            if(CreateEditableStream(&newstream , audioStream))
            {
                    ShowMessage("Error with CreateEditableStream");
            }
     
            // clone the audio stream
            if(EditStreamClone(audioStream, &newstream))
            {
                    ShowMessage("Error with EditStreamClone");
            }
     
             // ........... Intégrer le nouveau PAVISTREAM au PAVIFILE de la video de sortie
     
            // close the new audio stream                
            AVIStreamRelease(newstream);
    }
    ou audioStream est le PAVISTREAM du flux audio de la video source.

    Cependant la fonction EditStreamClone me renvoie une erreur à l'exécution.

    Par ailleurs comment ensuite intégrer le PAVISTREAM cloné dans le PAVIFILE de la video de sortie ?

    Si quelqu'un ayant déjà utilisé "EditStreamClone" peut m'aider .

    Merci.

    Flo.

  2. #2
    Membre averti Avatar de Flo.
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2002
    Messages : 379
    Points : 404
    Points
    404
    Par défaut
    Salut,

    sinon, je mets mon code avec AVIStreamRead et AVIStreamWrite ; j'aime pas mettre de gros "patés" mais là je galère vraiment :

    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    bool CopyAudioStream(PAVISTREAM & audioStream)
    {
            // the new audio stream
            PAVISTREAM newstream;
     
            // to get infos on the audio stream to copy
            AVISTREAMINFO avi_stream_info;
     
            // get infos about the audio stream to copy
            if(AVIStreamInfo(audioStream, &avi_stream_info, sizeof(AVISTREAMINFO)))
            {
                    ShowMessage("Error with AVIStreamInfo");
            }
     
            // get the first sample number
            int audioSrcStreamStart = AVIStreamStart(audioStream);
     
            // get the last sample number
            int audioSrcStreamStop = AVIStreamEnd(audioStream);
     
            // to memorize the wave infos of the audio stream to copy
            WAVEFORMATEX wave;
     
            LONG lStreamSize;
     
            // get the size of the WAVEFORMATEX
            if(AVIStreamReadFormat(audioStream, audioSrcStreamStart, NULL, &lStreamSize))
            {
                    ShowMessage("Error with AVIStreamReadFormat (0)");
            }
     
            // get the wave infos of the audio stream to copy
            if(AVIStreamReadFormat(audioStream, audioSrcStreamStart, &wave, &lStreamSize))
            {
                    ShowMessage("Error with AVIStreamReadFormat (1)");
            }
     
            // create the new audio stream int the PAVIFILE avi
            if(AVIFileCreateStream(this->avi, &newstream, &avi_stream_info))
            {
                    ShowMessage("Error with AVIFileCreateStream");
            }
     
            // set the same wave format than the audio stream to copy
            if(AVIStreamSetFormat(newstream, 0, &wave, sizeof(wave)))
            {
                    ShowMessage("Error with AVIStreamSetFormat");
            }
     
            //Copie byte par byte
            for(int i = audioSrcStreamStart; i < audioSrcStreamStop; i++)
            {
                    long numberOfBytesReaden = 0;
     
                    // get the size (in bytes) of the next sample to copy
                    if(AVIStreamRead(audioStream, i, 1, NULL, 0, &numberOfBytesReaden, 0))
                    {
                            ShowMessage("Error with AVIStreamRead (0)");
                    }
     
                    // create the frame to receive the frame bytes from the audio stream to copy
                    unsigned char * frame = new unsigned char[numberOfBytesReaden];
     
                    // save the current audio stream sample to the buffer frame
                    if(AVIStreamRead(audioStream, i, 1, frame, numberOfBytesReaden, 0, 0))
                    {
                            ShowMessage("Error with AVIStreamRead (1)");
                    }
     
                    // verification if the current sample is a key frame
                    if(AVIStreamIsKeyFrame(audioStream, i))
                    {
                            // write it in the audio stream destination as a key frame
                            if(AVIStreamWrite(newstream, i - audioSrcStreamStart, 1, frame, numberOfBytesReaden, AVIIF_KEYFRAME, 0, 0))
                            {
                                    ShowMessage("Error with AVIStreamWrite (0)");
                            }
                    }
                    // else write it in the audio stream destination as a basic frame
                    else if(AVIStreamWrite(newstream, i - audioSrcStreamStart, 1, frame, numberOfBytesReaden, AVIIF_KEYFRAME, 0, 0))
                    {
                            ShowMessage("Error with AVIStreamWrite (1)");
                    }
     
                    // delete the buffer
                    delete [] frame;
            }
     
            // release the created audio stream
            AVIStreamRelease(newstream);
    }
    Ce code ne marche pas : au lieu de la bande son normale, j'ai du bruit sonore entrecoupé de quelques passages rares bons.

    Pour finir, je tiens à préciser que je crée un PAVIFILE, que je créé ensuite un PAVISTREAM video dans lequel je copie avec succés les images de la video source. Une fois tout le flux video copié (et non fermé ... j'ai pas encore appellé AVIStreamRelease pour fermer le flux video), je créé le PAVISTREAM audio dans lequel j'essaie de copier le flux audio de la video d'entrée.

    Merci pour les courageux ...

    Flo.

  3. #3
    Membre averti Avatar de Flo.
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2002
    Messages : 379
    Points : 404
    Points
    404
    Par défaut
    Bon, sinon revenons à quelque chose de plus simple peut-être

    Est-ce que quelqu'un sait comment utiliser "EditStreamClone" et me l'enseigner ?

    Faut-il fermer le nouveau flux video créé avant de créer le nouveau flux audio ?

    Merci.

    Flo.

  4. #4
    Membre averti Avatar de Flo.
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2002
    Messages : 379
    Points : 404
    Points
    404
    Par défaut
    Bonjour,

    (je sais pas si ça se fait de demander ça), mais s'il était possible de déplacer ce post dans le forum de Borland c++ Builder, histoire d'y tenter ma chance là-bas, ça pourrait m'aider car j'y ai vu des posts au sujet de vfw.

    Merci.

    Flo.

Discussions similaires

  1. Rupture de flux audio et reconnexion automatique
    Par LarabNain dans le forum Flash
    Réponses: 3
    Dernier message: 29/06/2009, 11h42
  2. Flux audio WMP
    Par hiko-seijuro dans le forum MFC
    Réponses: 18
    Dernier message: 05/05/2006, 10h07
  3. Flux Audio
    Par getthematrix dans le forum MFC
    Réponses: 3
    Dernier message: 03/11/2005, 21h01
  4. Envoi d'un flux audio entre 2 PC
    Par TheDarkLewis dans le forum Windows
    Réponses: 2
    Dernier message: 30/08/2004, 02h02
  5. Acquerir un flux audio
    Par The Cyber Lewis dans le forum DirectX
    Réponses: 1
    Dernier message: 05/04/2004, 14h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo