2015-09-07 3 views
1

J'essaie d'extraire les flux bruts des périphériques et des fichiers en utilisant ffmpeg. Je remarque que les informations d'image cruciales (vidéo: largeur, hauteur, format de pixel, espace colorimétrique, audio: format d'échantillon) sont stockées dans AVCodecContext et dans l'AVFrame. Cela signifie que je peux y accéder avant la lecture du flux et je peux y accéder pour chaque image.API FFMPEG - Dans quelle mesure les paramètres de flux changent-ils d'image en image?

De combien ai-je besoin pour tenir compte de ces valeurs changeant d'image à trame? J'ai trouvé https://ffmpeg.org/doxygen/trunk/demuxing__decoding_8c_source.html#l00081 qui indique qu'au moins la largeur, la hauteur et le format de pixel peuvent changer d'image en image. Est-ce que l'espace colorimétrique et le format de l'échantillon changeront également d'image en image?

  • Ces changements seront-ils temporaires (une seule trame) ou durables (un bloc significatif de trames) et y a-t-il un moyen de prédire pour ce flux quel comportement aura lieu? Y at-il un moyen de trouver les attributs les plus descriptifs que ce flux est possible de produire, de sorte que je puisse redimensionner tous les cadres de qualité inférieure, mais ne pas offrir un résultat qui est inconsciemment de meilleure qualité que la source, même s'il s'agit d'un périphérique ou d'un flux réseau sur lequel je ne peux pas lire toutes les images à l'avance? La question fondamentale est: comment résoudre la flexibilité de cette API avec la restriction que les flux bruts (ma sortie) n'ont aucun moyen de spécifier un changement d'attributs de flux à mi-flux. J'imagine que je devrai soit prédire les attributs les plus descriptifs pour donner le flux, ou offrir un nouveau flux lorsque les attributs changent. Le choix à faire dépend du fait que ces valeurs changent rapidement ou restent relativement stables.

  • +0

    Ne posez pas de questions étiquetées [tag: c] ou [tag: C++] sans faire référence au code dont vous disposez. Merci. –

    +0

    Merci pour l'avis. – kacey

    Répondre

    2

    Donc, pour ajouter à ce @szatmary says, le cas typique d'utilisation pour les modifications des paramètres de flux est le streaming adaptatif:

    • Imaginez que vous regardez des vidéos YouTube sur un ordinateur portable avec différentes méthodes de connectivité Internet, et la bande passante soudainement diminue . Votre flux passera automatiquement à une bande passante inférieure. FFmpeg (qui est utilisé par Chrome) doit prendre en charge cela. Alternativement, imaginez un scénario similaire dans une conversation vidéo rtc.

    La raison pour laquelle FFmpeg fait ce qu'il fait, c'est parce que l'API essaie essentiellement de s'adapter au dénominateur commun. Les vidéos prises sur un téléphone ne changeront jamais de résolution. La plupart des vidéos ne seront pas non plus exportées depuis un logiciel de montage vidéo. Même les vidéos de youtube-dl ne changeront généralement pas de résolution, c'est une décision côté client, et youtube-dl ne le fera tout simplement pas. Alors, que devrais-tu faire? J'utiliserais simplement les informations de flux de la première image (s) et redimensionner toutes les images suivantes à cette résolution. Cela fonctionnera pour 99,99% pour les cas. Si vous voulez adapter votre service à ce 0,01% restant dépend du type de vidéos que vous pensez que les utilisateurs vont télécharger et si les changements de résolution ont un sens dans ce contexte.

    Est-ce que l'espace colorimétrique change? Ils pourraient (théoriquement) dans un logiciel qui mélange l'enregistrement d'écran avec des fragments vidéo, mais c'est très improbable (en pratique). Le format de l'échantillon change aussi souvent que la résolution de la vidéo: assez souvent dans le scénario adaptatif, mais que cela dépende de votre service et des types de vidéos que vous attendez.

    +0

    Merci pour cette meilleure réponse. L'ambiguïté de l'API ffmpeg semble un peu malheureuse; Je regarde plutôt gstreamer pour l'instant. – kacey

    0

    Habituellement, pas souvent, ou jamais. Cependant, ceci est basé sur le codec et sont des options choisies au codage du temps. Je passe les images décodées à travers swscale juste au cas où.