2013-01-22 4 views
0

Je rends un fichier vidéo à partir d'images d'entrée provenant d'un moteur 3D en cours d'exécution (je ne transmets pas un fichier image réel, juste une mémoire RVB). Cela fonctionne parfaitement lors de la sortie de MP4 en utilisant CODEC_ID_H264 comme codec vidéo.avformat_write_header produit un en-tête invalide (résultat MPG cassé)

Mais quand je veux créer un fichier MPG en utilisant CODEC_ID_MPEG2VIDEO, le fichier résultant est simplement cassé. Aucun joueur ne peut lire la vidéo correctement et quand je veux ensuite concaténer ce MPG avec un autre fichier MPG, et transformer le résultat MP4 dans une autre étape, le fichier .mp4 résultant a deux vidéos, mais beaucoup d'images de la vidéo originale MPG (et seulement la vidéo fonctionne bien) sont simplement sautés. Au début, je pensais que la conversion MPG -> MP4 était le problème, mais j'ai ensuite remarqué que le MPG initial, qui provient du moteur de rendu vidéo, est déjà cassé, ce qui serait le cas pour les en-têtes cassés. Je ne sais pas si ce sont les en-têtes de système ou de séquence qui sont cassés. Ou si cela pourrait être quelque chose de totalement différent.

Si vous voulez jeter un oeil, voici le fichier: http://www.file-upload.net/download-7093306/broken.mpg.html

Encore une fois, le même code muxing exact fonctionne parfaitement bien lors de la création directe d'un MP4 à partir du moteur de rendu vidéo, donc je suis assez sûr les données d'entrée, swscale(), etc. sont correctes. La seule différence est que CODEC_ID_H264 est utilisé et que certaines variables supplémentaires (comme qmin, qmax, etc.) sont définies, elles sont toutes spécifiques à H264, donc elles ne devraient pas avoir d'impact.

De même, ni avformat_write_header ni av_write_trailer ne signalent une erreur. Pour plus d'informations, lors de l'affichage des données de codec du MPG dans le lecteur VLC, il n'est pas capable d'afficher le FPS, la résolution et le format (devrait afficher 640x360, 30 fps et 4: 2: 0 YUV).

J'utilise une version FFmpeg assez récente (2-3 mois, peut-être), que j'ai compilée à partir de sources avec MinGW.

Toute idée sur la façon de résoudre ce problème serait la bienvenue. Actuellement, je suis hors de ceux :)

Répondre

0

D'accord, le problème n'était pas l'avformat_write_header, mais que je n'ai pas mis la valeur PTS de chaque paquet vidéo écrit à AV_NOPTS_VALUE.

Une fois que je l'ai défini pour chaque paquet vidéo, tout fonctionne correctement.

J'ai supposé que AV_NOPTS_VALUE était la valeur par défaut, car je n'avais jamais besoin de définir de valeur PTS spéciale.

Questions connexes