2011-05-30 4 views
2

Je viens de créer graphique simple pour enregistrer la vidéo à partir d'une source Filtre:DirectShow Enregistrement Problème - fps

SourceFilter ---> Muxer ---> FileWriter 

Je peux en mesure d'enregistrer la vidéo qui viennent de SourceFilter à mon disque local.

But when i try to play the recorded video, it play in "slow motion" :-). 

Il est certain qu'il y a un problème fps (frame persecond). Comment puis-je le réparer? des idées?

PS:

Pour vérifier si mon SourceFilter donner Righ fps je crée simplement un autre graphique:

SourceFilter ---> Video Decoder ---> Video Renderer 

et joue à bonne vitesse (fps)

Plus de détails:

SourceFilter(*.mp4 file format) ---> Avi Mux Filter ---> File writer Filter 

Ce record mais en mauvais fps.

Lorsque j'essaie gdcl MP4 Mux (can see it here) j'ai réussi à obtenir fps.

SourceFilter(*.mp4 file format) ---> GDCL MPEG 4 Mux Filter ---> File writer Filter 

L'autre scénario

SourceFilter(*.h264 file format) ---> Avi Mux Filter ---> File writer Filter 
SourceFilter(*.h264 file format) ---> GDCL MPEG 4 Mux Filter---> File writer Filter 

Il enregistre, mais le fichier enregistré ne joue pas.

Et en fait je ne veux rien décoder ... Il suffit d'écrire les images vidéo encodées à l'origine (MP4, H264) dans le fichier. Et aussi je ne peux pas besoin de syn audio avec vidéo ... Pourquoi Mux?

Mon filtre idéal devrait ressembler à ceci:

SourceFilter(whatever format) ---> File writer 
+0

Il pourrait aider si vous ajoutez des informations de format de fichier et de codec à la question – Ralf

+0

Merci Ralf. Les formats de fichiers sont mp4 et h264. J'ai mis plus de détails dans ma question à la section Plus de détails. @Ralf – DSBoy

+0

J'ai déjà rencontré un problème similaire avec le mux AVI, malheureusement il y a si longtemps que je ne me souviens plus du problème dans mon cas. Définissez-vous AvgTimePerFrame du VIDEOINFOHEADER dans votre filtre source en fonction de http://msdn.microsoft.com/fr-fr/library/dd318188 (v = vs.85) .aspx? – Ralf

Répondre

3

commentaire de Ralf a probablement raison. Le format de fichier AVI n'a pas d'horodatages par image, juste une fréquence d'images moyenne. Donc, quand une trame arrive, le multiplexeur doit décider s'il faut placer cette image dans le prochain "slot", ou insérer un marqueur "droped frame" et placer le cadre dans le slot suivant. Si les horodatages du filtre source ne correspondent pas à la fréquence d'images du type de support, vous obtiendrez cet effet.

Vous pouvez enregistrer votre flux élémentaire vidéo dans un fichier, mais utilisez l'exemple de filtre de vidage et non le rédacteur de fichier. L'enregistreur de fichiers a un protocole spécial pour permettre l'accès aléatoire des multiplexeurs au fichier (en utilisant les horodatages comme décalages de fichiers). Vous voulez simplement enregistrer les données sous forme de flux, et l'exemple Dump le fait.

+0

Un autre exemple à développer sur la réponse de Geraint: Lors de l'utilisation du codec H.264 du SDK Intel 2012 Media et du .mp4 muxer, les images de capture perdues semblent être totalement ignorées. Bien que cela ne soit pas important dans un environnement de transcodage (puisque les images ne sont jamais supprimées), il s'agit d'une limitation sérieuse lors de la capture puisque la longueur du film sera raccourcie par le nombre de trames perdues. –

1

Dans mon cas, j'avais en effet un filtre Source qui n'a pas correctement défini AvgTimePerFrame. Après avoir corrigé cela (c'était mon propre filtre de source), l'AVI a également suivi ce que l'amont lui avait transmis.