Données vidéo IO via le sous-processus ffmpeg
Alors que je reprenais ma recherche d'emploi (oui, je suis toujours #OpenToWork, pingez-moi !), dans l'une des candidatures, on m'a demandé d'implémenter un prototype qui traite des données vidéo. Pendant que je travaillais sur le projet, j'ai reçu de manière inattendue beaucoup d'aide de la part des chatbots génératifs d'IA en raison de ma relative inexpérience dans le domaine.
Comme mentionné dans le titre, ffmpeg a été utilisé pour effectuer certains travaux de prétraitement. L'un des objectifs du projet était de pouvoir lire plusieurs fichiers vidéo les uns après les autres. Bien qu'il existe plusieurs façons d'y parvenir, j'ai décidé d'opter pour la solution la plus évidente, en les concaténant ensemble.
$ cat video1 video2 video3 | python further-work.py
Pour y parvenir, j'ai d'abord dû réencoder les fichiers dans des formats qui le permettraient. Après avoir « discuté » avec Google Gemini à ce sujet, le chatbot m'a recommandé d'utiliser MPEG-TS à cet effet.
MPEG Transport Stream (MPEG-TS) fonctionne en encapsulant des flux élémentaires en paquets. Ces flux comprennent des données audio, vidéo et PSIP, qui sont mises en paquets en petits segments. Chaque flux est découpé en sections de 188 octets et entrelacé. Ce processus garantit moins de latence et une plus grande résilience aux erreurs, ce qui le rend idéal pour les vidéoconférences où les images volumineuses peuvent introduire un retard audio.
Cité de https://castr.com/blog/mpeg-transport-stream-mpeg-ts/
Il existe d'autres formats de fichiers qui pourraient être utilisés à cet effet, mais ils n'ont aucun rapport avec la discussion. Une fois la vidéo réencodée dans ce format, les données vidéo seront envoyées dans une file d'attente, pour être consommées par d'autres modules, exécutés dans d'autres processus.
Après avoir défini à la fois l'entrée (une liste de fichiers vidéo à récupérer en ligne) et la sortie (le contenu du fichier vidéo réencodé), il était temps de comprendre comment procéder. Malheureusement, ffmpeg est un utilitaire tellement compliqué qui fait tellement de choses. Il y a/y a eu plusieurs tentatives pour fournir une interface pour aider les utilisateurs (je voulais vraiment essayer ça, mais il est mort maintenant, apparemment). Cependant, compte tenu de l’utilité actuelle de l’IA générative, il suffit de quelques invites pour obtenir la bonne commande.
ffmpeg -hwaccel cuda -i pipe:0 -c:v h264_nvenc -b:v 1.5M -c:a aac -b:a 128k -f mpegts -y pipe:1
Il a même donné une explication sur la signification de chacun de ces arguments, comme le montre la capture d'écran ci-dessous.
Tentative de Gemini d'expliquer la commande ffmpeg
En bref, la commande accepte le contenu du fichier vidéo via stdin et génère le contenu du fichier vidéo réencodé sous forme de sortie standard.
Il est maintenant temps de coder l'implémentation, car je voulais à la fois lire et écrire dans ffmpeg simultanément, ce sera donc une application asyncio. La bibliothèque client http que nous utilisons cette fois est httpx, qui dispose d'une méthode pour récupérer le téléchargement par lots plus petits :
$ cat video1 video2 video3 | python further-work.py
Nous nous soucierons du traitement réel plus tard, pour l'instant, nous obtiendrons simplement le code pour imprimer les morceaux à l'écran.
Ensuite, nous écrivons une fonction pour appeler ffmpeg, via asyncio.create_subprocess_exec
ffmpeg -hwaccel cuda -i pipe:0 -c:v h264_nvenc -b:v 1.5M -c:a aac -b:a 128k -f mpegts -y pipe:1
Idéalement, nous utiliserions ici process.communicate(file_content) comme conseillé dans la documentation, malheureusement si nous faisions cela, nous devrions d'abord télécharger l'intégralité du fichier, ce qui retarderait inévitablement la réponse, ce qui n'était pas idéal.
À la place, nous pourrions utiliser process.stdin.write(), mettons à jour la fonction write_input d'origine :
import httpx client = httpx.AsyncClient() async def write_input( client: httpx.AsyncClient, video_link: str, process: asyncio.subprocess.Process ) -> None: async with client.stream("GET", video_link) as response: async for chunk in response.aiter_raw(1024): print(chunk) # this is the downloaded video file, in chunks
Avec chaque morceau téléchargé,
- nous le transmettons au processus via process.stdin.write(chunk).
- Une fois cela fait, nous écrivions un EOF (process.stdin.write_eof()) pour désigner la fin de l'entrée du fichier,
- suivi d'un .close() (et de l'attente correspondante .wait_closed())
Retour à la fonction video_send, nous continuons la fonction en lisant process.stdout. Être capable de lire et d'écrire est exactement la raison pour laquelle nous faisons cela via asyncio. Auparavant, en mode synchrone, nous ne pouvions effectuer les opérations que les unes après les autres dans un ordre fixe, mais nous pouvions désormais laisser le planificateur se soucier de l'ordre. Maintenant, la fonction a ajouté le code suivant pour lire le contenu du fichier réencodé et le publier dans la file d'attente :
async def video_send(client: httpx.AsyncClient, video_link: str) -> None: logger.info("DATA: Fetching video from link", link=video_link) process = await asyncio.create_subprocess_exec( "ffmpeg", "-hwaccel", "cuda", "-i", "pipe:0", "-c:v", "h264_nvenc", # "libx264", "-b:v", "1.5M", "-c:a", "aac", "-b:a", "128k", "-f", "mpegts", "-y", "pipe:1", stdin=subprocess.PIPE, stdout=subprocess.PIPE, ) asyncio.create_task(write_input(client, video_link, process))
En boucle, nous
- Récupérer un morceau de données depuis ffmpeg stdout
- Si chunk est une chaîne vide, quittez la boucle
- Sinon, placez le morceau dans la file d'attente (via asyncio.to_thread, car nous utilisons ici une version sécurisée pour les processus)
- Ensuite, nous attendons que la commande se termine gracieusement, via process.wait()
Cela semble très simple maintenant, mais il m'a fallu toute la nuit pour faire cela correctement (et j'étais encore en train de réviser le code en écrivant ceci). La moitié du temps, je vérifiais la documentation pour m'assurer de ne rien manquer, le reste du temps, je demandais à Gemini de réviser mon code.
J'espère que cela vous sera utile, et c'est tout pour aujourd'hui. J'espère que nous reviendrons la semaine prochaine au contenu de l'Avent of Code précédemment promis.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds











Python est plus facile à apprendre et à utiliser, tandis que C est plus puissant mais complexe. 1. La syntaxe Python est concise et adaptée aux débutants. Le typage dynamique et la gestion automatique de la mémoire le rendent facile à utiliser, mais peuvent entraîner des erreurs d'exécution. 2.C fournit des fonctionnalités de contrôle de bas niveau et avancées, adaptées aux applications haute performance, mais a un seuil d'apprentissage élevé et nécessite une gestion manuelle de la mémoire et de la sécurité.

Pour maximiser l'efficacité de l'apprentissage de Python dans un temps limité, vous pouvez utiliser les modules DateTime, Time et Schedule de Python. 1. Le module DateTime est utilisé pour enregistrer et planifier le temps d'apprentissage. 2. Le module de temps aide à définir l'étude et le temps de repos. 3. Le module de planification organise automatiquement des tâches d'apprentissage hebdomadaires.

Python est meilleur que C dans l'efficacité du développement, mais C est plus élevé dans les performances d'exécution. 1. La syntaxe concise de Python et les bibliothèques riches améliorent l'efficacité du développement. Les caractéristiques de type compilation et le contrôle du matériel de CC améliorent les performances d'exécution. Lorsque vous faites un choix, vous devez peser la vitesse de développement et l'efficacité de l'exécution en fonction des besoins du projet.

Python et C ont chacun leurs propres avantages, et le choix doit être basé sur les exigences du projet. 1) Python convient au développement rapide et au traitement des données en raison de sa syntaxe concise et de son typage dynamique. 2) C convient à des performances élevées et à une programmation système en raison de son typage statique et de sa gestion de la mémoire manuelle.

Est-ce suffisant pour apprendre Python pendant deux heures par jour? Cela dépend de vos objectifs et de vos méthodes d'apprentissage. 1) Élaborer un plan d'apprentissage clair, 2) Sélectionnez les ressources et méthodes d'apprentissage appropriées, 3) la pratique et l'examen et la consolidation de la pratique pratique et de l'examen et de la consolidation, et vous pouvez progressivement maîtriser les connaissances de base et les fonctions avancées de Python au cours de cette période.

PythonlistSaReparmentofthestandardLibrary, tandis que les coloccules de colocède, tandis que les colocculations pour la base de la Parlementaire, des coloments de forage polyvalent, tandis que la fonctionnalité de la fonctionnalité nettement adressée.

Python excelle dans l'automatisation, les scripts et la gestion des tâches. 1) Automatisation: La sauvegarde du fichier est réalisée via des bibliothèques standard telles que le système d'exploitation et la fermeture. 2) Écriture de script: utilisez la bibliothèque PSUTIL pour surveiller les ressources système. 3) Gestion des tâches: utilisez la bibliothèque de planification pour planifier les tâches. La facilité d'utilisation de Python et la prise en charge de la bibliothèque riche en font l'outil préféré dans ces domaines.

Les applications clés de Python dans le développement Web incluent l'utilisation des cadres Django et Flask, le développement de l'API, l'analyse et la visualisation des données, l'apprentissage automatique et l'IA et l'optimisation des performances. 1. Framework Django et Flask: Django convient au développement rapide d'applications complexes, et Flask convient aux projets petits ou hautement personnalisés. 2. Développement de l'API: Utilisez Flask ou DjangorestFramework pour construire RestulAPI. 3. Analyse et visualisation des données: utilisez Python pour traiter les données et les afficher via l'interface Web. 4. Apprentissage automatique et AI: Python est utilisé pour créer des applications Web intelligentes. 5. Optimisation des performances: optimisée par la programmation, la mise en cache et le code asynchrones
