2013-01-31 6 views
2

Tout d'abord, désolé pour mon mauvais anglais. J'écris un serveur de streaming vidéo en C++. J'ai plusieurs fichiers mpeg2-ts (films et publicités) dont j'ai besoin de diffuser via HTTP en un seul fichier TS-FILE. Le problème est que chaque fichier mpeg-ts a ses propres horodatages (PCR, PTS, DTS). Et, si je comprends bien, pour faire un flux de streaming continu, chaque nouvelle valeur de PCR (PTS, DTS) devrait continuer à partir de la dernière valeur de PCR (PTS, DTS).Fusion de plusieurs fichiers vidéo dans un seul fichier mpeg-ts "à la volée"

Voici une image pour une meilleure compréhension de ce que je dis sur: http://i.stack.imgur.com/vL1m6.png (. Je ne peux pas inclure mon image directement dans le message Désolé)

Je dois remplacer pcr`1, pcr`2, pcr`3 timestamps avec les nouveaux. Par exemple, j'ai envoyé ts-paquet contenant l'horodatage pcr3 et après quelques autres paquets ts (ne contenant aucune valeur de PCR) je veux insérer ma publicité. Et ma question est: comment puis-je calculer les nouvelles valeurs pour pcr`1, pcr`2, pcr`3 et ainsi de suite?

Est-il correct de calculer le débit binaire de la vidéo en cours, puis de diviser la quantité de bits que le programme a envoyée depuis le dernier horodatage PCR (dans notre cas, c'est pcr3) par ce débit binaire? Je veux dire ce qui suit: (nouvel horodatage) = (horodatage précédent) + (la quantité de bits)/(débit binaire). Ou y a-t-il un moyen plus efficace de le faire?

En ce qui concerne les horodatages PTS et DTS, je lis here que ces horodatages peuvent être non-linéaires. Est-ce qu'il sera correct de le calculer par rapport au dernier PCR original que j'ai reçu? Je veux dire:

pts_new = (original_pts - last_original_pcr) + pcr_new. 
dts_new = (original_dts - last_original_pcr) + pcr_new. 

(original_pts - last_original_pcr) is the difference between pts and pcr values 
pcr_new is the last modified pcr value 

Mon programme peut lire et modifier ces horodateurs dans le flux mpeg-ts. Heureusement, il y a beaucoup de littérature sur la façon de le faire. Mais comment puis-je calculer les nouvelles valeurs pour ces horodatages?

Je viens de commencer à apprendre la spécification de mpeg2-ts, et s'il vous plaît corriger mes erreurs si je me trompe dans quelque chose. Merci d'avance. J'espère que vous m'avez compris. Mpeg2 "Splicing" est une forme d'art, et est beaucoup plus compliquée que la concaténation de deux flux.

+0

est-il possible d'utiliser des utilitaires ou des bibliothèques existants (tels que gstreamer)? – Juster

Répondre

4

Elle nécessite des manipulations que beaucoup de sociétés ont breveté (http://www.google.com/patents/US6380991, http://www.google.com/patents/US6806909, http://www.google.com/patents/US6993081)

pour répondre à certaines de vos questions: votre calcul de la prochaine pcr semble ok, bien que vous devez prendre en compte beaucoup de problèmes de conformité (etr290 par exemple) pour DTS/PTS vous avez beaucoup plus de travail à faire. l'épissure la plus basique va juste restituer les pts/dts de l'annonce de telle sorte qu'ils continuent à partir du dernier horodatage du premier TS.

ad first timestamp = last timestamp + frame interval 

l'affaire se situe dans en vous assurant que vous avez pas de « trous » soit dans les horodateurs de présentation ou les horodateurs de décodage. C'est la partie difficile et nécessite une compréhension profonde dans les tampons MPEG2 (tstd, eb, mb).

Bonne chance.

+0

Merci beaucoup pour votre réponse. Je ne sais pas pourquoi c'est le cas, mais mon programme ne fonctionne que sur ordinateur (je regarde mon film en utilisant le lecteur multimédia VLC). Lorsque j'essaie de lire le film sur la TV via DLNA, cela ne semble pas fonctionner. Dans la plupart des cas, le téléviseur laisse tomber la connexion avec l'ordinateur lorsque l'annonce commence. Mais lorsque j'essaie d'insérer une annonce sans modifier aucun des horodatages, le téléviseur peut la lire de temps en temps. Je ne sais pas quelle peut en être la raison. – Dobby007

Questions connexes