libx264 in c++ nutzen,...?

  • Gibt es irgendwo eine Dokumentation wie man libx264 in C++ nutzen kann?
    Hintergrund: Schreiben an einem kleinen Tool was bis dato die x264.exe per Commandline nutzt und auch soweit recht gut fluppt, da ich unter Windows der .exe aber nicht mehrere Dateien übergeben kann, so dass am Ende ein Outputfile daraus wird hab ich mir gedacht, dass ich selber ein I/O Device schreibe, welches ich später mit den entsprechenden Parametern an die libx264 übergebe, nur leider finde ich keinerlei Dokumentation zur Nutzung der lib. :(

    Cu Selur

  • Ist libx264 jetzt der reine AVC-Teil von libavcodec oder eine dll-Version von x264?

    Mehr oder weniger: Ja. Es ist eine Bibliothek an Programmroutinen. Die kann man z.B. mit einer (von dir für andere) gut dokumentierten Schnittstelle als DLL compilieren und dadurch anderen Programmen zur Verfügung stellen. Oder in das eigene Programm direkt einbinden.

  • Es sollte noch klargestellt werden, dass x264 kein Bestandteil von libavcodec/ffmpeg ist, sondern ein eigenständiges Projekt.
    x264 ist komplett ohne libavcodec lauffähig, enthält jedoch keinerlei Dekoder. Viele Tools greifen daher auf den H.264 Dekoder von libavcodec zurück.
    Die Entwickler arbeiten auch eng zusammen, so dass libavcodec alle Streams, die von x264 erzeugt werden, korrekt dekodieren kann.

    Außerdem kann man x264 bereits von Haus aus als DLL kompilieren, man muss dazu lediglich "--enable-shared" and den configure Skript übergeben.
    Die gesamte Schnittstelle der Bibliothek ist in der Header-Datei "x264.h" festgelegt, man muss daher nicht anfangen, selbst eine API zusammen zu basteln ;)

    Wie man die x264 Bibliothek aus einer Host-Anwendung aufruft, kann man sich wohl am einfachsten beim x264 CLI Encoder angucken.
    Alternativ könnte man sich auch die "ADM_codecs\ADM_x264.cpp" im Avidemux repository näher anschauen...

  • Du musst zuerst mal MinGW und MSYS drauf hauen, um ne gescheite Unix-Shell zu bekommen.

    Aktuelle MinGW/GCC Builds findet man z.B. hier:
    http://www.tdragon.net/recentgcc/

    MSYS kannst du hier runterladen:
    http://sourceforge.net/project/showfi…elease_id=89960

    Dann brauchst du natürlich noch MSYS GIT, falls du das nich schon hast:
    http://code.google.com/p/msysgit/downloads/list

    Dein GIT Kommando ist soweit richtig, es sollte dann in einem neuen Unterordner "x264" landen ;)

    Auch yasm und pthreads sollte man drauf haben, um brauchbare Builds zu erzeugen...

  • Ich fühl mich gerade ein wenig so wie an dem Tag, an dem ich zum ersten mal AVISynth benutzt habe. :ani_lol:
    Für meine eigenen Projekte hat bisher immer das ältere stabile MinGW 3.4.5 Paket + Code::Blocks ausgereicht.

    Also, brauche ich für Msys auch noch diese Pakete?
    MSYS DTK 1.0
    MSYS Core 1.0.11

    Ist mit yasm dieses Teil gemeint?
    Win32 .exe (for "normal" (Visual Studio or similar) use on 32-bit Windows)
    und kommt die yasm.exe mit in den bin-ordner von MinGW?

    und

    diese pthreads bibliothek?
    http://sourceware.org/pthreads-win32/
    Danke. :)

    greets
    LTJ

  • Für MSYS sollte der Installer (MSYS-1.0.10.exe) ausreichen, MinGW sollte aber vorher installiert werden.
    Wenn ich mich recht entsinne, fragt er währen der Installation deinen MinGW Ordner ab.

    Damit man x264 als DLL kompilieren kann, brauch man einen 4.x.x GCC Compiler, da der 3.x.x GCC Probleme mit dem Stack-Alignment hat ;)
    Oder man kann den Assembler Code daktivieren und erhebliche Geschwindigkeitseinbußen in Kauf nehmen - keine gute Option.

    Der yasm Assembler bei deinem Link scheint der zu sein, den ich auch benutze.
    In den "mingw/bin" Ordner packen sollte ausreichen, damit es der x264 configure-script findet.

    Ich glaube pthreads ist bei den MinGW/GCC Paketen von TDM sogar schon dabei. Hatte es damals aber aus dem CVS compiliert...

  • OK soweit, nächste Frage:

    Ich komme mir gerade echt bescheuert vor :redface:
    Ich kann in genau einen Ordner navigieren und das geht mit
    "cd /mingw"
    alle anderen Ordner findet er nicht.
    Gibt es irgendwo eine vernünftige Doku über dieses völlig unhandliche Shellsystem, das etwas ausführlicher ist, als "help command"?
    Sowas in der Art wie "AVISynth - Your first Script" wäre schon ein Anfang :D.

    greets
    LTJ

  • Versuch es mal mit "cd /c/dev/x264" :zunge:

    (Angenommen die x264 Quellen befinden sich in "c:\dev\x264")


    BTW: Da MSYS ledglich eine Unix-artige Shell für Win32 bereit stellt, sollte ein Linux/Unix Tutrorial hilfreich sein.

  • Jetzt hab ich mit

    ./configure --disable-mp4-output --enabled-shared
    make
    make install

    eine x264.exe core Version und eine libx264-64.dll mitten im x264_src - Ordner und im msys\local\bin - Ordner erstellt. :huh:

    Ich versuchs einfach morgen nochmal und nu endgültig bye.

    greets
    LTJ

  • Also --disable-mp4-output is überflüssig, solange du kein GPAC installiert hast (dann ist die MP4 Ausgabe eh deaktiviert).
    Glaube sowieso nicht, dass sich die MP4 Ausgabe in irgendeiner Form auf die DLL auswirken würde ...

    Eventuell könntest du noch --extra-cflags="-march=pentium2" hinzufügen, um ein etwas "schnelleres" Build zu erzeugen.
    Man benötigt dann aber mindestens einen CPU der "Pentium 2" Klasse - was man zur Videobearbeitung aber wohl eh haben sollte.
    Die meisten x264 Builds, die im Netz rumgeistern, werden mit dieser Option erstellt.

    Noch etwas mehr Geschwindigkeit (beim Encodieren) kannst du mit einem "fprofiled" Build herausholen:
    make fprofiled VIDS="sample.avs"

    Was "make install" tun soll, weiss ich nicht. Aber dass er die "libx264-64.dll" korrekt erstellt hat, ist doch schon mal gut!

    Und immer schön "make clean" bevor du nochmal kompilierst ;)

  • Vieleicht hilft:

    hpn's x264 compilation guide

    Dieser Guide scheint mir etwas veraltet, da er noch von "SVN" (anstatt GIT), von "nasm" (ansatt yasm) und von MinGW/GCC v3.2.0 spricht.
    MinGW/GCC v3.4.6 sollte man wohl mindestens nehmen. Wenn man die DLL erzeugen will, muss es wie bereits erwähnt sogar MinGW/GCC 4.x.x sein...

  • Was "make install" tun soll, weiss ich nicht.

    C:\msys\1.0\share\autoconf\install

    Zitat von INSTALL


    4. Type `make install' to install the programs and any data files and
    documentation.

    Die Kompilierten Dateien werden dann in den Ordnern
    /usr/local/bin
    /usr/local/lib
    /usr/local/include
    abgelegt.

    Aber dass er die "libx264-64.dll" korrekt erstellt hat, ist doch schon mal gut!


    Ja, aber ich habe den Eindruck, dass ich eine 64bit Version erstellt habe. Scheinbar kann man dem Compiler aber wohl mit `--build=TYPE' irgendwie mitteilen für welche Plattform er das kompilieren soll. Die INSTALL-Readme verweist dann auf conf.sub, aber das verstehe ich noch nicht :huh:

    Jetzt hab ich nichmal ne saubere neue Version aus dem GIT geladen und einfach nur ohne Parameter ganz simpel

    ./configure
    make
    make install

    ausgeführt um eine normale Executable zu erstellen.
    Während der kompilierung tauchen ziemlich viele Warnings, aber keine Errors auf, u.a. folgende:

    • warning: array subscript is above array bounds
    • warning: 'mvp[1]' may be used uninitialized in this function
    • warning: unused variable 'saveptr'

    und weitere.
    Die kompilierte x264.exe stürzt dann bei "x264.exe --help" schon ab.

    --------------------------------

    Zweiter Versuch:

    Aufräumen:

    make clean
    make distclean

    nochmal kompiliert

    ./configure

    ./configure --extra-cflags="-march=pentium2"
    make fprofiled VIDS="sample.avs"

    -> gleiche warnings und x264.exe stürzt bei den 5 Tests (?) die dann am Ende ausgeführt werden genauso ab wie im Versuch vorher.

    greets
    LTJ

  • Keine Angst, man kann zum aktuellen Zeitpunkt gar keine 64-Bit Version von x264 für Windows kompilieren :zunge:

    Der Dateiname folgt dem "name-version.dll" Schema, deine "libx264-64.dll" entspricht also der "Core" Version 64 von x264.
    Die "Core" Versionsnummer wird nicht bei jeder Revision erhöht, sondern immer nur dann, wenn sich die API ändert...

    Zitat

    [ About H.264 encoding ]
    User data: x264
    User data: core 64 r995M 2324c70
    User data: H.264/MPEG-4 AVC codec
    User data: Copyleft 2003-2008
    User data: http://www.videolan.org/x264.html

    Soweit ich weiss brauchst du weder "make distclean" noch "make install" ;)
    Und die "Warnings" beim Compilieren stellen erstmal kein Problem da. Solange kein "Error" kommt ist alles gut.
    GCC 4.x.x hat einfach ne striktere Syntaxprüfung als 3.x.x und wirft daher ein paar Warnings.

    Wieso dein Build bereits bei "x264.exe --help" Abstürzt weiss ich nicht. Am Ende mal en Backtrace im GDB estellen.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!