Comment écrire un Live555 FramedSource pour me permettre de flux H. 264 en direct
J'ai essayé d'écrire une classe qui dérive de FramedSource dans Live555 qui va me permettre de flux de données en direct de mon D3D9 application à un MP4 ou similaire.
Ce que je fais chaque image, c'est prendre le backbuffer dans la mémoire du système comme une texture, puis de le convertir en RVB -> YUV420P, puis l'encoder à l'aide de x264, alors idéalement passage de la NALE des paquets sur Live555. J'ai fait une classe appelée H264FramedSource qui découle de la FramedSource essentiellement par la copie de la DeviceSource fichier. Au lieu de l'entrée d'un fichier d'entrée, j'ai fait un dernier paquet que j'ai mise à jour de chaque image.
Je suis assez nouveau pour les codecs et de diffusion, afin que je puisse tout faire, complètement faux. Dans chaque doGetNextFrame() dois-je en attrapant la NALE de paquets et de faire quelque chose comme
memcpy(fTo, nal->p_payload, nal->i_payload)
Je suppose que la charge est mon bloc de données en octets? Si quelqu'un a un exemple d'une classe dérivée de FramedSource qui pourrait au moins être proche de ce que je suis en train de faire, j'aimerais le voir, c'est tout nouveau pour moi et un peu difficile à comprendre ce qui se passe. Live555 de la documentation est à peu près le code lui-même qui n'est pas exactement le rendre facile pour moi de comprendre.
- Je ne sais pas si ça va résoudre ton problème ou pas, mais gardez à l'esprit, NALE, les paquets ne sont pas 1-1 avec les images, vous pouvez obtenir 0-nombre NAL paquets d'un seul cadre de l'encodage.
- Merci pour la réponse, j'étais sûr que c'était le cas. Comment ceux FramedSource compte pour qui?
- Avez-vous envisagé d'utiliser H264VideoStreamDiscreteFramer au lieu de H264VideoStreamFramer? Je vais faire un peu plus de recherche et voir si quelque chose apparaît. (voir comments.gmane.org/gmane.comp.multimedia.live555.devel/8450)
- Oui, j'ai, il aura encore besoin de moi à la sous-classe FramedSource, est-ce correct? Je suis à essayer de comprendre ce qui doit arriver dans les fonctions comme, doGetNextFrame, deliverFrame, etc.
- Avez-vous ce travail?
- Salut, je suis encore à obtenir que cela fonctionne parfaitement. Je peux le faire pour flux dans un fichier et je peux regarder ce fichier live à l'aide de ffmpeg. J'ai encore besoin d'obtenir que cela fonctionne avec le protocole RTP/similaire.
Vous devez vous connecter pour publier un commentaire.
Ok, j'ai enfin eu le temps de passer sur ce et il a obtenu de travail! Je suis sûr qu'il ya d'autres qui sera la mendicité pour savoir comment le faire si elle est ici.
Vous aurez besoin de votre propre FramedSource de prendre chaque image, de coder, et de le préparer pour le streaming, je vais donner quelques du code source pour ce bientôt.
Essentiellement jeter votre FramedSource dans le H264VideoStreamDiscreteFramer, puis jetez-le dans le H264RTPSink. Quelque chose comme ceci
Maintenant dans votre boucle de rendu, jeter sur votre backbuffer lequel vous avez enregistré dans la mémoire du système pour votre FramedSource de sorte qu'il peut être encodé etc. Pour plus d'informations sur la configuration de l'encodage des trucs découvrez cette réponse Comment coder une série d'images en H264 à l'aide de l'x264 C API?
Mon application est très bien dans une hacky état et doit encore être optimisée à tous, mon d3d application s'exécute à environ 15 images par seconde en raison de l'encodage, aïe, je vais donc avoir à regarder dans cette. Mais pour toutes fins utiles, cette StackOverflow question est répondu parce que j'étais surtout après la façon de les diffuser. J'espère que cela aide d'autres personnes.
Comme pour mon FramedSource il ressemble un peu à quelque chose comme ceci
Oh, et pour ceux qui veulent savoir ce que mon simultanées de la file d'attente est, ici, il est, et il fonctionne à merveille http://www.justsoftwaresolutions.co.uk/threading/implementing-a-thread-safe-queue-using-condition-variables.html
Profiter et bonne chance!
La deliverFrame méthode n'est pas la case à ses débuts:
voir DeviceSource.cpp en LIVE