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

DirectX Discussion :

Filtre DirectShow qui modifie le flux MPEG-2


Sujet :

DirectX

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2006
    Messages : 9
    Points : 1
    Points
    1
    Par défaut Filtre DirectShow qui modifie le flux MPEG-2
    Bonjour a tous,

    Je suis en travail de diplôme ingénieur je travail pour une société de diffusion DVB-C.

    Je travail sur Visual C ++ 2005 et je dois réaliser un filtre DirectShow qui doit analyser un flux Mpeg-2 et modifier les images I de ce flux.

    Mon problème est le suivant j’arrive à identifier les images I du flux avec un filtre que j’ai réaliser a partir du filtre NullInPlace du SDK 2004, Mais le problème est comment traiter le flux comment le modifier.

    Connaissiez-vous des codes de filtre exemple qui le font ou de la doc un peux plus digeste que MSDN.

    Merci d’avance

  2. #2
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2006
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    D’après mes recherches dans les samples du SDK de summer 2004 il n’y a pas d’exemple avec une modification du flux MPEG-2 ou autre format, tout ce qu’il y a c’est des exemples avec le filtre « Vidéo Mixing Rander » qui comme sont nom l’indique est un filtre de rendu qui mélange différent chose avec la vidéo comme du texte en BMP.

    La ce trouve mon problème vu que sans exemple de codes c’est impossible de réaliser un filtre correct. Je recherche désespérément un filtre qui modifie un flux vidéo compressé, donc un filtre de modification ou « transforme filter » comme il le nome et non pas un filtre de rendu.

  3. #3
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Points : 2 605
    Points
    2 605
    Par défaut
    Salut.

    Le filtre "NullInPlace", ne fait rien d'autre que de copier les datas du downstream et les passe à l'upstream.

    C'est la base pour un filtre de transformation, que ce soit de l'audio ou de la video.

    Tu as fais, je dirais 90% du chemin, si ton filtre fonctionne bien avec les autres filtres dans ce mode.

    Il ne te reste plus qu'à "overrider" la méthode "Transform" de l'interface "CTransInPlaceFilter". C'est là ou tu vas modifier les images I.

  4. #4
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2006
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    Ok merci bien pour la réponse je vais aller dans cette direction.

  5. #5
    mat.M
    Invité(e)
    Par défaut
    Mon problème est le suivant j’arrive à identifier les images I du flux avec un filtre que j’ai réaliser a partir du filtre NullInPlace du SDK 2004, Mais le problème est comment traiter le flux comment le modifier.
    Tu vas être obligé d'écrire ton propre filtre

    Prendre les sources de Virtual Dub qui permet de lire des fichiers MPEG..

    les composants Direct Show ce ne sont que des boites qui ont une fonction particulière.
    Je doute qu'un filtre particulier ne fasse cela..il n'ya que des "videos et sounds renderers"
    Aller sur le site www.wotsit.org pour le format MPEG

    Le format MPEG
    http://www.wotsit.org/download.asp?f=mpeg2-2
    Sinon mpeg.org

  6. #6
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2006
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    Je commence à voir de plus en plus que ce projet est très complexe.

    Oui tu as raison je devrai crée mon filtre avec l’aide de la norme MPEG-2 que je viens d’avoir à disposition. (Merci quand même pour les liens).
    Le gros problème est d’assimiler toutes ces nouvelles choses comme les objets COM la norme MPEG-2 et la création de filtre directshow.

    Je pense que mon casse-tête ne fait que commencer en tout cas merci beaucoup pour vos réponses rapides.

    Je vais essayer de surcharger la méthode « Transform » comme le dit moldavi pour dans un premier temps supprimer les images I, histoire de voir si j’y arrive.
    Vous en pensez quoi ?

  7. #7
    mat.M
    Invité(e)
    Par défaut
    Citation Envoyé par epix444
    Je commence à voir de plus en plus que ce projet est très complexe.

    Oui tu as raison je devrai crée mon filtre avec l’aide de la norme MPEG-2 que je viens d’avoir à disposition. (Merci quand même pour les liens).
    Le gros problème est d’assimiler toutes ces nouvelles choses comme les objets COM la norme MPEG-2 et la création de filtre directshow.
    Oui Moldavi a un peu fait preuve d'optimisme
    C'est plus complexe qu'on ne pense parce que puisque tu peux avoir le flux MPEG , il faut le mettre en tampon ( "bufferiser") , faire les traitements sur image que tu veuilles effectuer , donc adopter une stratégie de gestion de mémoire..etc

    Direct Show il faut faire l'analogie avec une carte de circuit électroniques, les composants comme les résistances étant les filtres DShow.

    Pour créer des filtres DirectShow il ya des exemples dans le SDK mais c'est vrai c'est vraiment pas trivial...
    Un filtre ax c'est ni plus ni moins qu'une dll COM .
    Bon courage tout de même...

  8. #8
    mat.M
    Invité(e)
    Par défaut
    Sinon essayer effectivement Transform suggéré par Moldavi
    Il faut gérer un IMediaSample
    CTransInPlaceFilter::Transform
    The Transform method transforms a sample in place.

    Syntax

    virtual HRESULT Transform(
    IMediaSample *pSample
    ) PURE;

    Parameters

    pSample

    Pointer to the sample's IMediaSample interface.

    Return Value

    Returns an HRESULT value. Possible values include those shown in the following table.

    Value Description
    S_FALSE Do not deliver this sample.
    S_OK Success.


    Remarks

    The derived class must implement this method. Transform the sample data in place. If the filter is using two allocators, it copies the data from the input sample to a new sample, and passes the copy to this method.

    If the filter should not deliver this sample (for example, to support quality control), the method should return S_FALSE.

    See Also

    CTransInPlaceFilter Class

  9. #9
    mat.M
    Invité(e)
    Par défaut
    Bon on est peut-être sauvé IMediaStream donne l'accès à un tampon avec lequel on peut faire d'éventuels traitements
    IMediaSample::GetPointer
    The GetPointer method retrieves a read/write pointer to this buffer's memory.

    Syntax

    HRESULT GetPointer(
    BYTE **ppBuffer
    );

    Parameters

    ppBuffer

    [out] Address of a pointer to the buffer.

    Return Value

    Returns S_OK if successful, or an HRESULT value indicating the cause of the error.
    Pas besoin de développer un filtre forcément mais cela serait peut-être mieux

  10. #10
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Points : 2 605
    Points
    2 605
    Par défaut
    Citation Envoyé par epix444
    Je vais essayer de surcharger la méthode « Transform » comme le dit moldavi pour dans un premier temps supprimer les images I, histoire de voir si j’y arrive.
    Vous en pensez quoi ?
    Dans ton premier message, tu parles de modifier les images I et maintenant tu parles de les supprimer. Ca change tout.

    Détaillles précisément ce que tu veux faire, si tu veux que l'on t'aide à trouver la méthode la plus appropriée.

    PS: Quand je dis de détailler, c'est depuis la lecture du flux, à sa sortie.

  11. #11
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2006
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    Alors mon projet dans ça globalité consiste à ajouter du texte sur un flux MPEG-2 compressé pas comme le fond les filtres de rendu vidéo comme « Vidéo Mixing Rander » par exemple.

    J’ai pensé que pour débuter je supprimerai ou en tout cas modifierai le flux binaire des images I rencontrées histoire de voir un changement à la lecture de la vidéo.

    J’ai déjà réaliser un petit lecteur vidéo qui ajoute dans le graphique de filtre un filtre que j’ai nommé Mpeg2InPlace vu que je suis parti de NullInplace comme exemple, Ce filtre analyse le flux MPEG-2 compresser notamment les en-tête pour faire un repérage des séquence puis des GOP (Groupe of pictures), et enfin des images I, P et B.

    Je pensai utiliser ce filtre pour modifier seulement les images I car, je vais ajouter le texte seulement sur celle si elle sont codée en JPEG (pas de vecteur de mouvement et autre complication supplémentaire).

    Voici mon code pour l’identification des en-têtes :

    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
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    HRESULT Transform(IMediaSample *pSample)
    		
    		{
    
    // Début de l'analyse
    
    		// &ppBuffer : pointe sur l'adresse du nouveau buffer
    
    		pSample->GetPointer(&ppBuffer);
    
    		// DataLength : on s'informe de la dimension du buffer en octet
    
    		DataLength=pSample->GetActualDataLength();
    
    		// numByte : On met le compteur d'octet(s) analysé(s) à '0'
    
    		NumByte=0;
    
    		// Tant que le nombre d'octets analysés < la donnée totale du sample,
    		// l'échantillon n'a pas été analysé dans son entier
    		// alors on continue !
    
    		while(NumByte<DataLength)
    		
    		{		
    			// Pos : on met le compteur de bits décalés de LittleBuffer à '0'
    
    			Pos = 0;
    
    			// LittleBuffer : contient l'octet numéro 'numByte' de l'échantillon
    
    			LittleBuffer = *(ppBuffer+NumByte);
    
    			// Tant que les 8 bits de LittleBuffer n'ont pas été décalés,
    			// on continue !
    			// On entre dans la zone de repérage (entêtes, champs significatifs)
    
    			while (Pos<8)
    			
    			{
    
    				// Analyse du contenu de MyBuffer par décalages successifs 
    				// bit à bit... Le bit de poids le plus faible de LittleBuffer
    				// est transmis au bit de poids le plus fort de MyBuffer,
    				// tandis que le bit de poids le plus faible de Mybuffer est
    				// 'éjecté', ayant déjà été passé dans l'analyse
    
    				Pos++;
    
    				MyBuffer=MyBuffer>>1;
    				if (LittleBuffer%2==1) MyBuffer=(MyBuffer)|(0x80000000);
    				LittleBuffer=byte (LittleBuffer>>1);
    			
    				// Recherche des champs significatifs
    				// si un code d'en-tête a précédemment
    				// été repéré ! Actions à entreprendre.
    				// Les parties non traitées pourront l'être
    				// à l'avenir...
    
    				switch (HeadCode)
    
    				{
    
    /* picture */	case 1 : 
    
    					if (CountBit==32)
    					
    					{
    						// Taille de l'image précédente
    
    						GOPMemory[CompteurGOP][NumImage][2] = NumByteImage;
    
    						NumByteImage = 0;			
    						NumImage++;
    
    						// Référence temporelle
    
    						//GOPMemory[CompteurGOP][NumImage][0] =
    						//	unsigned short ( ((MyBuffer>>14) & (0x3)) | ((MyBuffer<<2) & (0x3FC)) );
    	
    						GOPMemory[CompteurGOP][NumImage][0] = NumTotalByte;
    
    						// Code du type de l'image
    						
    						GOPMemory[CompteurGOP][NumImage][1] =
    							unsigned short ((MyBuffer>>11) & (0x7));
    						 
    						HeadCode = 0;
    					}
    
    					break;
    
    
    /*slice*/		case 2 :
    					
    					HeadCode = 0;
    					break;
    
    /*user data*/	case 3 : 
    					
    					HeadCode = 0;
    					break;
    
    /*sequ. head.*/	case 4 : 
    					
    					NumSequ++;
    					HeadCode = 0;
    					break;
    			
    /*extension*/	case 5 : 
    					HeadCode = 0;
    					break;
    				
    /*seq.end code*/case 6 : 
    					
    					// Taille de la dernière image
    					GOPMemory[CompteurGOP][NumImage][2] = NumByteImage;
    
    					HeadCode = 0; 
    					break;
    				
    /*GOP*/			case 7 : 
    
    					if (CountBit == 27)
    
    					{
    
    						 // Taille de l'image précédente
    						 GOPMemory[CompteurGOP-1][NumImage][2] = NumByteImage;
    
    						 // Pour signaler le début d'une série d'image
    						 GOPMemory[CompteurGOP][0][1] =  NumSequ;
    
    						 NumImage = 0;
    						 HeadCode = 0;
    					}
    
    					break;
    
    /* PES	*/			case 8 :
    
    					// On peut récupérer le flag TSF, pour savoir si présence PTS/DTS
    
    
    					//if (CountBit == 102)
    
    					if (CountBit == 32)
    
    					{
    						CompteurPES++;
    
    						PESMemory[CompteurPES][0] = unsigned short(CompteurGOP+1);
    						
    						//PESMemory[CompteurPES][1] = unsigned short((MyBuffer & 0xC0)>>6);
    
    PESMemory[CompteurPES][1] = unsigned short((MyBuffer>>30) & 0x3);
    
    						HeadCode = 0;					
    					}
    
    					break;
    
    				default : 
    
    					HeadCode = 0;
    					break;
    
    				}
    
    				// CountBit sert, lorsqu'un en-tête a été trouvé, à compter les
    				// bits entrant dans MyBuffer afin de capter les données utiles !
    
    				CountBit++;
    
    				// Recherche des codes d'en-tête
    				
    				if (HeadCode == 0) {
    
    					if (((MyBuffer & 0xF0FFFFFF) == 0xE0010000) ||((MyBuffer & 0xF0FFFFFF) == 0xF0010000)) MyBuffer=0xE0010000;
    						//
    
    
    				switch (MyBuffer)
    
    				{
    
    /* picture */		case	0x00010000 :  HeadCode = 1; break;
    /* user data */		case	0xB2010000 :  HeadCode = 3; break;	
    /* sequence head */	case	0xB3010000 :  HeadCode = 4; break;					
    /* extension */		case	0xB5010000 :  HeadCode = 5; break;
    /* sequ.end code */	case	0xB7010000 :  HeadCode = 6; break;
    /* group */			case	0xB8010000 :  HeadCode = 7; CompteurGOP++; break;
    
    /* PES */			case	0xE0010000 :  HeadCode = 8; break;
    
    				case	0xbc010000 : HeadCode = 8; break;
    				case	0xbd010000 : HeadCode = 8; break;
    				case	0xbe010000 : HeadCode = 8; break;
    				case	0xbf010000 : HeadCode = 8; break;
    						
    					default : HeadCode = 0; CountBit = 0; break;
    
    				}
    
    
     /* slice */	//	if ((MyBuffer>=0x01010000) && (MyBuffer<=unsigned int (0xAF010000))) HeadCode = 2;
    				
    				}
    
    			}
    			
    			NumByteImage++;
    			NumTotalByte++;
    			NumByte++;
    		}
    
    return NOERROR;]

  12. #12
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2006
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    Bon on est peut-être sauvé IMediaStream donne l'accès à un tampon avec lequel on peut faire d'éventuels traitements
    mat.M,
    J’ai déjà appliqué des tampons pour la gestion du flux binaire exactement comme tu la dis je pense que c'est bon, un grand merci quand même.

  13. #13
    mat.M
    Invité(e)
    Par défaut
    Citation Envoyé par epix444
    mat.M,
    J’ai déjà appliqué des tampons pour la gestion du flux binaire exactement comme tu la dis je pense que c'est bon, un grand merci quand même.
    eh bien de rien c'est rare d'avoir un remerciement en retour

  14. #14
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Points : 2 605
    Points
    2 605
    Par défaut
    Citation Envoyé par epix444

    J’ai déjà réaliser un petit lecteur vidéo qui ajoute dans le graphique de filtre un filtre que j’ai nommé Mpeg2InPlace vu que je suis parti de NullInplace comme exemple, Ce filtre analyse le flux MPEG-2 compresser notamment les en-tête pour faire un repérage des séquence puis des GOP (Groupe of pictures), et enfin des images I, P et B.

    Juste une question: a quel endroit du graphe se situe ton filtre Mpeg2InPlace ?

  15. #15
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2006
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    Mon filtre ce situe juste après le démultiplexeur (audio, vidéo).
    Donc entre ce démultiplexeur et le décodeur MPEG-2.
    Nom : costanza.jpg
Affichages : 86
Taille : 36,0 Ko

  16. #16
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Points : 2 605
    Points
    2 605
    Par défaut
    Citation Envoyé par epix444
    Mon filtre ce situe juste après le démultiplexeur (audio, vidéo).
    Donc entre ce démultiplexeur et le décodeur MPEG-2.
    Ok. C'est bien ce que je pensais.
    Pourquoi, tu ne places pas ton filtre NullInPlace entre le decoder mpeg2 et le filtre de rendu. Il suffirait de copier le texte sur les trames prêtent à être affichées...

  17. #17
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2006
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    Oui, tu as parfaitement raison cela serra beaucoup plus facile et en plus il y a des exemples de DirectX qui le fond… Mais le problème de cette solution c’est quelle consomme trop de ressource processeur pour mon application. Car en effet le but de ce projet est de modifier le flux MPEG-2 sans le décompresser. Car le but final étant de le diffuser sur un réseau DVB-C (télévision numérique sur câble) et la décompression et recompression utilise trop de ressource CPU.

    En faisant des recherches j’ai trouvé un filtre qui modifie le flux d’une vidéo. Ce filtre s’appel « YUV » il modifie le format de chrominance de la vidéo pour supprimer les couleurs, pour donc afficher une vidéo en niveau de gris. Il contient la même méthode « transform » je suis en train d’utiliser ce code pour le transposer à mon code.Je ne sais pas si c’est la solution je vais vérifier.

    Voici la méthode transforme du flitre « YUV » :
    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
     
     
    HRESULT CYuvGray::Transform(IMediaSample *pSource, IMediaSample *pDest)
    {
     
        CMediaType *pmt = 0;
        if (S_OK == pDest->GetMediaType((AM_MEDIA_TYPE**)&pmt) && pmt)
        {
     
     
            m_pOutput->SetMediaType(pmt);
            DeleteMediaType(pmt);
        }
     
        BYTE *pBufferIn, *pBufferOut;
     
        pSource->GetPointer(&pBufferIn);
        pDest->GetPointer(&pBufferOut);
     
        long cbByte = 0;
     
     
        HRESULT hr = ProcessFrame(pBufferIn, pBufferOut, &cbByte);
     
     
     
        ASSERT(pDest->GetSize() >= cbByte);
     
        pDest->SetActualDataLength(cbByte);
     
        return hr;
    }

  18. #18
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Points : 2 605
    Points
    2 605
    Par défaut
    Re.

    Je pense que tu fais fausse route. Du moins, si les performances et l'efficacité sont un facteur déterminant dans la conception de ton programme.

    Tu veux modifier uniquement les images intras. Mais à quelle fréquence sont-elles affichées. Si c'est une trame toutes les 25 images, je doute que l'on voit quelque chose. Si tu modifies les autres trames, les algos de décompression mpeg2 risquent d'afficher n'importe quoi. En bref, j'ai l'impression que c'est irréalisable sans une décompression/recompression.

    Je verrais plutôt un démultiplexage/remultiplexage. C'est long, mais c'est 100 fois moins long qu'une recompression. Une contrainte, c'est que les lecteurs qui vont afficher les images, prennent en charge le format DVD.

    Je m'explique:

    Le format DVD contient 3 types de données:

    - données audios
    - données vidéos
    - données textes

    Pourquoi ne pas utiliser la norme mpeg2 qui prévois l'ajout de texte en dehors des autres données. Il te suffirait de démultiplexer l'audio et la video, puis de remultiplexer le tout selon la norme mpeg2.

    Enfin je dis ça mais je n'ai jamais expérimenté.

    C'est tout de même la première direction que je prendrais dans la réalisation d'un tel programme.

  19. #19
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2006
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    Oui vu de ce point de vu, cela parait irréalisable car même en arrivant à modifier les images « I » il faudrait que je modifie les bons macroblocs et les modifier en réalisant des lettres là … je pense que ca va vraiment êtres impossible.

    En plus tu as raison il y a environ une image « I » toute les 10 ou 15 images. Ont n’aura pas le temps de lire le texte ou alors il clignotera.
    Je pense que ce projet n’a pas de réalisation possible.

    En ce qui concerne ton idée de démultiplexage/remultiplexage je la trouve très bien même si ce projet n’est pas sur support DVD mais pour une transmission DVB-C il y a de quoi faire, surement avec les tables PSI du MPEG-2 ou les tables SI du DVB. Alors là MERCI car je n’y avais même pas pensé. Je vais faire des recherches dans ce sens encore merci.

Discussions similaires

  1. Filtre directShow qui ne fait aucune tranformation
    Par flamme34 dans le forum DirectX
    Réponses: 4
    Dernier message: 29/06/2011, 16h43
  2. Creation d'un filtre directshow pour Matrox Orion
    Par Greutzeb dans le forum DirectX
    Réponses: 5
    Dernier message: 29/10/2004, 13h27
  3. Filtre directshow
    Par afan dans le forum DirectX
    Réponses: 2
    Dernier message: 04/02/2004, 21h41
  4. Filtre DirectShow
    Par masterfangorn dans le forum DirectX
    Réponses: 4
    Dernier message: 23/05/2003, 14h57
  5. interfaces pour Filtres DirectShow
    Par Chupakabra dans le forum DirectX
    Réponses: 1
    Dernier message: 23/05/2003, 14h54

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