#1 Le 24/03/2011, à 16:11
- Drimux
Capture vidéo OpenGL & conversion sous ffmpeg
Bien le bonjour!
Je lutte actuellement depuis bien une semaine avec ffmpeg :
En fait, j'aimerais réaliser une capture vidéo d'un jeu sous Java, qui comprend le son du microphone et du jeu. Pour cela, j'utilise ffmpeg qui, au contraire de recordMyDesktop ou XVidCap, permet de capturer sans grosses saccades, les phases de jeu. Ainsi je peux à la fois commenter et faire entendre le son du jeu.
Une fois la vidéo réalisée, toujours avec l'aide de ffmpeg, je la convertis pour un format mp4 pour Youtube, mais c'est là que ça coince, car autant la vidéo est lisible impeccablement sur Ubuntu sans problèmes, autant sur Youtube, celle-ci est accélérée... Ajouté à cela, qu'étrangement, lorsque j'utilise par exemple Avidemux pour retravailler la vidéo mp4 -histoire de couper les bouts par exemple-, le son est décalé, alors qu'il ne l'est pas lors de la lecture de la vidéo d'origine sous VLC...
Je résume les étapes pour arriver à ce résultat :
Je forme une "boucle" pour que le mic puisse être enregistré :
pacat -r --latency-msec=x | pacat -p --latency-msec=x
avec un ajustement du latency-msec pour que ça soit plus ou moins synchro et que l'écho ne soit pas gênant [Il y a moyen de passer par VLC via l'exécution de "vlc alsa://hw:0,0" mais cela entraine un temps de latence].
Je lance ffmpeg :
ffmpeg -f alsa -ac 2 -i pulse -aq 4 -f x11grab -r 30 -s 1680x1050 -aspect 16:10 -i :0.0 -acodec pcm_s16le -vcodec libx264 -vpre lossless_ultrafast -threads 0 in.mkv
Il en ressort une vidéo impeccable en mkv, de la résolution de mon écran. Le seul problème, c'est le poids qui peut être important. En plus mieux vaudrait changer la résolution.
Dès lors, je convertis la vidéo pour Youtube :
1ère manière (sans passe)
ffmpeg -i in.mkv -s 1280x720 -aspect 16:9 -vcodec libx264 -vpre fast -crf 18 -threads 0 -acodec libfaac -ab 320k -y out.mp4
Le fichier out.mp4 est impeccable sous VLC, comportant un poids raisonnable ; mais le son est décalé quand je désire retravailler la dite vidéo sous Avidemux Pire, quand je la transfère sur Youtube, ma vidéo de près de 3 minutes se transforme en une vidéo d'une cinquantaine de secondes!
2ème manière (avec 2 passes)
ffmpeg -i in.mkv -s 1280x720 -aspect 16:9 -r 30000/1001 -b 10000k -vcodec libx264 -pass 1 -vpre fast_firstpass -an out.mp4 && ffmpeg -y -i in.mkv -s 1280x720 -aspect 16:9 -r 30000/1001 -b 10000k -vcodec libx264 -pass 2 -vpre fast -acodec libfaac -ac 2 -ar 48000 -ab 320k out.mp4
Même constat, si ce n'est que le mp4 obtenu est bien plus lourd...
J'avoue m'être inspiré de sources grappillés ça et là, mais je n'arrive pas à un résultat concluant... Donc si quelqu'un pouvait ajuster tout cela, je lui (ou leur) en serais vraiment reconnaissant!
Merci,
Bien à vous.
[J'ignore si c'est la bonne section pour ce sujet... auquel cas, si vous pouviez déplacer ce topic dans "Lecture et configuration multimédia", merci !]
Résolution
1./ Former une "boucle" pour que le mic puisse être enregistré :
pacat -r --latency-msec=x | pacat -p --latency-msec=x
2./ Screencast :
ffmpeg -f alsa -ac 2 -i pulse -aq 4 -f x11grab -r 30 -s 1680x1050 -aspect 16:10 -i :0.0 -acodec pcm_s16le -vcodec libx264 -vpre lossless_ultrafast -threads 0 -s 1280x720 in.mkv
Et ainsi récupérer directement le mkv pour l'envoyer sur Youtube.
Dernière modification par Drimux (Le 06/05/2011, à 12:53)
Hors ligne
#2 Le 24/03/2011, à 18:47
- Gatsu
Re : Capture vidéo OpenGL & conversion sous ffmpeg
Salut Drimux,
Youtube gère très bien le format .mkv avec les codec x264, AAC ou Ogg. Tu devrais tester.
D'une manière générale, je remux mon fichier une dernière fois avec mkvtoolnix avant d'envoyer sur Youtube. De cette façon je n'ai jamais eu de problème de synchro.
Tu peux aussi essayer de remplacer certaines options de ta ligne de commande pour la capture
[...] -vcodec libx264 -vpre lossless_ultrafast [...] in.mkv
par
[...] -sameq [...] in.m2v
Chez moi ça consomme beaucoup moins de ressources CPU, pour une taille de fichier et une qualité équivalente.
Tu peux même faire :
[...] -sameq [...] -s 1280x720 in.m2v
le 2è -s te redimensionnera ta vidéo à la bonne taille avant de d'encoder l'image capturée, ce qui réduit encore la consommation CPU.
D'une manière générale, je fais mes montages de cette façon:
- capture avec ffmpeg au format .m2v (codec MPEG-2 et option -an, donc sans son, sur Regnum les sons ne sont pas très intéressants)
- remux direct en .mkv avec mkvtoolnix. La gestion des .mkv est plus rapide que le .m2v dans openshot video.
- montage de la video avec openshot video. Sortie en .matroska avec codec video MPEG-2 au maxi et son en AAC.
- reconversion finale en 2 passes avec avidemux pour une compression video sans perte visible, en .mp4 (x264 + AAC) pour own3d.tv , ou en .mkv (x264 + Ogg) suivi d'un remux avec mkvtoolnix pour Youtube.
Tu peux voir mes montages dans ma signature.
Hors ligne
#3 Le 24/03/2011, à 19:08
- Drimux
Re : Capture vidéo OpenGL & conversion sous ffmpeg
Merci d'avoir répondu
Youtube gère très bien le format .mkv
En effet, j'avais testé d'envoyer directement le fichier mkv, il n'y avait alors aucun problème de son, malheureusement la résolution était exécrable, le rendu devenant illisible, flou... une horreur!
En outre, j'avais également tenté d'encoder directement en résolution : -s 1280x720 seulement... la capture vidéo ne considérait qu'un seul morceau de l'écran ! Et non une mise à l'échelle de celui-ci.
Je vais tenter les différentes commandes que tu proposes, et je verrai ; j'espère que ça s'arrangera!
Merci en tout cas!
Hors ligne
#4 Le 24/03/2011, à 19:38
- Gatsu
Re : Capture vidéo OpenGL & conversion sous ffmpeg
En effet, j'avais testé d'envoyer directement le fichier mkv, il n'y avait alors aucun problème de son, malheureusement la résolution était exécrable, le rendu devenant illisible, flou... une horreur!
Oui j'ai ça aussi, la qualité de la conversion sur Youtube est franchement crade, c'est pour ça que j'utilise principalement own3d.tv
Je vais tenter de faire quelques tests en .mp4 sur mon compte Youtube pour voir si c'est mieux.
En outre, j'avais également tenté d'encoder directement en résolution : -s 1280x720 seulement... la capture vidéo ne considérait qu'un seul morceau de l'écran ! Et non une mise à l'échelle de celui-ci.
En fait le 1er -s dit quelle partie de l'écran il faut capturer, et le 2è -s redimensionne cette partie.
Voici par exemple ma ligne de commande pour mes captures de Regnum
ffmpeg -sameq -f x11grab -s 1440x900 -r 30 -i :0.0+4,49 -s 720x450 -an screencast.m2v
Je joue en fenêtré 1440x900. Le +4,49 dans l'option -i permet de décaler le point haut droit de la zone de capture de 4px vers la gauche et 49px vers le bas, ce qui me permet de capturer que la partie intéressante quand je colle ma fenêtre de jeu en haut à gauche de l'écran.
Donc pour toi, si tu veux tout l'écran, tu gardes ton 1er -s 1680x1050, tu laisses ton -i :0.0 et tu redimensionnes avec le 2è -s 1280x720 (j'utiliserais plutôt 1152x720 pour garder l'aspect ratio 16:10).
Hors ligne
#5 Le 24/03/2011, à 20:28
- Drimux
Re : Capture vidéo OpenGL & conversion sous ffmpeg
Et bien effectivement, ça a l'air de bien fonctionner en redimensionnant directement la vidéo! J'ignorais que ça pouvait considérer les deux paramètres -s
Un tout tout grand merci !
Par ailleurs, sur le forum anglais on m'a proposé ceci :
ffmpeg -i in.mkv -s 1280x720 -aspect 16:9 -vcodec libx264 -vpre fast -vpre main -crf 18 -threads 0 -acodec libfaac -ab 320k -y out.mp4
C'est-à-dire rajouter le -vpre main
Mais... ça n'a rien changé sur Youtube, la vidéo est toujours accélérée. Je vais me résoudre à utiliser directement le mkv alors =p
Je passe en résolu
Hors ligne
#6 Le 24/03/2011, à 20:50
- Gatsu
Re : Capture vidéo OpenGL & conversion sous ffmpeg
Je pourrais pas te dire quoi que ce soit concernant les options de x264, je n'ai pas franchement fait de test dessus. Mais mettre 2 -vpre dans une même ligne de commande ffmpeg me parait bizarre :
> http://www.ffmpeg.org/ffmpeg-doc.html#SEC13
Je pense que seul le 2è est pris en compte.
Pour ma part, je n'utilise qu'avidemux avec les options par défaut pour faire du x264, en changeant juste le bitrate.
Mais bon, c'est tellement lent que ça doit être la qualité maximale.
J'ai fait un test sur mon compte Youtube en .mkv et .mp4 avec la même vidéo, j'ai pas vu de différence. C'est aussi moche les deux.
Hors ligne
#7 Le 06/05/2011, à 12:53
- Drimux
Re : Capture vidéo OpenGL & conversion sous ffmpeg
C'est encore moi ;p
Je remonte le sujet car confronté à un autre problème.
J'ai migré sur la version 11.04, et j'ai, tout comme la précédente mouture, compilé ffmpeg. Seulement quand je relance la commande de capture vidéo, le terminal me renvoie une erreur :
Incompatible pixel format 'bgra' for codec 'libx264', auto-selecting format 'yuv420p'
Donc le fichier n'est pas selon le codec libx264, et est bien plus lourd fatalement.
Quelqu'un a une solution ? merci
Hors ligne
#8 Le 06/05/2011, à 14:11
- Gatsu
Re : Capture vidéo OpenGL & conversion sous ffmpeg
Incompatible pixel format 'bgra' for codec 'libx264', auto-selecting format 'yuv420p'
Donc le fichier n'est pas selon le codec libx264, et est bien plus lourd fatalement.
Je ne vois pas ce qui te fait dire que cet avertissement à une quelconque relation de cause à effet avec la taille de fichier ou que ce n'est pas encodé avec libx264.
Hors ligne