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

C++ Discussion :

compression de paquets d'images en MPEG-4


Sujet :

C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 14
    Par défaut compression de paquets d'images en MPEG-4
    Bonjour à tous!

    Je suis programmeur C++ professionnel, développant sous Windows XP, avec le compilateur Microsoft Visual Studio .NET 2003, des applications MFC.
    Pour mon travail, j'ai besoin de l'aide d'experts. Je vous explique ce que je dois faire :
    Compresser des images au format AVI RAW (images brutes, totalement décompressées) et si possible une piste audio au format WAVE en un seul "film" de type MPEG-4, lisible par tous les lecteurs multimédia, notamment le lecteur Windows Media Player.
    Pourquoi ne pas rester en AVI RAW me diriez-vous? Parce que d'une part, un client m'a demandé de lui sortir du MPEG-4, et d'autre part, parce que l'AVI RAW impose une limite de 4Go sur les fichiers, ce qui fait qu'avec un film de 20 minutes, vous vous retrouvez avec 10 fichiers de 4Go environ !!! De plus, les fichiers AVI RAW générés ne possèdent que la vidéo (l'audio n'a pas été intégrée).

    J'ai beaucoup de questions à poser et qui nécessitent bien des réponses :
    -> La solution facile serait d'inclure dans le code source du logiciel qui doit faire cela, des librairies (payantes ou gratuites) contenant des fonctions me permettant, par exemple, de passer en entrée une image ou des images stockées dans un buffer, et récupérer en sortie un buffer où l'/les image(s) seraient stockées en MPEG-4.
    En connaissez-vous? Est-ce possible? Où pourrais-je trouver ce genre d'outils, et surtout compatible avec à la fois le compilateur et l'O.S.que j'utilise?
    -> Si ce n'est pas possible, comment faire pour obtenir du MPEG-4 à l'arrivée?
    -> Faut-il "absolument" passer par des programmes existants et indépendants, qui permettent de réunir une piste audio et une piste vidéo (ou plusieurs) pour arriver à ce fameux MPEG-4 en sortie?


    Comme vous le voyez, je suis un peu dans l'attente de réponses.
    Je me tiens disponible si vous avez besoin de plus de précisions quand à ma demande.

    Merci d'avance à vous tous!

    Cordialement.


    clad83

  2. #2
    Membre extrêmement actif

    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 402
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 402
    Par défaut
    bonjour,

    déjà il faut savoir quel type de conteneur utiliser, à part le .avi, je ne sais plus quel conteneur est gérer de base par wmp sous xp.

    ensuite pour encoder et multiplexer le tout avec des apis, il y a soit DirectShow, techno incluse dans windows, pas super facile d'utilisation selon moi, il faut aussi que les bons filtres soient présent; ou il y a FFMpeg plus facile d'utilisation mais catastrophique à compiler, mais n'a pas de prérequis sur les éléments présents sur la machine.

    il doit y avoir quelques composants vlc qui font ça aussi, mais je n'en sais pas plus.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 14
    Par défaut
    Bonjour,

    Si je comprends bien, je vais devoir stocker mes images dans un conteneur vidéo autre que l'avi (par exemple du .wmv pour Windows Media Video ou directement en .mpg/.mpeg qui est un conteneur défini par le Moving Picture Experts Group) ?
    Ensuite, concernant les fonctions à utiliser pour programmer, quand vous parlez de DirectShow, vous voulez parler de quoi exactement? C'est une bibliothèque de Windows XP? Sinon, j'ai fait un tour sur FFMpeg, et il faut, d'après moi, inclure bon nombre de librairies telles que libavformat, libavutil, libavcodec, n'est-ce pas?

    Merci pour votre aide.

    Cordialement.

  4. #4
    Membre extrêmement actif

    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 402
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 402
    Par défaut
    pour le avi tu peux t'en servir, vu que le player de xp le gère, je disais juste que si tu en choisis un autre il faut d'abord vérifier la compatibilité.
    donc ok pour le avi.

    DirectShow est une techno Microsoft incluse à l'origine dans le sdk directx, maintenant elle est dans le windows sdk.
    c'est une techno ce basant sur un "montage" de graph pour décoder ou encoder des flux.

    concernant FFMpeg, effectivement il y a plein de bibliothèques.

    j'avais des exemples sous la main, je regarderai si je les trouve, mais je pense qu'il doit y avoir suffisamment de samples sur internet pour tout ça.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 14
    Par défaut
    Je conserve donc le conteneur "avi", dans lequel je vais compresser une vidéo de type "mp4", et inclure une audio de type "wave"... Ce qui importe c'est une compression assez efficace des 2 médias puisque le désavantage de l'avi, c'est sa fameuse limite à 4Go (pour gérer les anciens types de fichiers FAT32, si je ne m'abuse!).

    Je viens de jeter un oeil rapide dans le msdn de Windows, aux rubriques "DirectShow" et "Media Fundation" (successeur du DirectShow sur les plates-formes Vista et Seven). Il y a beaucoup plus d'API et de fonctions utiles dans le Media Fundation, le hic c'est qu'il faut, je pense, coder sous Windows 7, voire même dans un compilo un peu plus récent que le mien. La plupart des librairies à inclure sont dans le Windows SDK (Software Development Kit), et nécessitent un équipement minimal de Vista, voire Seven

    Pensez-vous que je puisse tout de même les intégrer dans un Windows XP SP3 mis à jour, et les utiliser dans le compilo Windows Visual Studio 2003 ?

    Et, en deuxième question, pour DirectShow, êtes-vous certain que l'on puisse encoder en MPEG-4? J'ai remarqué qu'ils parlaient beaucoup du MPEG-2... et surtout qu'il faille un peu tout créer soi-même (graphe de filtres etc.), comme vous me l'avez stipulé précédemment!!! Autant dire que c'est beaucoup plus long et difficile à prendre en mains! :'(


    Bien qu'Internet soit une ressource sans fin, je serai tout de même preneur de vos samples, si vous les retrouvez et que vous n'y voyez aucun inconvénient! Cela me permettrait de mieux appréhender certaines choses...

    Merci beaucoup pour votre aide.
    Cordialement.


    Julien

  6. #6
    Membre extrêmement actif

    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 402
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 402
    Par défaut
    je doute que les technos de vista et 7 marchent sous xp.

    et oui avec DirectShow, il faut tout faire, c'est pas le plus évident, mais c'est inclus dans xp, pas de surprise de ce coté là.
    concernant les formats gérés par celui-ci, il faut juste que les filtres correspondants soient installé sur la machine.

    c'est pour ça que j'ai émis les possibilités de FFMpeg et vlc, qui eux sont normalement assez voir totalement indépendants.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 14
    Par défaut
    Citation Envoyé par stardeath Voir le message
    il faut juste que les filtres correspondants soient installé sur la machine.
    Que voulez-vous dire par ceci?
    Que doit-on installer?

    Merci.

  8. #8
    Membre extrêmement actif

    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 402
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 402
    Par défaut
    les filtres que je parle sont simplement les codecs pour les formats que l'on veut gérer; le terme filtre est plus associé à DirectShow que le terme codec.

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 14
    Par défaut
    D'accord je comprends bien ce que vous voulez dire.

    Je souhaitais vous faire part d'une nouvelle décision : coder sous Windows 7 x64 pour pouvoir utiliser les "Windows Media Fundation". Je vais donc installer également le SDK for Windows 7 incluant les librairies me permettant de les utiliser. Ainsi, avec les fonctions/structures/APIs livrées par Windows, je pense pouvoir me débrouiller plus facilement.

    Seule interrogation : vais-je pouvoir compiler tout cela dans mon compilo VS2003?!

    Je vous tiens au courant de mes avancées, et si j'ai encore d'autre questions à propos de WMF!

    Cordialement.


    Julien

  10. #10
    Membre extrêmement actif

    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 402
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 402
    Par défaut
    je ne pense pas que vs2003 soit supporté par les nouvelles versions des différents sdk de windows.

  11. #11
    Membre chevronné Avatar de themadmax
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    446
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 446
    Par défaut
    Salut,

    Je suis aussi codeur pro dans le milieu de la vidéo sous Windows. Pour l'enregistrement on utilise depuis des années VFW, qui est une libraire inclue dans Windows qui te permet de créer des AVI, et de compresser des videos avec les codec VFW installé sur la machine. Cette lib vieillissante à une limitation sur la taille des fichiers, pour cela il existe DirectShow. DirectShow est outil COM inclus aujourd'hui dans le SDK de Windows. Bien que très différant de VFW, il est assez facile d'accès surtout grace a l'application GraphEdit qui te permet de concevoir des Graph pour prototyper ton application.
    D'autre possibilité sont aussi possible, comme d'écrire toi même le code d’écriture des fichiers AVI/RIFF, comme dans le logiciel VirtualDub.
    Libavcodec/Libavformat sont aussi deux libraires du monde libre, provenant de la superbe application FFMPEG, et aussi utilisé dans VLC. Ces libraires sont complétement indépendant de l'OS, pas besoin d'installé des CODECs.

    Dans la vidéo le conteneur est assez mal compris, en effet AVI est juste un conteneur qui permet comme un train de marchandise tout type de contenu.
    Le format AVI, en gros est un empilage de bloque d'image, suivit d'une liste d'index. Son avantage est qui est supporté par la plupart des systèmes, mais pas fait pour le streaming, et l’écriture d'index oblige un deuxième passage en clôture de fichier.
    Le MPEG4 est un standard qui spécifie un conteneur de fichier mais aussi un type d'encodage. Le conteneur MP4 est plus orienté streaming, et ne contient pas à ma connaissance d'index sur le fichier.

    Le deuxième choix est celui du CODEC utilisé, personnellement nous utilisons le CODEC xvid qui a l'avantage d’être libre et assez performant.

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 14
    Par défaut
    Bonjour,

    @ stardeath : Ayant testé, je confirme qu'il n'est pas possible de compiler les librairies et headers fournis dans le SDK 7.1 avec un VS 2003 ! J'ai testé en incluant seulement le "mfapi.h" : pose déjà des problèmes avec ce compilo. J'ai fait la contre-manip en installant et utilisant le VS2010 : include de "mfapi.h" ainsi que d'autres du pack SDK, et là aucun problème, tout compile parfaitement !

    @ themadmax : Je compte m'orienter vers l'utilisation de Windows Media Foundation pour l'encodage vidéo, sous Windows Seven Pro x64, ainsi que du compilo VS2010 (qui me permet d'inclure les fameuses librairies du SDK 7.1).
    Mon but serait d'encoder un flux d'images AVI RAW (décompressées RGB 24 bits) en MPEG-4 via un codec H264, par exemple. Puis, rajouter une piste audio de type WAVE, encodée en AAC. Entrelacer le tout, puis stocker cela dans un conteneur AVI, pour rejouer dans Windows Media Player, ou tout autre lecteur média de ce type.
    Qu'en pensez-vous? Cela vous paraît cohérent?
    Sinon, avec XVid, comment faîtes-vous? Vous incluez quelques headers puis utilisez des APIs? J'aurais bien aimé avoir une piste de ce côté là au cas où je ne m'en sors pas avec les Media Foundation...

    Merci d'avance.

    cdlt.


    Julien

  13. #13
    Membre chevronné Avatar de themadmax
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    446
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 446
    Par défaut
    Je ne maitrise pas Windows Media Foundation, donc pas d'avis dessus.
    Pour le H264 c'est un encodage très performant, mais aussi gourmand certain harware peuvent aider, pour ce qui est de la licence il me semble qu'elle est gratuite pour le moment mais pas à long terme.
    Pour la relecture dans Windows Media Player, j'ai fait un test mais même avec FFDSHOW il a pas l'air d'etre lue correctement.

    Pour l'utilisation de dshow, si tu as un SDK windows pas trop vieux utilise l'application graphedit. Tu peux faire un graph de ce genre la :

    Le fichier d'entrée est un AVI dit "raw", le fichier de sortie un AVI xvid.

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 14
    Par défaut
    J'ai un SDK 7.1 (for Windows 7).

    Tout cela se fait de cette manière? Pas besoin de coder en C/C++ dans le compilo? :o Et comment faire comprendre à cette application que vous utilisez un XVid? Vous devez inclure des choses ou tout est contenu dans la base de données?

    D'après votre graphe, j'en déduis qu'avec un flux vidéo AVI RAW décompressé RGB 24bits en entrée,j'obtiens en sortie un fichier .avi dont la vidéo incluse est encodée XVid MPEG-4...
    En revanche, est-ce possible d'inclure une piste audio de type WAVE en entrée, de la faire passer dans un encodeur (type AAC, voire WMA) puis de la faire passer dans une brique "MUX Audio", du même style que celle que vous utilisez, nommée "AVI Mux", puis de l'inclure dans le fichier d'output .avi ?

    Résumé : Piste Audio (WAVE) -> Encodeur -> Audio MUX -> Stockage dans conteneur .avi



    Merci pour vos réponses!

    Cdlt.

  15. #15
    Membre chevronné Avatar de themadmax
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    446
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 446
    Par défaut
    Tout cela se fait de cette manière? Pas besoin de coder en C/C++ dans le compilo?
    GraphEdit est seulement un outil de prototypage, en théorie il est possible de charger un graph directement dans le programme mais j'y crois pas trop. Il va donc falloir codé tout cela à la mano, DShow c'est du COM, et de multiple exemple existe sur la toile.
    Et comment faire comprendre à cette application que vous utilisez un XVid? Vous devez inclure des choses ou tout est contenu dans la base de données?
    La brique "Xvid MPEG-4 Codec" ajouter dans le graph se charge de la compression du flux vidéo, elle est présent sur le système si le codec XVID est correctement installé.
    En revanche, est-ce possible d'inclure une piste audio de type WAVE en entrée, de la faire passer dans un encodeur (type AAC, voire WMA) puis de la faire passer dans une brique "MUX Audio", du même style que celle que vous utilisez, nommée "AVI Mux", puis de l'inclure dans le fichier d'output .avi ?
    Pour ce qui est de l'audio, il me semble qu'il suffit d'ajouter un flux qui rentre dans l'AVI Mux, avec possibilité d'ajouté un compresseur. Mais profite de l’existence de GraphEdit pour te faire la main.

  16. #16
    Membre chevronné 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
    Par défaut
    Salut,

    moi je bosse avec FFMPEG sous Ubuntu et Windows XP et tout se passe bien. A noter que je ne travaille qu'avec des flux vidéos.

    Il n'y a pas forcément besoin de compiler la librairie. On trouve toutes ses déclinaisons ici :

    http://ffmpeg.zeranoe.com/builds/

    Ce qui manque beaucoup avec FFMPEG c'est une couche C++ et une documentation. Auparavant j'utilisais VFW et du coup je n'ai pas été trop dépaysé : c'est un peu la même philosophie de programmation. On remplit des structures, on passe ça à des fonctions et hop c'est parti. Tout ce fait relativement dans le même ordre (stream, codecs, picture, blabla ...)

    DirectShow je ne connais pas.

    Mon avis est que FFMPEG est très puissant, multi OS, pas besoin d'installer de codecs car il se suffit à lui même. Mais il manque réellement d'un bon coup de peinture. Un peu ce qu'est OpenCV 2.0 à OpenCV 1.0. Une bonne vraie couche C++.

    Après j'y connais pas grand chose à tout ça non plus

    Je ne sais pas non plus si je réponds à la question.

    Flo.

  17. #17
    Membre chevronné Avatar de themadmax
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    446
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 446
    Par défaut
    FFMPEG est une très bonne librairie qui faut le rappeler initié par Fabrice Bellard. Le problème est l'utilisation dans le milieu pro, car si la licence de FFMPEG est LGPL, il existe des dépendance GPL. Mais je ne suis pas un expert en licence open source.

  18. #18
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 14
    Par défaut
    Bonjour,

    @ themadmax : j'utiliserai cette solution de GrapheEdit (avec DShow) en dernier recours. Actuellement, j'explore la piste Windows Media Fundation, avec création d'un SinkWriter. A noter que maintenant, je vais utiliser Win 7 Pro x64 et un compilo VS2010...

    @ Flo : C'est vrai que FFMpeg à l'air rebutant au premier abord, perso, ça ne m'a pas donné envie de l'utiliser (surtout qu'il faille en plus intégrer des librairies telles que libavformat, libavutil, libavcodec...). Pourtant c'est un outil qui semble très puissant. En revanche, comme vous l'avez souligné, est-ce possible d'encoder également une piste audio et l'intégrer au conteneur qui possède déjà la vidéo ?

  19. #19
    Membre chevronné 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
    Par défaut
    En revanche, comme vous l'avez souligné, est-ce possible d'encoder également une piste audio et l'intégrer au conteneur qui possède déjà la vidéo ?
    Je pense que oui. Il suffit de créer un fichier avec une copie du flux vidéo et de rajouter le flux audio à intégrer.

    Pour apprendre à utiliser ffmpeg, il y a des tutoriaux qui sont intéressants :

    http://www.inb.uni-luebeck.de/~boehm...ibavcodec.html
    http://dranger.com/ffmpeg/tutorial01.html

    Le 2ième est signalé comme un peu passé de date mais une bonne grosse partie reste bonne à prendre.

    Après, quelque soit la librairie utilisée, il me semble qu'il y a moyen de se faciliter le travail en écrivant un objet spécifique à son besoin, c'est à dire en faisant des choix et en se concentrant sur ces choix-là. (encoder des images dans tel format, tel codec, tel espace de couleur, etc, etc..).

    Ce qui est difficile (et je sais de quoi je parle au moins pour ffmpeg !) c'est de faire un objet capable de tout faire, à partir de tout et n'importe quoi pour donner tout et n'importe quoi sachant que formats et codecs ont tous des spécificités qu'il faut prendre en compte, etc, etc.

    Et je pense que quelque soit la librairie avec un tutoriel, quelques exemples et un simili de doc, on peut faire ce fameux objet qui sera limité mais qui fera le boulot.

    Le sage a parlé Hugh

    Flo.

  20. #20
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 14
    Par défaut
    Oui, je pense que vous avez raison. Pour mon cas, il ne s'agit pas de créer un convertisseur comme il en existe beaucoup dans le commerce (payants ou gratuits) gérant 30 formats vidéo et 30 formats audio en entrée pour obtenir 150 formats différents en sortie au vue de toutes les combinaisons possibles et imaginables!
    Juste faire un petit objet convertissant de l'avi raw + piste audio wave => conteneur avi contenant les trames vidéos mpeg-4 synchronisées avec de l'audio, c'est tout^^

    Je garde sous la main vos liens au cas où, car comme je l'ai signalé précédemment, je me suis réorienté vers les Windows Media Foundation (création d'un SinkWriter, voir tuto sur le post précédent).
    Je tiendrai la communauté informée de mes trouvailles, si ça peut intéresser d'autres personnes!

    Et puis, qui sait, avec toutes ces recherches, il n'est pas impossible qu'il me faille encore un peu d'aide

    A plus tard!

    Cdlt.


    Julien

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [imwrite] Compression JPEG2000 d'une image .png
    Par eragon4992 dans le forum Images
    Réponses: 16
    Dernier message: 20/03/2015, 11h16
  2. Compression RLE d'une image
    Par D1ablO dans le forum C
    Réponses: 1
    Dernier message: 19/11/2011, 19h54
  3. Réponses: 13
    Dernier message: 28/02/2010, 22h43
  4. Compression DCT sur une image bitmap
    Par Supr3M dans le forum C
    Réponses: 8
    Dernier message: 13/01/2010, 19h29
  5. Compresser et retailler une image jpg à l'upload
    Par alltec dans le forum Imagerie
    Réponses: 6
    Dernier message: 23/01/2007, 17h32

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