Encodage H264 avec accélération matérielle possible?

12

Le Raspberry Pi effectuera un encodage h264 accéléré par le matériel lors de l'enregistrement vidéo à partir de la carte de la caméra. Comment puis-je encoder le h264 (en utilisant l'accélération matérielle) lorsque les images source ne proviennent pas directement de la caméra?

Existe-t-il des outils de ligne de commande qui prennent en charge cela?

Si non, quelles API dois-je envisager pour rendre cela possible?

Szabolcs
la source
Que codez-vous et comment le faites-vous actuellement? - convertissez-vous des fichiers vidéo, les rendez-vous à partir d'images et de sons, etc ...
Wilf
@Wilf Cela m'intéresse en général, mais j'ai une application actuelle: encoder un laps de temps directement en vidéo. Je ne peux pas utiliser raspivid car j'ai besoin de fréquences d'images basses entre 1/5 et 2 ips. De plus, une auto-exposition rugueuse entre en oscillations dans mes conditions d'éclairage (faible luminosité). Je veux donc utiliser Raspistill, mais encoder directement en vidéo afin que le résultat ne prenne pas trop de place (comme le feraient les JPEG). En tant que deuxième application, je souhaite post-traiter chaque image en temps réel en utilisant Mathematica (cela prendra beaucoup de temps CPU), puis les envoyer pour être encodées en h264.
Szabolcs
1
@Wilf J'ai une solution partielle qui, je pense, devrait être possible pour faire fonctionner: l'idée est quelque chose comme raspiyuv -o - | rpi-encode-yuv(à peu près) où l' rpi-encode-yuvoutil est d' ici . La taille du cadre est codée en dur dans cet outil, vous devez donc la modifier au début du fichier C et recompiler. Malheureusement, je n'ai pas encore réussi à obtenir une sortie correctement alignée, car raspiyuvil ne semble pas encoder la taille du cadre dans sa sortie. J'obtiens une image changeant progressivement qui finit par se transformer en ordures. Travaille toujours dessus.
Szabolcs

Réponses:

8

GStreamer est inclus dans Raspbian et avec son plugin OpenMAX, il utilisera les capacités d'encodage matériel du Raspberry Pi.

Voir ce lien pour un tutoriel sur la façon de faire ce que vous cherchez: https://www.raspberrypi.org/forums/viewtopic.php?t=72435

Si vous êtes intéressé par le transcodage, je viens de publier une réponse à une autre question qui pourrait vous intéresser: à quelle vitesse puis-je m'attendre de l'encodage matériel H264?

M. Rubio-Roy
la source
Merci! Je ne peux pas tester cela pour le moment mais accepterai à l'avance en fonction de votre tutoriel.
Szabolcs
1

On dirait qu'en compilant ffmpeg par vous-même, sur RPi3B + vous pouvez obtenir

CODAGE D'UNE VIDÉO HAUTE COMPLEXITÉ DE 30 FPS À PARTIR D'UNE SÉQUENCE D'IMAGES JPEG 1920 X 1080 - MOUVEMENT IMPORTANT ET DÉTAIL INTRAFRAME - PARAMÈTRES DE HAUTE QUALITÉ:

Encodage H.264 basé sur logiciel (CPU): 2,6 FPS (11,5 fois plus lent qu'en temps réel)

Encodage H.264 basé sur le matériel (GPU): 6,3 FPS (4,8 fois plus lent qu'en temps réel)

CODAGE D'UNE VIDÉO HAUTE COMPLEXITÉ DE 30 FPS À PARTIR D'UNE SÉQUENCE D'IMAGES JPEG 640 X 480 JPEG - MOUVEMENT SIGNIFICATIF ET DÉTAIL INTRAFRAME - RÉGLAGES DE HAUTE QUALITÉ:

Encodage H.264 basé sur logiciel (CPU): 18 FPS (1,7 fois plus lent qu'en temps réel)

Encodage H.264 basé sur le matériel (GPU): 38 FPS (1,3 fois PLUS RAPIDE qu'en temps réel)

Le script pour aider à réaliser tout cela est dans un fil de discussion .

akostadinov
la source