Décoder de la vidéo h264
Je suis à la recherche d'un moyen de décoder le h264 (ou n'importe quel format vidéo) à l'aide de c#. Le but ultime est d'être en mesure de décoder les images et très strictement contrôler la lecture en temps réel. Le projet que je suis en train de travailler sur une non-linéaire de l'art vidéo, la pièce où le métrage en HD est nécessaire pour faire une boucle et de modifier lui-même à la volée, la lecture de certains cadre plages et puis de sauter à la prochaine choisis au hasard de la plage d'images de façon transparente.
J'ai créé une application qui lit les fichiers image (jpeg) à partir du disque et joue sur l'écran dans l'ordre, j'ai un contrôle total sur l'image qui est chargé, et quand il est affiché, mais au full HD res elle prend un peu plus de temps que je veux charger les images à partir du disque dur (qui sont environ 500 ko chacune), Je pense que l'utilisation d'un format vidéo compressé serait plus petit et donc plus rapide à lire et décoder dans un cadre particulier, cependant je ne trouve pas facilement disponibles manière de le faire.
Y a des bibliothèques qui peut faire cela? c'est à dire extraire une image quelconque à partir d'un fichier vidéo et de le servir à une de mes applications en moins de temps qu'il faut pour afficher l'image (course à 25fps), j'ai regardé dans le vlc des bibliothèques et des wrappers pour ffmpeg, mais je ne sais pas ce qui serait mieux ou si il y aurait une autre option encore meilleure. Aussi, je ne sais pas quel codec serait le meilleur choix car certains sont des images clés en fonction de décisions arbitraires de l'extraction des images sans doute très difficile.
Tous les conseils bienvenue, merci
- Si vous avez déjà une solution de travail - pourquoi ne pas vous venez de précharger les images Jpeg en mémoire ? Cela devrait vous donner une meilleure performance... vous pouvez également utiliser
MemoryMappedFile
pour faire de la lecture extrêmement rapide... - Si vous voulez le plein contrôle, vous pouvez explorer de Microsoft DirectShow Api msdn.microsoft.com/en-us/library/dd390351(v=VS.85).aspx
- Logiciel de décodage de la HD H264 vidéo à 25 fps est tout un défi difficile à relever!
- -Yahia : la mise en Cache est probablement un domaine que je voudrais éviter, car je ne connais pas la longueur des clips, trop long et pas assez de mémoire et je vais rapidement avoir des ennuis. Toutefois, votre idée d'utiliser une carte mémoire est assez intruiging.
- Sauter à n'importe quel cadre, dans le H264 est un peu un problème, sauf si elle arrive à être une image-clé. Il peut être fait, bien sûr, mais il pourrait être assez lent. Jusqu'à 16 images de référence peut être décodé si je ne sais pas comment c'est. 2 cadres de référence devrait être assez commun. En HuffYUV chaque image est une image-clé, rapide et à décompresser dans le logiciel trop. Peut-être intéressant de regarder dans.
- -Yahia - Si j'obtiens de vous droite, j'ai pu cache toutes les images dans la mémoire virtuelle, comme un fichier statique du système de fichiers et ensuite l'utiliser dans mon programme pour obtenir le prêt-à-go cadres. Je pense à l'obtention d'un lecteur à état solide pour ce projet afin d'avoir de la mémoire disponible sur qui est peut-être juste assez. Comme un bonus supplémentaire de ma vidéo sera soigneusement enfermé dans la carte mémoire de sorte qu'il serait aussi difficile à copier. Pouvez-vous donner des bons liens vous savez de ressources sur les cartes mémoire? Merci
- Yahia - Dire, par exemple, comment pourrait je conserver un certain nombre de fichiers jpeg dans une carte mémoire, et comment pourrais-je les récupérer plus tard? Merci à tous pour votre aide btw
Vous devez vous connecter pour publier un commentaire.
Je dirais que l'utilisation de H. 264 n'est pas une bonne idée. La raison pour cela est les différents types d'images qui composent le flux
J'ai les images ou les images clés: tout ce qui est nécessaire pour décoder une image est disponible directement, c'est à dire pas de dépendance, il existe d'autres cadres.
P-frames (prédit-cadres): se compose de la différence des données vers des images précédemment décodées.
B-frames (bidirectionnel): se compose de la différence des données vers des images précédemment décodées et des images qui se trouve dans l'avenir.
L'ordre les images sont encodées dans le bistream est pas le même que l'ordre dans lequel les images doivent être affichées dans les.
Comme un exemple extrême, H. 264 contenu peuvent avoir seulement 1 I-frame au début du clip. Si vous avez besoin d'afficher la dernière image, chaque image intermédiaire doit être décodé jusqu'à et y compris la dernière image pour qu'elle s'affiche.
JPEG que vous avez commencé à faire n'est pas une mauvaise idée. Vous pourriez jouer avec le niveau de compression pour trouver l'ultime de taille de fichier à l'égard de la qualité et de décoder en temps.
La sortie d'un vidéo-décodeur est presque dans tous les cas 4:2:0 sous-échantillonné YUV au format raw-data. Une image de 1080p sera
1920*1080*1.5=3110400 bytes
. L'utilisation de ce format au lieu de JPEG (qui a également décode en YUV4:2:0) de raser le décodage du temps à partir de votre "application", laissant juste la vue-des-temps. Imagemagick et un tas d'autres outils, vous pouvez convertir JPEG en YUV4:2:0. Ce ne peut pas être combiné avec la projection en mémoire décrit dans les commentaires.Si vous estimez que le format raw prend beaucoup d'espace disque, jetez un oeil à huffyuv qui est une compression sans perte YUV codec.
Pour un spectateur, j'ai eu une grande expérience dans le passé à l'aide de SDL qui comprend le YUV-format qui le rend très simple à écrire un spectateur. Heureusement, il y a déjà un écrit que vous pouvez utiliser comme un modèle pour le développement ultérieur. Jetez un oeil à yay
http://sourceforge.net/projects/mfnet/
Windows Media Foundation, peut-être.
Je veux juste faire remarquer que la taille du fichier n'est pas synonyme de vitesse toujours. Plus le fichier est parfois plus le coût de décompression. Vous pouvez (et j'insiste sur le pourrait) fait mieux perf en allant avec un format non compressé tels que BMP ou, éventuellement, de WMF.