Eiskaltmacher.de

Software => Benchmarks => Thema gestartet von: Gargamel am 07. Oktober 2007, 13:50:57

Titel: Video-Benchmark: x264 Encoding mit MEncoder
Beitrag von: Gargamel am 07. Oktober 2007, 13:50:57
Moin!

Viele von euch haben es ja bestimmt schon im C2D-Cache Vergleichs-Thread (http://eiskaltmacher.de/portal/index.php?option=com_smf&Itemid=26&topic=2961.msg56320#msg56320) mitbekommen - mad1120 hatte sich auf mein Bitten hin angeboten, Video-encoding mit in sein Benchmark-Programm aufzunehmen. Naja, daraus ist ein "Benchmark" in Form einer Batch-Datei entstanden. Diese kodiert drei Mal 2 Minuten Video - einmal im Single-Pass Modus und einmal die beiden Durchgänge des Two-Pass Modus - und misst dabei die Zeit.

Dazu sollte ich vielleicht erwähnen, dass ich Windows seit Jahren nur noch ab und an zum Spielen nutze, für alles andere bevorzuge ich Linux. Somit kenne ich mich kaum mit den unter Windows gängigen Video-Tools aus. Es kann also gut sein, dass die entwickelte Lösung absoluter Unsinn ist. Kennt jemand bessere Benchmarkmöglichkeiten für den x264-Codec unter Windows? Melde dich!

Vorbereitungen für den Benchmark

1. Du entpackst folgende Datei: mplayer 1.0RC1 try 2 (rev 20801) 09 jun 2007 (http://www.paehl.com/open_source/downloads/mplayer_stable_nocss.7z) (ohne CSS Support, um rechtlichen Problemen vorzubeugen) in ein neues Verzeichnis. Bitte genau dieses MPlayer/MEncoder Build, damit die Ergebnisse vergleichbar bleiben.

2. In das selbe Verzeichnis speicherst du das Video Elephants Dream in der Version "AVI, MPEG4 / AC3 5.1 Surround, 1024 Pixel Breite" unter dem Namen "ED_1024.avi". Auf dieser Seite (http://orange.blender.org/download) oben rechts gibts reichlich Mirrors. Die Datei ist 425MB groß, aber wir brauchen nur die ersten 80 bis 100MB. In dem Verzeichnis sollten jetzt unter anderem die beiden Dateien "mencoder.exe" und "ED_1024.avi" liegen - nur die beiden werden wirklich benötigt.

3. Den Inhalt des Code-Feldes da unten in eine Batch-Datei - z.B. encode.bat - im selben Verzeichnis speichern und diese ausführen.

So sieht die Batch-Datei aus:
:: Version 0.2: Rechenprobleme mit den als falsche Oktalzahlen erkannten
::              Zahlenwerten 08 und 09 behoben
::
:: Version 0.1: Erste Version dieser Batch-Datei zum Mencoder-Benchmark
::              mit Zeitdifferenzberechnung

@echo off
set VOPTS=-ovc x264 -x264encopts
set XOPTS=frameref=5:bframes=2:8x8dct:me=hex:subq=5:trellis=1:threads=1:bitrate=700
set AOPTS=-oac faac -faacopts quality=75
set OPTIONS=ED_1024.avi -vf scale=640:360 -endpos 2:00
:: set OPTIONS=ED_1024.avi -vf scale=640:360 -endpos 0:10 -idx -ss 0:20

set SingleOPTS=%VOPTS% %XOPTS% %AOPTS%
set FirstpOPTS=%VOPTS% %XOPTS%:pass=1:turbo=1 -oac copy
set SecondpOPTS=%VOPTS% %XOPTS%:pass=2 %AOPTS%

:: Temporaere Variablen: h, m, s, c
:: Rueckgabewerte: t, centis
:: Parameter: centis, t, msg
goto :main


:: Rechnet die Zeit im Format HH:MM:SS.CC aus der Variablen t in
:: Centisekunden um. Ja, richtig, Centi-Sekunden, keine Millis... :/
:getcentis

:: Stundenwert "ausschneiden": die 2 Zeichen hinter dem 0-ten Zeichen
:: (also die ersten beiden) aus der Variable T in die Variable H kopieren
set h=%t:~0,2%
:: Bei Zahlen kleiner 10 die fuehrende Null entfernen, sonst kann es beim
:: Rechnen Probleme mit irrtuemlichen Oktalzahlen geben (08, 09)
if "%h%" LSS "10" set h=%h:~1,1%

set m=%t:~3,2%
if "%m%" LSS "10" set m=%m:~1,1%

set s=%t:~6,2%
if "%s%" LSS "10" set s=%s:~1,1%

set c=%t:~9,2%
if "%c%" LSS "10" set c=%c:~1,1%

set /a centis=%h%*360000+%m%*6000+%s%*100+%c%
:: echo %h%,%m%,%s%,%c%
:: echo %centis%
goto :eof
:: End Of File? LOL! Wer denkt sich denn sowas aus?


:: Rechnet Centisekunden aus der Variablen CENTIS in eine Zeit im Format
:: HH:MM:SS:CC um und gibt diese im der Variablen T zurück. Des weiteren
:: wird in der Variablen SECONDS die Zeit in Sekunden als Fliesskommazahl
:: abgelegt.
:centisToTime
set /a s=%centis%/100
set /a c=%centis%%%100
if %c% LSS 10 set c=0%c%
set seconds=%s%,%c%

set /a h=%centis%/360000
set /a m=(%centis%/6000)%%60
set /a s%%=60
if %h% LSS 10 set h=0%h%
if %m% LSS 10 set m=0%m%
if %s% LSS 10 set s=0%s%
set t=%h%:%m%:%s%,%c%
goto :eof


:: Gibt die Nachricht aus der Variablen MSG mitsamt Zeitstempel
:: aus, sowohl im DOS-Fenster als auch in die Datei result.txt.
:: Außerdem wird :GETCENTIS aufgerufen, so dass nachher in der
:: Variablen CENTIS die Zeit zum Aufrufzeitpunkt in Centisekunden
:: enthalten ist.
:printmsg
set t=%time%
@echo %t% %msg%
@echo %t% %msg% >> result.txt
call :getcentis
goto :eof


:: ************ ::
:: Hauptroutine ::
:: ************ ::
:main
del result.txt

set msg=Start.
call :printmsg
set tstart=%centis%

@echo on
mencoder.exe %OPTIONS% %SingleOPTS% -o single.avi || goto :fehler
@echo off

set msg=Single Pass Encoding beendet.
call :printmsg
set tsingle=%centis%

@echo on
mencoder.exe %OPTIONS% %FirstpOPTS% -o first.avi || goto :fehler
@echo off

set msg=First Pass von Multi-Pass Encoding beendet.
call :printmsg
set tfirst=%centis%

@echo on
mencoder.exe %OPTIONS% %SecondpOPTS% -o second.avi || goto :fehler
@echo off

set msg=Second Pass von Multi-Pass Encoding beendet.
call :printmsg
set tsecond=%centis%


:: ****************************** ::
:: Zeitdifferrenzberechnungskrams ::
:: ****************************** ::

type result.txt >> zeiten.txt
echo -------------------- >>zeiten.txt
echo ====================================
echo   Zusammenfassung:
echo ------------------------------------

set /a centis=%tsingle%-%tstart%
call :centisToTime
echo Single-Pass :  %t%  %seconds%
echo Single-Pass :  %t%  %seconds% >>result.txt

set /a centis=%tfirst%-%tsingle%
call :centisToTime
echo First-Pass  :  %t%  %seconds%
echo First-Pass  :  %t%  %seconds% >>result.txt

set /a centis=%tsecond%-%tfirst%
call :centisToTime
echo Second-Pass :  %t%  %seconds%
echo Second-Pass :  %t%  %seconds% >>result.txt

set /a centis=%tsecond%-%tstart%
call :centisToTime
echo Gesamtdauer :  %t%  %seconds%
echo Gesamtdauer :  %t%  %seconds% >>result.txt
echo ====================================

goto :ende
:fehler
@echo Fehler beim Ausfuehren von mencoder.exe - Stop.
:ende
@pause


Als Software wird MEncoder verwendet, als Videocodec kommt der freie h.264 Encoder x264 zum Einsatz, die Tonspur übernimmt faac. Warum diese Codecs / Programme? Nun ja, die Codecs sind recht aktuell, sie sind Open Source und es sind genau die Codecs, die ich auch unter Linux verwende. :D

MEncoder ist aus MPlayer entstanden, einem Open Source Video-Player, der dank libavcodec schon von Haus aus eine ganze Menge unterschiedlicher Video-Formate unterstützt. Mplayer kommt außerdem mit einem guten Vorrat an Video-Filtern daher und kommt auch sehr gut mit beschädigten Videos zurecht. MEncoder nutzt die selbe Codebasis, kann Videos aber nicht auf dem Bildschirm ausgeben sondern schreibt sie in einem anderen Format auf die Platte.

Warum MEncoder? Er bietet sich an, weil er diverse Formate lesen kann. Man kann alle Einstellungen auf der Kommandozeile übergeben, was sehr gut fürs scripting (batch) ist. Er wird üblicherweise statisch gelinkt, weshalb außer der .exe-Datei nichts benötigt wird. Also ist keine Installation von obskuren Codec-Packs nötig. Zu guter Letzt kenne ich ihn schon von Linux aus.

BTW: <Open Source Werbung> Mplayer solls auch mit grafischer Oberfläche geben, allerdings nicht in dem oben verlinkten Archiv. Wer für Mencoder gerne ein grafisches Frontend hätte, soll nach MEgui suchen. Doku gibts hier (http://www.mplayerhq.hu/DOCS/man/en/mplayer.1.html) oder auch auf deutsch übersetzt (http://www.mplayerhq.hu/DOCS/man/de/mplayer.1.html). </Open Source Werbung>

Bekannte Probleme
Mir ist es einmal vorgekommen, dass die Zeit-Differenzen falsch ermittelt wurden. Beim Single-Pass wurde die Zeit 0 angezeigt, während beim First-Pass zusätzlich die Dauer des Single-Pass hinzuaddiert wurde. Die Gesamtzeit am Ende war also richtig. Ich habe keine Ahnung woher das kommt und momentan nicht die Muße, das zu untersuchen.

Das gewählte Mplayer-Build ist ohne Thread-Support kompiliert worden, desshalb nutzt das Benchmark nur eine CPU. Der Codec x264 kann aber auf jeden Fall mit mehreren Threads arbeiten und skaliert dann recht gut mit mehr CPUs. Also nicht enttäuscht sein, wenn der Quad-Core nicht viel schneller ist als ein Single-Core...

Ergebnisse
System: Athlon X2 3800+ So939 (512k Cache, default 200x10MHz), Epox EP9NPA3J (NForce4). 2GB MDT DDR1, Timings immer Tcl:2.5, Trcd:3, Tras:8, Trp:3, Command Rate: 2T.

HT-Ref HT-Multi CPU-Multi CPU-Takt RAM-Setting RAM-Takt Gesamt-Zeit
200 MHz     4        8,0    1600 MHz DDR 400      200 MHz  9:39,57 = 579.57 s
224 MHz     4        9,5    2128 MHz DDR 333      186 MHz  7:27,50 = 447.50 s
266 MHz     3       10,0    2660 MHz DDR 266      177 MHz  6:07,45 = 367.45 s

Die 2,66 GHz sind wahrscheinlich nicht prime stable, normalerweise läuft die CPU bei 2,4 GHz.

Edit 24.10.2007: Version 0.2 - Rechenfehler hoffentlich endgültig behoben.