Encoding Optionen von x264 mit menconder unter Ubuntu

  • Hallo,


    ich bin neu hier und beschäftige mich seit Kurzem mit dem Mencoder und dem x264 Codec, um einige alte DVDs ohne Kopierschutz auf Festplatte zu kopieren.
    Dazu nutze ich zunächst die -dumpvideo Option des mplayers, um das Video 1:1 auf die Festplatte zu kopieren. Der Input ist hier übrigens ein nicht-animierter Spielfilm.
    Danach soll der Mencoder seine Arbeit erledigen mit Hilfe des x264 Codecs, um die Videodateien zu komprimieren, ohne große Verluste hinnehmen zu müssen.
    Dafür habe ich nach etlichem Lesen 4 Einstellungen für die x264 Optionen getestet, die hier aufgelistet sind:


    1)
    mencoder input.avi -of avi -vf softskip,crop=704:560:8:8,pp=de/dr -ovc x264 -x264encopts tune=film:bitrate=1300:preset=veryslow:threads=0:nr=500:psnr:ssim:pass=1 -ofps 25 -oac copy -channels 6 -mc 0 -o /dev/null
    mencoder input.avi -of avi -vf softskip,crop=704:560:8:8,pp=de/dr -ovc x264 -x264encopts tune=film:bitrate=1300:preset=veryslow:threads=0:nr=500:psnr:ssim:pass=2 -ofps 25 -oac copy -channels 6 -mc 0 -o output1.avi


    2)
    mencoder input.avi -of avi -vf softskip,crop=704:560:8:8,pp=de/dr -ovc x264 -x264encopts bitrate=1300:preset=veryfast:threads=0:nr=500:psnr:ssim:pass=1 -ofps 25 -oac copy -mc 0 -o /dev/null
    mencoder input.avi -of avi -vf softskip,crop=704:560:8:8,pp=de/dr -ovc x264 -x264encopts bitrate=1300:preset=veryfast:threads=0:nr=500:psnr:ssim:pass=2 -ofps 25 -oac copy -mc 0 -o output2.avi


    3)
    mencoder input.avi -of avi -vf softskip,crop=704:560:8:8,pp=de/dr -ovc x264 -x264encopts bitrate=1300:subq=6:partitions=all:8x8dct:me=umh:frameref=5:bframes=3:b_pyramid=normal:weight_b:threads=0:nr=500:psnr:ssim:pass=1 -ofps 25 -oac copy -mc 0 -o /dev/null
    mencoder input.avi -of avi -vf softskip,crop=704:560:8:8,pp=de/dr -ovc x264 -x264encopts bitrate=1300:subq=6:partitions=all:8x8dct:me=umh:frameref=5:bframes=3:b_pyramid=normal:weight_b:threads=0:nr=500:psnr:ssim:pass=2 -ofps 25 -oac copy -mc 0 -o output3.avi


    4)
    mencoder input.avi -of avi -vf softskip,crop=704:560:8:8,pp=de/dr -ovc x264 -x264encopts bitrate=1300:preset=veryslow:threads=0:nr=500:psnr:ssim -ofps 25 -oac copy -mc 0 -o output4.avi


    Die resultierenden avis haben innerhalb gewisser Fehlergrenzen die gleiche Bitrate und somit auch Größe. Danach habe ich mit dem qpsnr Tool sowohl den PSNR als auch den SSIM Wert für jeden einzelnen Frame errechnen lassen.
    1 = 40.37535, 0.97691
    2 = 40.41871, 0.97743
    3 = 40.56046, 0.97878
    4 = 40.40549, 0.97650


    "Sieger" wäre somit die 3. Variante, die spannenderweise auch noch die schnellste von den Vieren war. Meine Frage ist nun, wie aussagekräftig das alles ist. Kann ich damit zufrieden sein? Ein Verlust von guten 2% hört sich für mich als Perfektionist immer noch viel an. Eine höhere Bitrate möchte ich aber nicht zulassen. Gäbe es sonst noch irgendwelche Möglichkeiten, an den Optionen zu schrauben, um die Qualität bei gleicher Bitrate zu verbessern?
    Schaut man sich einzelne Frames an und vergleicht diese mit dem Original, so sieht man durchaus einen kleinen Unterschied, doch ob mir das beim schlussendlichen Sehen des Filmes überhaupt auffällt?
    Feedback, Kommentare sind sehr sehr willkommen.

  • 1. Warum verwendest Du softtskip?
    2. Würde mich bzgl. der Qualität nicht auf PSNR/SSIM/... verlassen und eher den eigenen Augen vertrauen.
    Beim Vergleich mit dem Original sei auch angemerkt, dass Du allein schon durch "pp=de/dr" einen Unterschied zum Original pro Frame sehen solltest,...
    3. Wenn Du nur für Dich encodest, nimm einfach die Settings die für dich schnell genug und Qualitativ in Ordnung aussehen.


    Zitat

    "Sieger" wäre somit die 3. Variante, die spannenderweise auch noch die schnellste von den Vieren war


    Verwundert mich etwas, normalerweise sollte preset veryfast schneller sein.


    Zitat

    Meine Frage ist nun, wie aussagekräftig das alles ist.


    Sich auf die 3te Stelle von SSIM werden zu verlassen um Aussagen über die Qualität zu machen halte ich für abenteuerlich. :)
    -> einziges brauchbares Werkzeug um kleine Unterschiede zu sehen sind und bleiben wohl erst mal die eigenen Augen.

  • 1. Warum verwendest Du softtskip?


    Hm .. gute Frage .. ich meine mich erinnern zu können, dass softskip eine A-V Desynchronisation verhindert hat.


    2. Würde mich bzgl. der Qualität nicht auf PSNR/SSIM/... verlassen und eher den eigenen Augen vertrauen.
    Beim Vergleich mit dem Original sei auch angemerkt, dass Du allein schon durch "pp=de/dr" einen Unterschied zum Original pro Frame sehen solltest,...


    Wie genau arbeitet der dr Filter überhaupt?! Z.B. bei einem I Frame?


    Verwundert mich etwas, normalerweise sollte preset veryfast schneller sein.


    Ist auch Quatsch .. C+P Error .. veryfast sollte eigentlich veryslow sein.


    Sich auf die 3te Stelle von SSIM werden zu verlassen um Aussagen über die Qualität zu machen halte ich für abenteuerlich. :)
    -> einziges brauchbares Werkzeug um kleine Unterschiede zu sehen sind und bleiben wohl erst mal die eigenen Augen.


    Dritte Nachkommastelle ist vermutlich auch sehr vage .. true.
    Frage wäre allerdings, ob man einen sichtbaren Qualitätsgewinn jetzt echt nur noch durch Erhöhung der Bitrate bekommen würde.

  • Zitat

    Wie genau arbeitet der dr Filter überhaupt?! Z.B. bei einem I Frame?


    glaube nicht, dass da intern Frametypen unterschieden werden,... sprich es wird genau so auf I wie auf P frames arbeiten, genaueres wird aber wohl nur im SourceCode zu finden sein,... (den Teil des mencoder SourceCodes hab ich mir nie angeguckt und plane ich eigentlich auch nicht anzugucken)


    Zitat

    Hm .. gute Frage .. ich meine mich erinnern zu können, dass softskip eine A-V Desynchronisation verhindert hat.


    sollte es eigentlich nur, wenn etwas anderes schief läuft,... z.B. die Quelle kaputt ist


    Zitat

    Frage wäre allerdings, ob man einen sichtbaren Qualitätsgewinn jetzt echt nur noch durch Erhöhung der Bitrate bekommen würde.


    Die psychovisuellen Features von x264 können je nach Material sicher noch was bringen. :)

  • Ich würde auch mal den qualitätsbasierten CRF Modus probieren.
    Besonders bei x264 erzielt man damit recht ordentliche Ergebnisse und spart sich die Zeit für den zweiten Durchlauf.

    Als Beispiel, die Commandline würde bei mir so aussehen, dort ist auch Audio mit drin.

    Code
    1. Mencoder.exe "test.mpg" -oac faac -lavfopts format=mp4 -faacopts mpeg=4:object=2:raw:br=128 -ovc x264 -x264encopts crf=19:subq=5:8x8dct:frameref=2:bframes=3:weight_b:level=4.1:threads=6 -vf softskip,harddup,pp=fd,crop=704:560:8:8, -of lavf -o "test.mp4"


    Ich habe mich damit schon seit längerem nicht mehr beschäftigt aber es wird sich ja nicht alles grundlegend geändert haben :)

  • MegaDeath :
    1. Warum verwendest Du 'softskip,harddup,pp=fd' wenn keinerlei Infos über den Input bekannt sind? Bei ivtc und bei auch bei echtem interlactem Material wäre das definitiv nicht meine Wahl gewesen,...
    Vielleicht interessant in diesem Zusammenhang: http://forum.doom9.org/showthread.php?t=163989
    2. Warum definierst Du ein ein Level aber kein Profile und keine vbv Beschränkungen?

  • 3. kann man bei CRF eben nicht garantieren, dass eine bestimmte Bitrate nicht überschritten wird. Leider wird das so gewünscht. Wie wichtig die Gründe dafür sein mögen, kann ich nicht einschätzen, solange die nicht erklärt wurden...

  • Ich hatte die befehle einfach so drin gelassen damit man bei Änderungen besser weiß wo was hingehört, macht da bloß keine Verschwörungstheorie draus :)
    Die Commandline ist sicher nicht perfekt sollte aber möglichst universell einsetzbar sein.


    Level=4.1 habe ich nur eingetragen weil es meines Wissens Hardwareplayer gibt die es abfragen und wenn kein Level angegeben ist das abspielen eventuell verweigern, hatte ich bisher noch keine Probleme.


    Allerdings würde ich das so erstellte mp4 nochmal multiplexen.

  • Nur das Level eintragen nützt aber nichts, wenn die Grenzwerte des Levels dann trotzdem überschritten werden, und der Player sich dann am Input verschluckt.


    Der Hinweis auf ein Remultiplexen ist aber durchaus sinnvoll; MP4Box sollte auf jeden Fall die letzte Software gewesen sein, die ein MP4 erzeugt hat.

  • glaube nicht, dass da intern Frametypen unterschieden werden,... sprich es wird genau so auf I wie auf P frames arbeiten, genaueres wird aber wohl nur im SourceCode zu finden sein,... (den Teil des mencoder SourceCodes hab ich mir nie angeguckt und plane ich eigentlich auch nicht anzugucken)


    Mir ist schon klar, dass der Filter die Frametypen vermutlich nicht unterscheiden wird .. aber anhand eines I-Frames wäre die Arbeitsweise wohl am einfachsten zu erklären gewesen, da hier ja das reine Image einfach nur komprimiert abgespeichert wird, soweit ich das verstanden habe.


    Die psychovisuellen Features von x264 können je nach Material sicher noch was bringen. :)


    Schon klar ;D

  • Der Link zu der Seite mit den Deinterlacing ist sehr interesannt aber ich glaube ich bleibe bei pp=fd ist einfach ein guter Kompromiß aus Qualität und Geschwindigkeit.
    Die besseren Deinterlacer bremsen meinen Rechner fast auf stillstand :)


    Die vbv Beschränkungen müßten doch erst bei Full-HD zum tragen kommen.
    Zumindest in meiner Vorstellung sollte ein HD-Player doch über genügend Reserven verfügen um kleinere Auflösungen mit entsprechend geringen Bitraten problemlos zu meistern.
    Anders als bei MPEG mache ich mir da eigentlich keine sorgen.

  • Es geht bei den VBV-Beschränkungen vor allem darum, die Bitratenschwankungen schon bei der Encodierung so zu begrenzen, dass das Ergebnis mit Sicherheit für alle spezifikationsgetreuen Player kompatibel ist. Nicht nur glücklicherweise zufällig.

  • Zu dem Interlacing hab ich auch noch ein paar Fragen:
    Das steht in der mplayer Doc

    Zitat


    If the movie you want to encode is interlaced (NTSC video or PAL video), you will need to choose whether you want to deinterlace or not. While deinterlacing will make your movie usable on progressive scan displays such a computer monitors and projectors, it comes at a cost: The fieldrate of 50 or 60000/1001 fields per second is halved to 25 or 30000/1001 frames per second, and roughly half of the information in your movie will be lost during scenes with significant motion.


    Therefore, if you are encoding for high quality archival purposes, it is recommended not to deinterlace. You can always deinterlace the movie at playback time when displaying it on progressive scan devices. The power of currently available computers forces players to use a deinterlacing filter, which results in a slight degradation in image quality. But future players will be able to mimic the interlaced display of a TV, deinterlacing to full fieldrate and interpolating 50 or 60000/1001 entire frames per second from the interlaced video.


    Wann ist es denn jetzt überhaupt nötig, dass ich einen Deinterlacer benutze?
    Würde ich vorhaben, das Video auf eine DVD zu brennen, so bräuchte ich den Deinterlacer eh nicht (laut Text).
    Will ich das Video auf einem PC Monitor abspielen, kann ich das Video auch noch beim Playback selbst direkt deinterlacen (laut Text).
    Welche Situation gibt es denn dann noch, dass ich mich beim Encoden mit diesem Thema beschäftigen sollte?
    Zur Info: Mein Ziel ist es nicht, einen Film auf eine DVD oder gar Blu Ray zu brennen.



    Weitere Frage zu den verschiedenen Container-Formaten (avi, mkv usw):
    Was für einen Unterschied macht es, wenn ich beim mencoder die Option -of avi setze, welche Dateiendung mein Output hat, vor allem auch im Zusammenhang ob ich nun -ovc copy/x264 setze?
    Ich habe ausserdem ein Problem mit der Option -dumpvideo beim mplayer. Benutze ich diese Option bei einer 720x576 DVD, kann ich den resultierenden Output ohne Probleme per mplayer abspielen. Mache ich aber das gleiche bei einer .mkv Datei kann ich das nicht, obwohl die .mkv Datei selbst ohne Probleme abspielbar ist.
    Wofür gibt es zigtausend Ergebnisse bei Google, wie man eine avi in eine mkv umwandeln kann, wenn das Video selbst dabei einfach nur per -ovc copy kopiert wird!? Also als Beispiel:
    mencoder text.mkv -ovc copy -oac copy output.avi
    Registriert mencoder überhaupt, dass da zwischen den beiden Formaten gewechselt werden soll?! Ist der Befehl nicht gleichzusetzen mit "mv test.mkv output.avi"?

  • Einen Deinterlacer brauchst du, wenn du das Video progressiv darstellen lassen willst und mit Echtzeit-Deinterlacign qualitativ nicht zufrieden bist (oder nicht sicher bist, dass der Player das korrekt durchführt). Typischer Fall wäre vor dem Hochladen zu YouTube in HD, damit deren Konverter erst mal eine möglichst hochwertige Quelle hat, von der aus es nur noch schlimmer werden kann. Nicht jeder Kontainer und nicht jedes Videoformat signalisieren dem Decoder bzw. Player, dass der Inhalt als interlaced behandelt werden müsste.


    MPEG4-AVC/H.264-Video gehört nicht in einen AVI-Kontainer, weil dieser technisch veraltet ist und die modernen, komplexen Features dieses Videoformates (B-Frames, multiple Referenzen, Unterschied zwischen I- und IDR-Frame) überhaupt nicht korrekt verarbeiten kann. Außerdem schreiben Tools wie mencoder oder ffmpeg, die die Ausgabedatei nur einmal von vorn bis hinten erzeugen, bestimmte Kontainer wahrscheinlich nicht vollständig, gerade MP4 sollte mit MP4Box noch einkal komplettiert werden, für AVI gäbe es möglicherweise kein ähnlich geeignetes Programm unter Linux.

  • MPEG4-AVC/H.264-Video gehört nicht in einen AVI-Kontainer, weil dieser technisch veraltet ist und die modernen, komplexen Features dieses Videoformates (B-Frames, multiple Referenzen, Unterschied zwischen I- und IDR-Frame) überhaupt nicht korrekt verarbeiten kann. Außerdem schreiben Tools wie mencoder oder ffmpeg, die die Ausgabedatei nur einmal von vorn bis hinten erzeugen, bestimmte Kontainer wahrscheinlich nicht vollständig, gerade MP4 sollte mit MP4Box noch einkal komplettiert werden, für AVI gäbe es möglicherweise kein ähnlich geeignetes Programm unter Linux.


    Das heißt, eigentlich ist es Quatsch, den mencoder mit -of avi -ovc x264 aufzurufen, weil der AVI-Kontainer mit dem H.264-Video eh nicht so richtig gut klar kommt?
    Welches Ausgabeformat würdest du denn dann bevorzugen? Also -of ***
    Um es richtig zu machen, sollte man ffmpeg mit -vcodec h264 -f matroska nutzen?

  • mkv wäre wohl die einzige Alternative wenn man mp4&avi(&mov) nicht nutzen will.

    Code
    1. -of lavf -lavfopts format=mkv -o "Pfad zum output mit .mkv Endung"


    Zitat

    Um es richtig zu machen, sollte man ffmpeg mit -vcodec h264 -f matroska nutzen?


    a. -vcodec h264 nutzt nicht x264 sondern den libav H.264 Encoder, welcher qualitativ nicht an x264 heran
    b. -f matroska kann man sich sparen, wenn der Output eine .mkv Endung hat


    Nebenbei: Warum nutzt Du nicht einfach eine GUI wie Hybrid, HandBrake, AviDemux? Oder ein ShellSkript wie h264enc?


    Cu Selur

  • mkv wäre wohl die einzige Alternative wenn man mp4&avi(&mov) nicht nutzen will.

    Code
    1. -of lavf -lavfopts format=mkv -o "Pfad zum output mit .mkv Endung"



    a. -vcodec h264 nutzt nicht x264 sondern den libav H.264 Encoder, welcher qualitativ nicht an x264 heran
    b. -f matroska kann man sich sparen, wenn der Output eine .mkv Endung hat


    Ah .. ich hatte die libavformat nicht gesehen bzw überlesen.


    Nebenbei: Warum nutzt Du nicht einfach eine GUI wie Hybrid, HandBrake, AviDemux? Oder ein ShellSkript wie h264enc?


    Ich hatte anfangs eine GUI namens AcidDVD o.ä. genutzt. Diese arbeitete mit mencoder, mplayer und ffmpeg usw, war aber nicht sehr handlich und ohne Hintergrundwissen nur schwierig zu konfigurieren. Man trug die Encodieroptionen einfach in ein Feld ein, ohne dass die Optionen vorgestellt oder erläutert wurde. Daher habe ich mich mit den verschiedenen Dingen näher auseinandergesetzt und bin schließlich dazu übergegangen, mencoder ohne GUI direkt zu nutzen.
    Mittlerweile wäre ein ShellSkript sicherlich praktisch, nur bin ich dann jetzt auch auf dem Stand, dieses im Grunde selbst schreiben zu können.

  • Du kannst auch einfach AVI benutzen damit kommt Mencoder am besten zurecht.
    Bei bedarf kann man das Containerformat nachträglich mit einem geeigneten Programm immernoch in MP4 oder MKV ändern.
    Den Aufwand spare ich mir aber meistens.