Bonjour! Je souhaite utiliser des fonctions de http://sourceforge.net/projects/ffmpeg/. Comme il y a les sources, je souhaite les intégrer à un projet cocoa et utiliser directement les fonctions au lieu de compiler ffmpeg puis utiliser des NSTasks (plus lent, pas pratique,...)
On m'a dit qu'il fallait changer le nom de la fonction "main" pour que ça marche.
Voici ce que j'ai réussi à faire:
--------------------------------------------------------------
Ajouté les sources ffmpeg à mon projet. C'est-à-dire que j'ai fait un drag'n'drop de:
-les 3 fichiers ".h" (berrno.h,...) qui sont dans le dossier principal, et les 2 fichiers ".c" (ffmpeg.c et ffserver.c)
-le dossier "libavcodec"
-le dossier "libavformat"
-le dosier "vhook"
J'ai compilé. Mais: erreur dans "ff.server.c": le fichier "<sys/poll.h>" n'existe pas alors qu'il est "includé". Je supprimer ffserver.c de mon projet
Je compile, mais là il faut ajouter ceci:
-"#include <math.h>" dans un des fichiers (sais plus lequel)
-"#include <string.h>" et "#include <stdio.h>" dans "a52dec.c"
Je compile, et ça demande le fichier "libac3/ac3.h" qui effectivement n'existe pas. En plus j'ai 138errors et 115warnings
--------------------------------------------------------------
Quelqu'un a-t-il déjà fait la manip' ? un p'tit coup de pouce serait le bienvenu...
D'avance, merci!
heu... j'y connais pas grand chose... Faut-il compiler les library ("libavformat et "libavcodec") puis seulement les inclure au projet?
EDIT: j'ai réussi à compiler "libavcodec":
alors voici le résultat de mes recherches, peut-être cela servira-t-il pour quelqu'un plus tard...
Il faut mettre ceci dans les Linker Settings (dans PB:Target:linker settings:other mach-o...)
Hello,
me voici 3 ans plus tard confronté à la librairie libavcodec.
Mon but est d'utiliser certaines fonctions de cette librairie pour tester quelques codecs vidéos.
Je compile ainsi la librairie ainsi que libavutil et libavformat, fournies avec le package ffmpeg. La compilation par le terminal génère libvavutil.a, libavcodec.a et libavformat.a.
Je crée donc une nouvelle application dans Xcode et ajoute les trois librairies statiques correspondantes dans le projet. Dans un premier temps, le main contient uniquement une seule fonction de la librairie libavcodec, afin de m'assurer que tout fonctionne bien. Pourtant la compilation génère l'erreur suivante:
Processing /Users/etudiants/test13/build/test13.build/Debug/test13.build/Objects-normal/ppc/libavcodec.ab
libavcodec.a(bitstream.o) has local relocation entries in non-writable section (__TEXT,__text)
Command /usr/bin/gcc-4.0 failed with exit code 1
J'avoue ne pas saisir d'où vient le problème (pourtant le main contient l'inclusion du header correspondant)
Merci pour votre aide
Syno
Voici les commandes exécutées à partir du dossier ffmpeg:
./configure
make
sudo make install
Où faut-il insérer cette option de compilation?
J'ai testé après le make mais l'option de compilation est inconnue...
Tu peux faire ./configure CFLAGS=-fPIC ./configure --extra-cflags=-fPIC
Mais en fait, cette option n'est pas nécessaire dans une librairie statique (.a), et elle est par défaut activée dans gcc donc cela ne devrait pas gêner.
Ceci dit, je viens de récupérer les sources de ffmpeg, ça compile, et je vois dans les arguments passés à cc une option "-mdynamic-no-pic" qui justement désactive le mode PIC.
Une erreur survient lors de la configuration avec cette option:
Creating config.mak and config.h...
mv: config.h: set owner/group (was: 502/0): Operation not permitted
Est-ce normal?
j'ai ajouté la commande sudo, la compilation de la lib a réussi.
Par contre cela n'a rien changé au niveau de la compilation de mon programme.
Mon but futur est de compiler le code source example "apiexample.c" fournit dans le package ffmpeg.
Je n'ai pas eu cette erreur !?
quelle version de ffmpeg as-tu récupéré ?
J'ai pour ma part pris la dernière version dispo via svn:
Peut-être une autre piste: essaies de cocher l'option "Generate Position Dependant Code" dans les options de ton projet Xcode.
Toujours rien!!
De ton côté as-tu essayé de créer un projet et d'utiliser cette librairie?
Je viens de tester avec une appli carbon qui appelle juste avcodec_init(), aucun problème ici.
Tu as la dernière version de Xcode ?
Oui j'ai la dernière version de Xcode.
Voici le détail de ma procédure:
-téléchargement de la dernière version de ffmpeg via svn
-compilation et installation de ffmep (à partir du dossier ffmpeg):
./configure
make
sudo make install
-Ceci génère les trois librairies suivantes:
libvavutil.a
libavcodec.a
libavformat.a
-J'ouvre alors une nouvelle application Carbon C
-Je modifie le main.c en lui ajoutant la fonction avcodec_init() et en spécifiant le header correspondant (#include 'avcodec.h')
-Je glisse alors les trois librairies.a dans le projet à partir de leur dossier respectif
-Je spécifie encore dans les builder settings/header path le chemin d'accès du dossier contenant le .h utilisé
Voilà, et après ceci la compilation échoue avec l'erreur décrite auparavant.
La partie que je ne maîtrise pas concerne l'insertion de la librairie. Faut-il vraiment inclure les .a dans le projet? Faut il lui spécifier un chemin d'accès pour ces librairies?Si oui où?
De ton côté, quel est ta façon de procéder?
Merci pour les infos, j'essaierai tout ça demain.
Par contre pourrais-tu m'en dire un peu plus sur les flags? Je ne connais pas ces notions.
Ce sont les options standard de gcc, ou plutôt de ld. Il faut que tu lises la man page de ld ("man ld" dans le terminal). Pour rechercher une expression dans une man page, tu peux te servir de "/" comme dans vi.
J'ai tout essayé mais toujours la même erreur.....???????!!!!!!!
EUREKA!!!!
Après trois jours d'intenses recherches, je me rends compte qu'il suffisait de décocher l'option "Build/Allow Zero Link".
Si qqn en sait un peu plus sur cette option.....
Encore merci, Chombier pour ton dévouement.
Syno
Content que tu t'en sois sorti !
L'option ZeroLink permet de gagner du temps lors du build de la version Debug. L'édition de liens n'est pas effectuée dans la phase de build, mais lors de l'exécution via Xcode.
Par contre est-il normal que le build échoue en mode release???
Euh... non. Quelle erreur as-tu ?
Voici l'erreur que j'obtiens lors de la compilation(et trois warning):
Building target VideoCodec of project VideoCodec with configuration Release (1 error, 3 warnings)
cd /Volumes/Divers/Jean_Mabillard/Projet_Master/Codec/Projet/VideoCodec
/usr/bin/g++-4.0 -o /Volumes/Divers/Jean_Mabillard/Projet_Master/Codec/Projet/VideoCodec/build/VideoCodec.build/Release/VideoCodec.build/Objects-normal/i386/VideoCodec\ Release -L/Volumes/Divers/Jean_Mabillard/Projet_Master/Codec/Projet/VideoCodec/build/Release -L/usr/local/lib -F/Volumes/Divers/Jean_Mabillard/Projet_Master/Codec/Projet/VideoCodec/build/Release -filelist /Volumes/Divers/Jean_Mabillard/Projet_Master/Codec/Projet/VideoCodec/build/VideoCodec.build/Release/VideoCodec.build/Objects-normal/i386/VideoCodec\ Release.LinkFileList -framework Carbon -lavcodec -lavformat -lavutil -arch i386 -Wl,-Y,1455 -mmacosx-version-min=10.4 -Wl,-dead_strip -no_dead_strip_inits_and_terms -isysroot /Developer/SDKs/MacOSX10.4u.sdk
/usr/bin/ld: warning /usr/local/lib/libavcodec.a archive's cputype (18, architecture ppc) does not match cputype (7) for specified -arch flag: i386 (can't load from it)
/usr/bin/ld: warning /usr/local/lib/libavformat.a archive's cputype (18, architecture ppc) does not match cputype (7) for specified -arch flag: i386 (can't load from it)
/usr/bin/ld: warning /usr/local/lib/libavutil.a archive's cputype (18, architecture ppc) does not match cputype (7) for specified -arch flag: i386 (can't load from it)
/usr/bin/ld: Undefined symbols:
_avcodec_init
/Volumes/Divers/Jean_Mabillard/Projet_Master/Codec/Projet/VideoCodec/build/VideoCodec.build/Release/VideoCodec.build/Objects-normal/i386/main.o reference to undefined _avcodec_init
collect2: ld returned 1 exit status
/usr/bin/ld: warning /usr/local/lib/libavcodec.a archive's cputype (18, architecture ppc) does not match cputype (7) for specified -arch flag: i386 (can't load from it)
/usr/bin/ld: warning /usr/local/lib/libavformat.a archive's cputype (18, architecture ppc) does not match cputype (7) for specified -arch flag: i386 (can't load from it)
/usr/bin/ld: warning /usr/local/lib/libavutil.a archive's cputype (18, architecture ppc) does not match cputype (7) for specified -arch flag: i386 (can't load from it)
/usr/bin/ld: Undefined symbols:
_avcodec_init
/Volumes/Divers/Jean_Mabillard/Projet_Master/Codec/Projet/VideoCodec/build/VideoCodec.build/Release/VideoCodec.build/Objects-normal/i386/main.o reference to undefined _avcodec_init
collect2: ld returned 1 exit status
Build failed (1 error, 3 warnings)
Voici un nouveau problème que je peine à résoudre.
Si j'appelle la fonction avcodec_init(), tout se passe bien. Par contre lors de l'appel de la fonction avcodec_register_all(), le message d'erreur suivant apparaît:
Building target VideoCodec of project VideoCodec with configuration Debug (1 error)
cd /Volumes/Divers/Jean_Mabillard/Projet_Master/Codec/Projet/VideoCodec
/usr/bin/g++-4.0 -o /Volumes/Divers/Jean_Mabillard/Projet_Master/Codec/Projet/VideoCodec/build/Debug/VideoCodec\ Debug.app/Contents/MacOS/VideoCodec\ Debug -L/Volumes/Divers/Jean_Mabillard/Projet_Master/Codec/Projet/VideoCodec/build/Debug -L/usr/local/lib -F/Volumes/Divers/Jean_Mabillard/Projet_Master/Codec/Projet/VideoCodec/build/Debug -filelist /Volumes/Divers/Jean_Mabillard/Projet_Master/Codec/Projet/VideoCodec/build/VideoCodec.build/Debug/VideoCodec.build/Objects-normal/ppc/VideoCodec\ Debug.LinkFileList -framework Carbon -lavcodec -lavformat -lavutil -arch ppc -Wl,-Y,1455 -mmacosx-version-min=10.4 -isysroot /Developer/SDKs/MacOSX10.4u.sdk
/usr/bin/ld: Undefined symbols:
_uncompress
_inflate
_inflateEnd
_inflateInit_
_inflateReset
_inflateSync
_deflate
_deflateEnd
_deflateInit_
_deflateReset
_crc32
_deflateInit2_
/usr/local/lib/libavcodec.a(cscd.o) reference to undefined _uncompress
/usr/local/lib/libavcodec.a(flashsv.o) reference to undefined _inflate
/usr/local/lib/libavcodec.a(flashsv.o) reference to undefined _inflateEnd
/usr/local/lib/libavcodec.a(flashsv.o) reference to undefined _inflateInit_
/usr/local/lib/libavcodec.a(flashsv.o) reference to undefined _inflateReset
/usr/local/lib/libavcodec.a(flashsv.o) reference to undefined _inflateSync
/usr/local/lib/libavcodec.a(lcl.o) reference to undefined _deflate
/usr/local/lib/libavcodec.a(lcl.o) reference to undefined _deflateEnd
/usr/local/lib/libavcodec.a(lcl.o) reference to undefined _deflateInit_
/usr/local/lib/libavcodec.a(lcl.o) reference to undefined _deflateReset
/usr/local/lib/libavcodec.a(lcl.o) reference to undefined _inflate
/usr/local/lib/libavcodec.a(lcl.o) reference to undefined _inflateEnd
/usr/local/lib/libavcodec.a(lcl.o) reference to undefined _inflateInit_
/usr/local/lib/libavcodec.a(lcl.o) reference to undefined _inflateReset
/usr/local/lib/libavcodec.a(png.o) reference to undefined _crc32
/usr/local/lib/libavcodec.a(png.o) reference to undefined _deflate
/usr/local/lib/libavcodec.a(png.o) reference to undefined _deflateEnd
/usr/local/lib/libavcodec.a(png.o) reference to undefined _deflateInit2_
/usr/local/lib/libavcodec.a(png.o) reference to undefined _inflate
/usr/local/lib/libavcodec.a(png.o) reference to undefined _inflateEnd
/usr/local/lib/libavcodec.a(png.o) reference to undefined _inflateInit_
/usr/local/lib/libavcodec.a(tiff.o) reference to undefined _uncompress
/usr/local/lib/libavcodec.a(tscc.o) reference to undefined _inflate
/usr/local/lib/libavcodec.a(tscc.o) reference to undefined _inflateEnd
/usr/local/lib/libavcodec.a(tscc.o) reference to undefined _inflateInit_
/usr/local/lib/libavcodec.a(tscc.o) reference to undefined _inflateReset
/usr/local/lib/libavcodec.a(zmbv.o) reference to undefined _inflate
/usr/local/lib/libavcodec.a(zmbv.o) reference to undefined _inflateEnd
/usr/local/lib/libavcodec.a(zmbv.o) reference to undefined _inflateInit_
/usr/local/lib/libavcodec.a(zmbv.o) reference to undefined _inflateReset
collect2: ld returned 1 exit status
/usr/bin/ld: Undefined symbols:
_uncompress
_inflate
_inflateEnd
_inflateInit_
_inflateReset
_inflateSync
_deflate
_deflateEnd
_deflateInit_
_deflateReset
_crc32
_deflateInit2_
/usr/local/lib/libavcodec.a(cscd.o) reference to undefined _uncompress
/usr/local/lib/libavcodec.a(flashsv.o) reference to undefined _inflate
/usr/local/lib/libavcodec.a(flashsv.o) reference to undefined _inflateEnd
/usr/local/lib/libavcodec.a(flashsv.o) reference to undefined _inflateInit_
/usr/local/lib/libavcodec.a(flashsv.o) reference to undefined _inflateReset
/usr/local/lib/libavcodec.a(flashsv.o) reference to undefined _inflateSync
/usr/local/lib/libavcodec.a(lcl.o) reference to undefined _deflate
/usr/local/lib/libavcodec.a(lcl.o) reference to undefined _deflateEnd
/usr/local/lib/libavcodec.a(lcl.o) reference to undefined _deflateInit_
/usr/local/lib/libavcodec.a(lcl.o) reference to undefined _deflateReset
/usr/local/lib/libavcodec.a(lcl.o) reference to undefined _inflate
/usr/local/lib/libavcodec.a(lcl.o) reference to undefined _inflateEnd
/usr/local/lib/libavcodec.a(lcl.o) reference to undefined _inflateInit_
/usr/local/lib/libavcodec.a(lcl.o) reference to undefined _inflateReset
/usr/local/lib/libavcodec.a(png.o) reference to undefined _crc32
/usr/local/lib/libavcodec.a(png.o) reference to undefined _deflate
/usr/local/lib/libavcodec.a(png.o) reference to undefined _deflateEnd
/usr/local/lib/libavcodec.a(png.o) reference to undefined _deflateInit2_
/usr/local/lib/libavcodec.a(png.o) reference to undefined _inflate
/usr/local/lib/libavcodec.a(png.o) reference to undefined _inflateEnd
/usr/local/lib/libavcodec.a(png.o) reference to undefined _inflateInit_
/usr/local/lib/libavcodec.a(tiff.o) reference to undefined _uncompress
/usr/local/lib/libavcodec.a(tscc.o) reference to undefined _inflate
/usr/local/lib/libavcodec.a(tscc.o) reference to undefined _inflateEnd
/usr/local/lib/libavcodec.a(tscc.o) reference to undefined _inflateInit_
/usr/local/lib/libavcodec.a(tscc.o) reference to undefined _inflateReset
/usr/local/lib/libavcodec.a(zmbv.o) reference to undefined _inflate
/usr/local/lib/libavcodec.a(zmbv.o) reference to undefined _inflateEnd
/usr/local/lib/libavcodec.a(zmbv.o) reference to undefined _inflateInit_
/usr/local/lib/libavcodec.a(zmbv.o) reference to undefined _inflateReset
collect2: ld returned 1 exit status
Il manque zlib, essaie d'ajouter "-lz" dans Other Link Flags.
Cette option ne fonctionne pas chez moi. Par contre j'ai ajouté la librairie dynamique libz.dylib.1.1.4 dans mon projet et la compilation fonctionne. Par contre l'erreur suivante apparaît dans la console:
[Session started at 2006-11-17 11:41:56 +0100.]
dyld: Library not loaded: ../../bin/mac/libz.dylib.1.1.4
Referenced from: /Volumes/Divers/Jean_Mabillard/Projet_Master/Codec/Projet/VideoCodec/build/Debug/VideoCodec Debug.app/Contents/MacOS/VideoCodec Debug
Reason: image not found
VideoCodec has exited due to signal 5 (SIGTRAP).
Si, le fichier existe. J'ai ajouté libz.dylib au projet mais la même erreur survient????
Il n'est pas normal que tu ne puisses pas te servir de l'option "-lz"
Que répond la commande suivante dans le terminal:
Ok tout roule, il suffisait d'ajouter le chemin d'accès de la librairie.....
Merci pour l'aide
Au fait, sais-tu à quoi sert exactement cette librairie zlib?
http://www.zlib.org.
Nouveau problème de compilation sous Xcode:
Ayant réussi à compiler l'exemple proposé avec le package ffmpeg (apiexample), je souhaite à présent importer celui dans un autre programme (SeeSaw Code proposé sur le site de PortVideo: http://www.iua.upf.es/mtg/reacTable/?portvideo).
Mais voilà, en configurant le projet SeeSaw de la même façon que pour l'exemple apiexample, je me trouve confronté au problème suivant:
main.c:44:21: error: avcodec.h: No such file or directory
J'essaie avec "ffmpeg/avcodec.h" et là l'include passe mais par contre la fonction avcodec_register_all() n'est plus reconnue:
SeeSaw-v0_1_0/build/seeSaw.build/Development/seeSaw.build/Objects-normal/ppc/seeSaw.LinkFileList -framework Cocoa -framework GLUT -framework OpenGL -framework QuickTime -framework Carbon -arch ppc -prebind -Wl,-Y,1455
/usr/bin/ld: warning prebinding disabled because of undefined symbols
/usr/bin/ld: Undefined symbols:
_avcodec_register_all
SeeSaw-v0_1_0/build/seeSaw.build/Development/seeSaw.build/Objects-normal/ppc/main.o reference to undefined _avcodec_register_all
collect2: ld returned 1 exit status
J'avoue ne plus comprendre, j'ai pourtant ajouté les options de linkage??????
Ok, l'erreur est identifiée:
Il s'agit d'ajouter les options de compilation non pas via Project/Edit Project Settings mais plutôt en cliquant droit sur l'icône du projet dans la cible ("target") puis get info. Ceci permet d'ajouter les settings pour tous les modes alors que l'autre façon de procéder agit seulement pour le mode en cours (ex: deployement).
Je souhaite à présent convertir mon programme en c++. Je rappelle que celui-ci se fonde sur le projet seesaw (http://www.cse.unsw.edu.au/~danielh/seeSaw/), augmenté de quelques fonctions de la librairie ffmpeg.
Je crée donc un nouveau projet de type Carbon C++ Standard Application ainsi que trois nouveaux fichiers sources (et leur header correspondant), dans lesquels j'inclus le code présent dans les fichiers correspondants de seesaw:
videoWindow.cpp
vdigGrab.cpp
SSUtility.cpp
Je modifie alors quelques lignes de codes afin qu'elles soient compatibles en C++ et modifie le main.cp en ajoutant le code du main.c de seesaw. J'ajoute encore les frameworks nécessaires.
Jusque là tout va bien, la compilation fonctionne.
Par contre, lorsque j'inclus le header "avcodec.h" (en veillant à spécifier le chemin d'accès lors de la compilation), 6 erreurs apparaissent:
/usr/local/include/ffmpeg/avcodec.h:249: error: using typedef-name 'CodecType' after 'enum'
/Developer/SDKs/MacOSX10.3.9.sdk/System/Library/Frameworks/QuickTime.framework/Headers/ImageCompression.h:291: error: 'CodecType' has a previous declaration here
/usr/local/include/ffmpeg/avcodec.h:945: error: using typedef-name 'CodecType' after 'enum'
/Developer/SDKs/MacOSX10.3.9.sdk/System/Library/Frameworks/QuickTime.framework/Headers/ImageCompression.h:291: error: 'CodecType' has a previous declaration here
/usr/local/include/ffmpeg/avcodec.h:2067: error: using typedef-name 'CodecType' after 'enum'
/Developer/SDKs/MacOSX10.3.9.sdk/System/Library/Frameworks/QuickTime.framework/Headers/ImageCompression.h:291: error: 'CodecType' has a previous declaration here
Je comprends donc qu'il y a une ambiguïté avec "CodecType", qui est déclaré deux fois:
- dans la librairie ffmpeg (avcodec.h)
- dans la librairie quicktime (ImageCompression.h)
Comment éviter cette erreur sans modifier avcodec.h (qui impliquerait une recompilation laborieuse de ffmpeg)?????
Ce qui m'échappe c'est que cette erreur n'apparaît pas dans mon programme initiale (cad en incluant avcodec.h au main.c de seesaw code), alors que la configuration me semble identique....
Ok problème résolu, voici la solution:
Modifier la variable présente dans avcodec.h ainsi que dans toute la librairie de ffmpeg et recompiler le tout.....
J'essaye de compiler un simple code qui utilise ffmpeg avec cette ligne de commande :
Essaye de rajouter
salut à tous,
j'ai une autre question toujours autour de ffmpeg.
Est-il possible d'intégrer ffplay dans une application ou bien en embedded ?
Merci par avance
Propulsé par Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)