FAQ FFmpeg
1 Questions générales
1.1 Pourquoi FFmpeg ne prend-il pas en charge la fonctionnalité [xyz] ?
Parce que personne ne s'est encore chargé de cette tâche. Le développement de FFmpeg est guidé par les tâches importantes pour chaque développeur. Si une fonctionnalité vous tient à cœur, le meilleur moyen d'en obtenir la mise en œuvre est de vous charger vous-même de la tâche ou de sponsoriser un développeur.
1.2 FFmpeg ne prend pas en charge le codec XXX. Pouvez-vous inclure un chargeur de DLL Windows pour le prendre en charge ?
Non. Les DLL Windows ne sont pas portables, sont volumineuses et souvent lentes. De plus, FFmpeg s'efforce de prendre en charge tous les codecs de façon native. Un chargeur de DLL ne contribue pas à cet objectif.
1.3 Je n'arrive pas à lire ce fichier alors que ce format semble pourtant pris en charge par ffmpeg.
Même si ffmpeg sait lire le format container, il ne prend pas forcément en charge tous ses codecs. Consultez la liste des codecs pris en charge dans la documentation de ffmpeg.
1.4 Quels codecs Windows prend-il en charge ?
Windows ne prend pas bien en charge les formats standard comme MPEG, à moins d'installer des codecs supplémentaires.
La liste suivante de codecs vidéo devrait fonctionner sur la plupart des systèmes Windows :
msmpeg4v2
.avi/.asf
msmpeg4
.asf uniquement
wmv1
.asf uniquement
wmv2
.asf uniquement
mpeg4
Seulement si un codec MPEG-4 comme ffdshow ou Xvid est installé.
mpeg1video
.mpg uniquement
Notez que sous Windows, les fichiers ASF ont souvent une extension .wmv ou .wma. Il convient également de mentionner que Microsoft revendique un brevet sur le format ASF et pourrait poursuivre ou menacer les utilisateurs qui créent des fichiers ASF avec un logiciel autre que Microsoft. Il est fortement conseillé d'éviter ASF autant que possible.
La liste suivante de codecs audio devrait fonctionner sur la plupart des systèmes Windows :
adpcm_ima_wav adpcm_ms pcm_s16le
toujours
libmp3lame
Si un codec MP3 comme LAME est installé.
2 Compilation
2.1 error: can't find a register in class 'GENERAL_REGS' while reloading 'asm'
Il s'agit d'un bogue de gcc. Ne nous le signalez pas. Signalez-le plutôt aux développeurs de gcc. Notez que nous n'ajouterons pas de contournements pour les bogues de gcc.
Notez également que certains développeurs de gcc estiment que ce n'est pas un bogue, ou du moins pas un bogue qu'ils doivent corriger : https://gcc.gnu.org/bugzilla/show_bug.cgi?id=11203. Cela dit, certains d'entre eux ne font pas la différence entre un problème indécidable et un problème NP-difficile...
2.2 J'ai installé cette bibliothèque avec le gestionnaire de paquets de ma distribution. Pourquoi configure ne la voit-il pas ?
Les distributions répartissent généralement les bibliothèques entre plusieurs paquets. Le paquet principal contient les fichiers nécessaires pour exécuter les programmes utilisant la bibliothèque. Le paquet de développement contient les fichiers nécessaires pour compiler les programmes utilisant la bibliothèque. Parfois, la documentation et/ou les données se trouvent aussi dans un paquet séparé.
Pour compiler FFmpeg, vous devez installer le paquet de développement. Il s'appelle généralement libfoo-dev ou libfoo-devel. Vous pouvez le supprimer une fois la compilation terminée, mais veillez à conserver le paquet principal.
2.3 Comment faire en sorte que pkg-config trouve mes bibliothèques ?
Quelque part avec vos bibliothèques se trouve un fichier .pc (ou plusieurs) dans un répertoire pkgconfig. Vous devez définir des variables d'environnement pour indiquer à pkg-config où se trouvent ces fichiers.
Si vous devez ajouter des répertoires à la liste de recherche de pkg-config (cas typique : bibliothèque installée séparément), ajoutez-les à $PKG_CONFIG_PATH :
export PKG_CONFIG_PATH=/opt/x264/lib/pkgconfig:/opt/opus/lib/pkgconfig
Si vous devez remplacer la liste de recherche de pkg-config (cas typique : compilation croisée), définissez-la dans $PKG_CONFIG_LIBDIR :
export PKG_CONFIG_LIBDIR=/home/me/cross/usr/lib/pkgconfig:/home/me/cross/usr/local/lib/pkgconfig
Si vous devez connaître les dépendances internes de la bibliothèque (usage typique : liaison statique), ajoutez l'option --static à pkg-config :
./configure --pkg-config-flags=--static
2.4 Comment utiliser pkg-config lors d'une compilation croisée ?
Le mieux est d'installer pkg-config dans votre environnement de compilation croisée. Il utilise alors automatiquement les bibliothèques de compilation croisée.
Vous pouvez aussi utiliser le pkg-config de l'environnement hôte en précisant explicitement --pkg-config=pkg-config à configure. Dans ce cas, vous devez indiquer à pkg-config les bons répertoires via PKG_CONFIG_LIBDIR, comme expliqué dans l'entrée précédente.
Comme solution intermédiaire, vous pouvez placer dans votre environnement de compilation croisée un script qui appelle le pkg-config de l'hôte avec PKG_CONFIG_LIBDIR défini. Ce script peut ressembler à ceci :
#!/bin/sh
PKG_CONFIG_LIBDIR=/path/to/cross/lib/pkgconfig
export PKG_CONFIG_LIBDIR
exec /usr/bin/pkg-config "$@"
3 Utilisation
3.1 ffmpeg ne fonctionne pas ; qu'est-ce qui cloche ?
Essayez un make distclean dans le répertoire source de ffmpeg avant la compilation. Si cela ne suffit pas, consultez (https://ffmpeg.org/bugreports.html).
3.2 Comment encoder des images fixes en films ?
Renommez d'abord vos images pour suivre une séquence numérique. Par exemple, img1.jpg, img2.jpg, img3.jpg,... Vous pouvez ensuite exécuter :
ffmpeg -f image2 -i img%d.jpg /tmp/a.mpg
Notez que ‘%d’ est remplacé par le numéro de l'image.
img%03d.jpg désigne la séquence img001.jpg, img002.jpg, etc.
Utilisez l'option -start_number pour déclarer un numéro de départ pour la séquence. Cela est utile si votre séquence ne commence pas par img001.jpg mais respecte tout de même un ordre numérique. L'exemple suivant commencera par img100.jpg :
ffmpeg -f image2 -start_number 100 -i img%d.jpg /tmp/a.mpg
Si vous avez un grand nombre d'images à renommer, la commande suivante peut vous simplifier la tâche. Cette commande, écrite avec la syntaxe du shell bourne, crée des liens symboliques vers tous les fichiers du répertoire courant correspondant à *jpg, dans le répertoire /tmp, en les nommant img001.jpg, img002.jpg, etc.
x=1; for i in *jpg; do counter=$(printf %03d $x); ln -s "$i" /tmp/img"$counter".jpg; x=$(($x+1)); done
Si vous voulez les classer en commençant par la modification la plus ancienne, remplacez *jpg par $(ls -r -t *jpg).
Puis exécutez :
ffmpeg -f image2 -i /tmp/img%03d.jpg /tmp/a.mpg
La même logique s'applique à tout format d'image que ffmpeg sait lire.
Vous pouvez aussi utiliser cat pour transmettre des images à ffmpeg par un tube :
cat *.jpg | ffmpeg -f image2pipe -c:v mjpeg -i - output.mpg
3.3 Comment convertir un film en images fixes ?
Utilisez :
ffmpeg -i movie.mpg movie%d.jpg
Le fichier movie.mpg utilisé en entrée sera converti en movie1.jpg, movie2.jpg, etc...
Plutôt que de vous fier à la reconnaissance automatique du format de fichier, vous pouvez aussi utiliser
-c:v ppm -c:v png -c:v mjpeg
pour forcer l'encodage.
En appliquant cela à l'exemple précédent :
ffmpeg -i movie.mpg -f image2 -c:v mjpeg menu%d.jpg
Attention, il n'existe pas de codec "jpeg". Utilisez "mjpeg" à la place.
3.4 Pourquoi une légère dégradation de la qualité apparaît-elle avec l'encodage MPEG* multithread ?
Pour l'encodage MPEG* multithread, les slices encodées doivent être indépendantes ; sans quoi le thread n devrait en pratique attendre la fin du thread n-1, si bien qu'une légère réduction de qualité est parfaitement logique. Ce n'est pas un bogue.
3.5 Comment lire depuis l'entrée standard ou écrire vers la sortie standard ?
Utilisez - comme nom de fichier.
3.6 -f jpeg ne fonctionne pas.
Essayez ’-f image2 test%d.jpg’.
3.7 Pourquoi ne puis-je pas changer la fréquence d'images ?
Certains codecs, comme MPEG-1/2, n'autorisent qu'un petit nombre de fréquences d'images fixes. Choisissez un autre codec avec l'option de ligne de commande -c:v.
3.8 Comment encoder une vidéo Xvid ou DivX avec ffmpeg ?
Xvid et DivX (version 4 et ultérieures) sont tous deux des implémentations de la norme ISO MPEG-4 (notez que de nombreux autres formats de codage utilisent cette même norme). Utilisez donc ’-c:v mpeg4’ pour encoder dans ces formats. Le fourcc par défaut enregistré dans un fichier codé en MPEG-4 sera ’FMP4’. Si vous voulez un fourcc différent, utilisez l'option ’-vtag’. Par exemple, ’-vtag xvid’ forcera l'enregistrement du fourcc ’xvid’ comme fourcc vidéo à la place de la valeur par défaut.
3.9 Quels paramètres donnent de bons résultats pour encoder du MPEG-4 de haute qualité ?
’-mbd rd -flags +mv4+aic -trellis 2 -cmp 2 -subcmp 2 -g 300 -pass 1/2’, choses à essayer : ’-bf 2’, ’-mpv_flags qp_rd’, ’-mpv_flags mv0’, ’-mpv_flags skip_rd’.
3.10 Quels paramètres donnent de bons résultats pour encoder du MPEG-1/MPEG-2 de haute qualité ?
’-mbd rd -trellis 2 -cmp 2 -subcmp 2 -g 100 -pass 1/2’, mais attention, ’-g 100’ peut poser des problèmes avec certains decoders. Choses à essayer : ’-bf 2’, ’-mpv_flags qp_rd’, ’-mpv_flags mv0’, ’-mpv_flags skip_rd’.
3.11 La vidéo entrelacée est très dégradée une fois encodée avec ffmpeg, qu'est-ce qui ne va pas ?
Utilisez ’-flags +ilme+ildct’ et éventuellement ’-flags +alt’ pour du contenu entrelacé ; essayez ’-top 0/1’ si le résultat semble vraiment brouillé.
3.12 Comment lire des fichiers DirectShow ?
Si vous avez compilé FFmpeg avec ./configure --enable-avisynth (possible uniquement sur les plateformes MinGW/Cygwin), vous pouvez alors utiliser en entrée tout fichier que DirectShow sait lire.
Créez simplement un fichier texte "input.avs" avec cette seule ligne...
DirectShowSource("C:\path to your file\yourfile.asf")
... puis transmettez ce fichier texte à ffmpeg :
ffmpeg -i input.avs
Pour toute autre aide sur AviSynth, consultez la page d'accueil d'AviSynth.
3.13 Comment réunir des fichiers vidéo ?
"Réunir" des fichiers vidéo est une notion assez ambiguë. La liste suivante explique les différents types de "réunion" et précise comment ils sont traités dans FFmpeg. Réunir des fichiers vidéo peut vouloir dire :
- Les mettre bout à bout : c'est ce qu'on appelle les concaténer (en abrégé : concat), et c'est justement le sujet de cette FAQ.
- Les réunir dans un même fichier, pour laisser l'utilisateur choisir entre les différentes versions (exemple : langues audio différentes) : c'est ce qu'on appelle les multiplexer (en abrégé : mux), ce qui s'obtient simplement en invoquant ffmpeg avec plusieurs options -i.
- Pour l'audio, réunir tous les canaux dans un seul flux (exemple : deux flux mono en un flux stéréo) : on parle parfois de les fusionner (merge), ce qui peut se faire avec le filtre
amerge. - Pour l'audio, faire jouer l'un par-dessus l'autre : c'est ce qu'on appelle les mixer (mix), ce qui peut se faire en les fusionnant d'abord en un seul flux, puis en utilisant le filtre
panpour mélanger les canaux à volonté. - Pour la vidéo, afficher les deux ensemble, côte à côte ou l'un par-dessus une partie de l'autre ; cela peut se faire avec le filtre vidéo
overlay.
3.14 Comment concaténer des fichiers vidéo ?
Il existe plusieurs solutions, selon les circonstances exactes.
3.14.1 Concaténation avec le filtre concat
FFmpeg dispose d'un filtre concat conçu spécialement à cet effet, avec des exemples dans la documentation. Cette méthode est recommandée si vous devez réencoder.
3.14.2 Concaténation avec le demuxer concat
FFmpeg dispose d'un demuxer concat que vous pouvez utiliser lorsque vous voulez éviter un réencodage et que votre format ne prend pas en charge la concaténation au niveau du fichier.
3.14.3 Concaténation avec le protocole concat (au niveau du fichier)
FFmpeg dispose d'un protocole concat conçu spécialement à cet effet, avec des exemples dans la documentation.
Quelques containers multimédias (MPEG-1, MPEG-2 PS, DV) permettent de concaténer de la vidéo simplement en concaténant les fichiers qui la contiennent.
Vous pouvez donc concaténer vos fichiers multimédias en les transcodant d'abord vers ces formats privilégiés, puis en utilisant l'humble commande cat (ou son équivalent tout aussi humble copy sous Windows), et enfin en retranscodant vers le format de votre choix.
ffmpeg -i input1.avi -qscale:v 1 intermediate1.mpg
ffmpeg -i input2.avi -qscale:v 1 intermediate2.mpg
cat intermediate1.mpg intermediate2.mpg > intermediate_all.mpg
ffmpeg -i intermediate_all.mpg -qscale:v 2 output.avi
Vous pouvez également utiliser le protocole concat au lieu de cat ou copy, ce qui évite de créer un fichier intermédiaire potentiellement énorme.
ffmpeg -i input1.avi -qscale:v 1 intermediate1.mpg
ffmpeg -i input2.avi -qscale:v 1 intermediate2.mpg
ffmpeg -i concat:"intermediate1.mpg|intermediate2.mpg" -c copy intermediate_all.mpg
ffmpeg -i intermediate_all.mpg -qscale:v 2 output.avi
Notez que vous devrez peut-être échapper le caractère "|", qui a une signification particulière dans de nombreux shells.
Une autre option consiste à utiliser des tubes nommés (named pipes), si votre plateforme le permet :
mkfifo intermediate1.mpg
mkfifo intermediate2.mpg
ffmpeg -i input1.avi -qscale:v 1 -y intermediate1.mpg < /dev/null &
ffmpeg -i input2.avi -qscale:v 1 -y intermediate2.mpg < /dev/null &
cat intermediate1.mpg intermediate2.mpg |\
ffmpeg -f mpeg -i - -c:v mpeg4 -c:a libmp3lame output.avi
3.14.4 Concaténation avec de l'audio et de la vidéo bruts
De même, le format yuv4mpegpipe, ainsi que les codecs vidéo et audio bruts (raw), permettent eux aussi la concaténation, et l'étape de transcodage est presque sans perte. Lorsqu'on utilise plusieurs yuv4mpegpipe, il faut écarter la première ligne de tous les flux sauf le premier. Cela peut se faire en passant par tail via un tube, comme ci-dessous. Notez qu'en passant par tail via un tube, vous devez utiliser le regroupement de commandes, { ;}, pour un passage correct en arrière-plan.
Par exemple, disons que l'on veut concaténer deux fichiers FLV en un fichier output.flv :
mkfifo temp1.a
mkfifo temp1.v
mkfifo temp2.a
mkfifo temp2.v
mkfifo all.a
mkfifo all.v
ffmpeg -i input1.flv -vn -f u16le -c:a pcm_s16le -ac 2 -ar 44100 - > temp1.a < /dev/null &
ffmpeg -i input2.flv -vn -f u16le -c:a pcm_s16le -ac 2 -ar 44100 - > temp2.a < /dev/null &
ffmpeg -i input1.flv -an -f yuv4mpegpipe - > temp1.v < /dev/null &
{ ffmpeg -i input2.flv -an -f yuv4mpegpipe - < /dev/null | tail -n +2 > temp2.v ; } &
cat temp1.a temp2.a > all.a &
cat temp1.v temp2.v > all.v &
ffmpeg -f u16le -c:a pcm_s16le -ac 2 -ar 44100 -i all.a \
-f yuv4mpegpipe -i all.v \
-y output.flv
rm temp[12].[av] all.[av]
3.15 Avec -f lavfi, l'audio devient mono sans raison apparente.
Utilisez -dumpgraph - pour déterminer exactement où la disposition des canaux se perd.
C'est très probablement dû à auto-inserted aresample. Essayez de comprendre pourquoi le filtre de conversion était nécessaire à cet endroit.
L'endroit le plus probable se situe juste avant la sortie, car -f lavfi ne prend pour l'instant en charge que le S16 packed.
Insérez ensuite le bon aformat explicitement dans le filtergraph, en précisant le format exact.
aformat=sample_fmts=s16:channel_layouts=stereo
3.16 Pourquoi FFmpeg ne voit-il pas les sous-titres de mon fichier VOB ?
VOB et quelques autres formats n'ont pas d'en-tête global décrivant tout le contenu du fichier. Les applications sont plutôt censées analyser le fichier pour en découvrir le contenu. Comme les fichiers VOB sont souvent volumineux, seul le début est analysé. Si les sous-titres n'apparaissent que plus loin dans le fichier, ils ne seront pas détectés au départ.
Certaines applications, y compris l'outil en ligne de commande ffmpeg, ne peuvent traiter que les flux détectés lors de l'analyse initiale ; les flux détectés plus tard sont ignorés.
La taille de l'analyse initiale est contrôlée par deux options : probesize (par défaut ~5 Mo) et analyzeduration (par défaut 5,000,000 µs = 5 s). Pour que le flux de sous-titres soit détecté, les deux valeurs doivent être suffisamment grandes.
3.17 Pourquoi l'option -sameq de ffmpeg a-t-elle été supprimée ? Que faut-il utiliser à la place ?
L'option -sameq signifiait "same quantizer" (même quantificateur), et n'avait de sens que dans un ensemble de cas très restreint. Malheureusement, beaucoup de gens l'ont confondue avec "same quality" (même qualité) et l'ont utilisée dans des situations où cela n'avait pas de sens : elle produisait à peu près l'effet visible attendu, mais de façon très inefficace.
Chaque encoder dispose de son propre jeu d'options pour régler l'équilibre entre qualité et taille ; utilisez les options de l'encoder que vous employez pour fixer le niveau de qualité qui vous convient. Les options les plus courantes pour cela sont -qscale et -qmax, mais il convient de consulter la documentation de l'encoder choisi.
3.18 J'ai une vidéo étirée, pourquoi la mise à l'échelle ne corrige-t-elle pas cela ?
De nombreux codecs et formats vidéo peuvent enregistrer le rapport d'aspect de la vidéo : c'est le rapport entre la largeur et la hauteur, que ce soit de l'image entière (DAR, display aspect ratio) ou de chaque pixel (SAR, sample aspect ratio). Par exemple, les écrans EGA en résolution 640×350 avaient un DAR de 4:3 et un SAR de 35:48.
La plupart des traitements d'images fixes fonctionnent avec des pixels carrés, c'est-à-dire un SAR de 1:1, mais de nombreuses normes vidéo, en particulier celles de l'ère de transition analogique-numérique, utilisent des pixels non carrés.
La plupart des filtres de traitement de FFmpeg gèrent le rapport d'aspect afin d'éviter d'étirer l'image : le rognage ajuste le DAR pour garder le SAR constant, la mise à l'échelle ajuste le SAR pour garder le DAR constant.
Si vous voulez étirer, ou “dé-étirer”, l'image, vous devez remplacer cette information par les setdar or setsar filters.
N'oubliez pas d'examiner attentivement la vidéo d'origine pour vérifier si l'étirement provient de l'image elle-même ou de l'information de rapport d'aspect.
Par exemple, pour corriger une capture EGA mal encodée, utilisez les commandes suivantes : la première pour agrandir vers des pixels carrés, la deuxième pour définir le rapport d'aspect correct, ou la troisième pour éviter le transcodage (qui peut ne pas fonctionner selon le format, le codec, le lecteur ou la phase de la lune) :
ffmpeg -i ega_screen.nut -vf scale=640:480,setsar=1 ega_screen_scaled.nut
ffmpeg -i ega_screen.nut -vf setdar=4/3 ega_screen_anamorphic.nut
ffmpeg -i ega_screen.nut -aspect 4/3 -c copy ega_screen_overridden.nut
3.19 Comment exécuter ffmpeg en tâche de fond ?
ffmpeg vérifie normalement l'entrée console, pour repérer des saisies comme "q" pour s'arrêter ou "?" pour afficher l'aide, pendant qu'il effectue ses opérations. ffmpeg n'a aucun moyen de détecter qu'il s'exécute en tâche de fond. Cette vérification de l'entrée console peut provoquer la suspension du processus exécutant ffmpeg en arrière-plan.
Pour éviter ces vérifications d'entrée et permettre à ffmpeg de s'exécuter en tâche de fond, utilisez l'option -nostdin lors de l'invocation de ffmpeg. Cela fonctionne aussi bien si vous exécutez ffmpeg dans un shell que si vous l'invoquez comme processus indépendant via une API du système d'exploitation.
Autre possibilité, lorsque vous exécutez ffmpeg dans un shell : vous pouvez rediriger l'entrée standard vers /dev/null (sous Linux et macOS) ou NUL (sous Windows). Vous pouvez effectuer cette redirection soit lors de l'invocation de ffmpeg, soit depuis un script shell qui appelle ffmpeg.
Par exemple :
ffmpeg -nostdin -i INPUT OUTPUT
ou (sous Linux, macOS et les autres shells de type UNIX) :
ffmpeg -i INPUT OUTPUT </dev/null
ou (sous Windows) :
ffmpeg -i INPUT OUTPUT <NUL
3.20 Comment éviter que ffmpeg ne se suspende avec un message du type suspended (tty output) ?
Si vous exécutez ffmpeg en arrière-plan, il se peut que son processus se suspende. Un message du type suspended (tty output) peut alors apparaître. La question est de savoir comment empêcher cette suspension du processus.
Par exemple :
% ffmpeg -i INPUT OUTPUT &> ~/tmp/log.txt &
[1] 93352
%
[1] + suspended (tty output) ffmpeg -i INPUT OUTPUT &>
Malgré le message "tty output", le vrai problème est que ffmpeg vérifie normalement l'entrée console lors de son exécution. Le système d'exploitation détecte cela et suspend le processus jusqu'à ce que vous puissiez le remettre au premier plan et vous en occuper.
La solution consiste à utiliser les techniques adéquates pour indiquer à ffmpeg de ne pas consulter l'entrée console. Vous pouvez utiliser l'option -nostdin, ou rediriger l'entrée standard avec < /dev/null. Voir la question de la FAQ Comment exécuter ffmpeg en tâche de fond ? pour plus de détails.
4 Développement
4.1 Existe-t-il des exemples illustrant l'utilisation des bibliothèques FFmpeg, notamment libavcodec et libavformat ?
Oui. Consultez le répertoire doc/examples du dépôt source, également disponible en ligne à : https://github.com/FFmpeg/FFmpeg/tree/master/doc/examples.
Les exemples sont aussi installés par défaut, généralement dans $PREFIX/share/ffmpeg/examples.
Vous pouvez aussi lire le Developers Guide de la documentation FFmpeg. Vous pouvez également examiner le code source de l'un des nombreux projets open source qui intègrent déjà FFmpeg, sur (projects.html).
4.2 Pouvez-vous prendre en charge mon compilateur C XXX ?
Cela dépend. Si votre compilateur est conforme à C99, les correctifs pour le prendre en charge seront probablement bien accueillis, à condition qu'ils ne polluent pas le code source avec des #ifdefs propres au compilateur.
4.3 Microsoft Visual C++ est-il pris en charge ?
Oui. Consultez la section Microsoft Visual C++ de la documentation FFmpeg.
4.4 Pouvez-vous ajouter la prise en charge d'automake, libtool ou autoconf ?
Non. Ces outils sont trop lourds et compliquent la compilation.
4.5 Pourquoi ne pas réécrire FFmpeg en C++ orienté objet ?
FFmpeg est déjà organisé de façon très modulaire et n'a pas besoin d'être réécrit dans un langage formellement orienté objet. De plus, beaucoup de développeurs préfèrent le C pur ; cela leur convient. Pour en savoir plus sur ce débat, lisez "Programming Religion".
4.6 Pourquoi les programmes ffmpeg sont-ils dépourvus de symboles de débogage ?
Le processus de compilation crée ffmpeg_g, ffplay_g, etc., qui contiennent toutes les informations de débogage. Ces binaires sont ensuite dépouillés (strip) pour créer ffmpeg, ffplay, etc. Si vous avez besoin des informations de débogage, utilisez les versions *_g.
4.7 Je n'aime pas la LGPL, puis-je contribuer du code sous GPL à la place ?
Oui, tant que le code est optionnel et peut être placé facilement et proprement sous #if CONFIG_GPL sans rien casser. Ainsi, par exemple, un nouveau codec ou un nouveau filtre pourrait être accepté sous GPL, alors qu'un correctif de bogue dans du code LGPL ne le pourrait pas.
4.8 J'utilise FFmpeg depuis mon application C, mais l'éditeur de liens se plaint de symboles manquants provenant des bibliothèques elles-mêmes.
FFmpeg compile des bibliothèques statiques par défaut. Dans les bibliothèques statiques, les dépendances ne sont pas gérées. Cela a deux conséquences. Premièrement, vous devez indiquer les bibliothèques dans l'ordre des dépendances : -lavdevice doit venir avant -lavformat, -lavutil doit venir après tout le reste, etc. Deuxièmement, les bibliothèques externes utilisées par FFmpeg doivent aussi être indiquées.
Un moyen simple d'obtenir la liste complète des bibliothèques requises, dans l'ordre des dépendances, est d'utiliser pkg-config.
c99 -o program program.c $(pkg-config --cflags --libs libavformat libavcodec)
Pour plus de détails, voir doc/example/Makefile et doc/example/pc-uninstalled.
4.9 J'utilise FFmpeg depuis mon application C++, mais l'éditeur de liens se plaint de symboles manquants qui semblent pourtant disponibles.
FFmpeg est un projet purement en C ; pour utiliser les bibliothèques dans votre application C++, vous devez indiquer explicitement que vous utilisez une bibliothèque C. Vous pouvez le faire en encadrant vos includes FFmpeg avec extern "C".
Voir http://www.parashift.com/c++-faq-lite/mixing-c-and-cpp.html#faq-32.3
4.10 J'utilise libavutil depuis mon application C++, mais le compilateur se plaint que ’UINT64_C’ n'est pas déclaré dans cette portée
FFmpeg est un projet purement en C qui utilise les fonctionnalités mathématiques de C99 ; pour permettre à C++ de les utiliser, vous devez ajouter -D__STDC_CONSTANT_MACROS à vos CXXFLAGS
4.11 J'ai un fichier en mémoire, ou une API différente de open/read/ de la libc, comment l'utiliser avec libavformat ?
Vous devez créer un AVIOContext personnalisé avec avio_alloc_context ; voir libavformat/aviobuf.c dans FFmpeg et libmpdemux/demux_lavf.c dans les sources de MPlayer ou MPlayer2.
4.12 Où se trouve la documentation sur ffv1, msmpeg4, asv1, 4xm ?
voir https://www.ffmpeg.org/~michael/
4.13 Comment transmettre du H.263-RTP (et d'autres codecs sur RTP) à libavcodec ?
Bien que particulier de par son orientation réseau, RTP est un container comme un autre. Il faut démultiplexer RTP avant de transmettre le payload à libavcodec. Pour ce cas précis, reportez-vous à la RFC 4629 pour savoir comment procéder.
4.14 AVStream.r_frame_rate est erroné, il est bien plus grand que la fréquence d'images.
r_frame_rate n'est PAS la fréquence d'images moyenne, mais la plus petite fréquence d'images capable de représenter précisément tous les horodatages. Donc non, ce n'est pas une erreur si elle est plus grande que la moyenne ! Par exemple, si vous avez un contenu mélangeant 25 et 30 fps, r_frame_rate vaudra 150 (c'est le plus petit commun multiple). Si vous cherchez la fréquence d'images moyenne, voir AVStream.avg_frame_rate.
4.15 Pourquoi make fate n'exécute-t-il pas tous les tests ?
Assurez-vous de disposer des échantillons fate-suite et que la variable Make SAMPLES, la variable d'environnement FATE_SAMPLES ou l'option --samples de configure pointe vers le bon chemin.
4.16 Pourquoi make fate ne trouve-t-il pas les échantillons ?
Avez-vous par hasard un caractère ~ dans le chemin des échantillons pour indiquer le répertoire personnel ? Cette valeur est utilisée d'une façon que le shell ne peut pas développer, ce qui empêche FATE de trouver les fichiers. Remplacez simplement ~ par le chemin complet.
Hébergement fourni par telepoint.bg