Im dritten Teil widme ich mich einigen Programmen zum Encodieren, bzw Kovertieren von Audio und Video Daten.
Als Ausgangsmaterial steht ein MPEG2 kodiertes Video mit 5.1 Sound bereit, welches in andere Video- und Audioformate umgewandelt wird.
Zuerst kommt ffmpeg zum Einsatz
ffmpeg -threads 1 -benchmark -i test5 -f avi -vcodec mpeg4 -b 1800k -g 300 -bf 2 -acodec ac3 -ab 320k bench1.avi
FFmpeg version SVN-rUNKNOWN, Copyright (c) 2000-2007 Fabrice Bellard, et al.
configuration: --prefix=/usr --libdir=/usr/lib64 --shlibdir=/usr/lib64 --mandir=/usr/share/man --enable-static --enable-shared --cc=x86_64-pc-linux-gnu-gcc --disable-altivec --disable-debug --disable-audio-oss --disable-v4l --disable-v4l2 --disable-dv1394 --disable-network --disable-opts --enable-libmp3lame --enable-libvorbis --enable-libogg --enable-liba52 --enable-pthreads --enable-libxvid --enable-x11grab --enable-libogg --enable-libx264 --enable-libfaad --enable-libfaac --enable-gpl --enable-pp --disable-strip
libavutil version: 49.4.0
libavcodec version: 51.40.2
libavformat version: 51.11.0
built on Oct 29 2007 18:02:26, gcc: 4.1.2 (Gentoo 4.1.2)
Input #0, avi, from 'test5':
Duration: 00:10:53.8, start: 0.000000, bitrate: 4811 kb/s
Stream #0.0: Video: mpeg2video, yuv420p, 768x432, 104857 kb/s, 24.00 fps(r)
Stream #0.1: Audio: liba52, 48000 Hz, 5:1, 448 kb/s
File 'bench1.avi' already exists. Overwrite ? [y/N] y
Output #0, avi, to 'bench1.avi':
Stream #0.0: Video: mpeg4, yuv420p, 768x432, q=2-31, 1800 kb/s, 24.00 fps(c)
Stream #0.1: Audio: ac3, 48000 Hz, 5:1, 320 kb/s
Stream mapping:
Stream #0.0 -> #0.0
Stream #0.1 -> #0.1
No accelerated IMDCT transform found
Die Anzahl der Threads wird über die -threads Option variiert.
Beim ersten Blick auf das Ergebnis fällt gleich auf: "Da stimmt etwas nicht!" In der Tat, mit dem MPEG4 Codec wird Multithreading zur richtigen Handbremse.
Mal ein näherer Blick auf die CPU Auslastung:

-threads 1

-threads 2
Im Grunde sieht dort alles so aus, wie man es erwartet; mit 2 Threads sind bei Prozessorkerne gut ausgelastet, während ein Thread auch nur einen Kern auslastet. Trotzdem ist das Ergebnis beliebig reproduzierbar, mehrere Threads verlangsamen die Codiergeschwindigkeit. Ein guter praktischer Beweis dafür, dass das Programmieren von Multithreaded Anwendungen doch nicht so einfach ist und auch schon einmal nach hinten losgehen kann.
OK, kann ja mal passieren, als andere Codecs gewählt und weiter probieren.
ffmpeg -threads 1 -benchmark -i test5 -f avi -vcodec xvid -b 1800k -g 300 -bf 2 -acodec vorbis -ab 320k -ac 2 bench1.avi
FFmpeg version SVN-rUNKNOWN, Copyright (c) 2000-2007 Fabrice Bellard, et al.
configuration: --prefix=/usr --libdir=/usr/lib64 --shlibdir=/usr/lib64 --mandir=/usr/share/man --enable-static --enable-shared --cc=x86_64-pc-linux-gnu-gcc --disable-altivec --disable-debug --disable-v4l --disable-v4l2 --disable-dv1394 --disable-network --disable-opts --enable-libmp3lame --enable-libvorbis --enable-libogg --enable-libtheora --enable-libogg --enable-liba52 --enable-pthreads --enable-xvid --enable-x11grab --enable-libogg --enable-x264 --enable-gpl --enable-pp --disable-strip
libavutil version: 49.4.0
libavcodec version: 51.40.2
libavformat version: 51.11.0
built on Oct 20 2007 19:56:19, gcc: 4.1.2 (Gentoo 4.1.2)
Input #0, avi, from 'test5':
Duration: 00:10:53.8, start: 0.000000, bitrate: 1434 kb/s
Stream #0.0: Video: mpeg2video, yuv420p, 768x432, 104857 kb/s, 24.00 fps(r)
Stream #0.1: Audio: ac3, 48000 Hz, 5:1, 448 kb/s
Output #0, avi, to 'bench1.avi':
Stream #0.0: Video: xvid, yuv420p, 768x432, q=2-31, 1800 kb/s, 24.00 fps(c)
Stream #0.1: Audio: vorbis, 48000 Hz, stereo, 320 kb/s
Stream mapping:
Stream #0.0 -> #0.0
Stream #0.1 -> #0.1
No accelerated IMDCT transform found
Huch! Die Kombination xvid/vorbis läuft nur Single Threaded! Eine ziemliche Überraschung, dass ein so populärer Codec im Jahr 2007 immer noch nur einen Prozessorkern auslasten kann. Auch dem Intel Core 2 scheint der xvid Code gar nicht gut zu bekommen, der Athlon 64 X2 kann hier seine Muskeln spielen lassen.
Alle guten Dinge sind drei, also zum nächsten Codec, vielleicht gibt es jetzt bessere Ergebnisse?!
ffmpeg -threads 1 -benchmark -i test5 -f avi -vcodec h264 -b 1800k -g 300 -bf 2 -acodec ac3 -ab 320k bench1.avi
FFmpeg version SVN-rUNKNOWN, Copyright (c) 2000-2007 Fabrice Bellard, et al. configuration: --prefix=/usr --libdir=/usr/lib64 --shlibdir=/usr/lib64 --mandir=/usr/share/man --enable-static --enable-shared --cc=x86_64-pc-linux-gnu-gcc --disable-altivec --disable-debug --disable-audio-oss --disable-v4l --disable-v4l2 --disable-dv1394 --disable-network --disable-opts --enable-libmp3lame --enable-libvorbis --enable-libogg --enable-liba52 --enable-pthreads --enable-libxvid --enable-x11grab --enable-libogg --enable-libx264 --enable-libfaad --enable-libfaac --enable-gpl --enable-pp --disable-strip
libavutil version: 49.4.0
libavcodec version: 51.40.2
libavformat version: 51.11.0
built on Oct 29 2007 18:02:26, gcc: 4.1.2 (Gentoo 4.1.2)
Input #0, avi, from 'test5':
Duration: 00:10:53.8, start: 0.000000, bitrate: 4811 kb/s
Stream #0.0: Video: mpeg2video, yuv420p, 768x432, 104857 kb/s, 24.00 fps(r)
Stream #0.1: Audio: liba52, 48000 Hz, 5:1, 448 kb/s
Output #0, avi, to 'bench1.avi':
Stream #0.0: Video: libx264, yuv420p, 768x432, q=2-31, 1800 kb/s, 24.00 fps(c)
Stream #0.1: Audio: ac3, 48000 Hz, 5:1, 320 kb/s
Stream mapping:
Stream #0.0 -> #0.0
Stream #0.1 -> #0.1
[libx264 @ 0x2b3623aeedb0]using SAR=1/1
[libx264 @ 0x2b3623aeedb0]using cpu capabilities MMX MMXEXT SSE SSE2 3DNow!
No accelerated IMDCT transform found
Auf dem AMD Prozessor waren noch 3DNow!-Befehle aktiviert, auf dem Intel logischweise nur SSE2.
Nah endlich! Es geht also doch, der x264/ac3 Codec zeigt wirkungsvolles Multithreading beim Konvertieren von Audio- und Video-Daten. Einen großen Geschwindigkeitsunterschied gibt es zwischen dem Core 2 und Athlon 64 hier nicht.
Vielleicht noch einmal mit einem anderen Programm probieren? Also schnell den mencoder aus dem MPlayer Paket hervorgeholt.
mencoder -ovc xvid -xvidencopts threads=1:bitrate=3200 -oac mp3lame -lameopts vbr=0 /games/bench2/test5 -o /games/bench2/bench1
MEncoder SVN-r24130 (C) 2000-2007 MPlayer Team
CPU: AMD Athlon(tm) 64 X2 Dual Core Processor 5000+ (Family: 15, Model: 67, Stepping: 2)
MMX2 supported but disabled
3DNow supported but disabled
3DNowExt supported but disabled
CPUflags: Type: 15 MMX: 1 MMX2: 0 3DNow: 0 3DNow2: 0 SSE: 1 SSE2: 1
MPlayer mit CPU-Erkennung zur Laufzeit kompiliert.
Erfolg: Format: 0 Daten: 0x0 - 0x176fc35a
AVI-Dateiformat erkannt!
[aviheader] Videostream gefunden, -vid 0
[aviheader] Audiostream gefunden, -aid 1
VIDEO: [mpg2] 768x432 24bpp 24.000 fps 4358.2 kbps (532.0 kbyte/s)
[V] Dateiformat:3 fourcc:0x3267706D Größe:768x432 fps:24.00 ftime:=0.0417
==========================================================================
Öffne Audiodecoder: [liba52] AC3 decoding with liba52
Using SSE optimized IMDCT transform
Using MMX optimized resampler
AUDIO: 48000 Hz, 2 ch, s16le, 448.0 kbit/29.17% (ratio: 56000->192000)
Ausgewählter Audiocodec: [a52] afm: liba52 (AC3-liba52)
==========================================================================
xvid: using library version 1.1.3 (build xvid-1.1.3)
Öffne Videofilter: [expand osd=1]
Expand: -1 x -1, -1 ; -1, osd: 1, aspect: 0.000000, round: 1
==========================================================================
Öffne Videodecoder: [libmpeg2] MPEG 1/2 Video decoder libmpeg2-v0.4.0b
Ausgewählter Videocodec: [mpeg12] vfm: libmpeg2 (MPEG-1 or 2 (libmpeg2))
==========================================================================
MP3 Audio ausgewählt.
VDec: VO wird versucht, auf 768 x 432 (Bevorzugter Farbraum: Planar YV12) zu setzen.
VDec: Verwende Planar YV12 als Ausgabefarbraum (Nummer 0).
Film-Aspekt ist 1.78:1 - Vorskalierung zur Korrektur der Seitenverhältnisse.
videocodec: XviD (768x432 fourcc=44495658 [XVID])
xvid: par=0/0 (vga11), displayed=768x432, sampled=768x432
xvid: CBR Rate Control -- bitrate=3200kbit/s
New_Face failed. Maybe the font path is wrong.
Please supply the text font file (~/.mplayer/subfont.ttf).
subtitle font: load_sub_face failed.
Pos: 0.0s 1f ( 0%) 0.00fps Trem: 0min 0mb A-V:0.000 [0:0]
Mit xvid Codec ergibts sich beim mencoder das gleich Bild wie bei ffmpeg, war auch irgendwie zu erwarten. :-)
mencoder -ovc x264 -x264encopts threads=1:bitrate=3200 -oac mp3lame -lameopts vbr=0 /games/bench2/test5 -o /games/bench2/bench1
MEncoder SVN-r24130 (C) 2000-2007 MPlayer Team
CPU: AMD Athlon(tm) 64 X2 Dual Core Processor 5000+ (Family: 15, Model: 67, Stepping: 2)
MMX2 supported but disabled
3DNow supported but disabled
3DNowExt supported but disabled
CPUflags: Type: 15 MMX: 1 MMX2: 0 3DNow: 0 3DNow2: 0 SSE: 1 SSE2: 1
MPlayer mit CPU-Erkennung zur Laufzeit kompiliert.
Erfolg: Format: 0 Daten: 0x0 - 0x176fc35a
AVI-Dateiformat erkannt!
[aviheader] Videostream gefunden, -vid 0
[aviheader] Audiostream gefunden, -aid 1
VIDEO: [mpg2] 768x432 24bpp 24.000 fps 4358.2 kbps (532.0 kbyte/s)
[V] Dateiformat:3 fourcc:0x3267706D Größe:768x432 fps:24.00 ftime:=0.0417
==========================================================================
Öffne Audiodecoder: [liba52] AC3 decoding with liba52
Using SSE optimized IMDCT transform
Using MMX optimized resampler
AUDIO: 48000 Hz, 2 ch, s16le, 448.0 kbit/29.17% (ratio: 56000->192000)
Ausgewählter Audiocodec: [a52] afm: liba52 (AC3-liba52)
==========================================================================
Öffne Videofilter: [expand osd=1]
Expand: -1 x -1, -1 ; -1, osd: 1, aspect: 0.000000, round: 1
==========================================================================
Öffne Videodecoder: [libmpeg2] MPEG 1/2 Video decoder libmpeg2-v0.4.0b
Ausgewählter Videocodec: [mpeg12] vfm: libmpeg2 (MPEG-1 or 2 (libmpeg2))
==========================================================================
MP3 Audio ausgewählt.
VDec: VO wird versucht, auf 768 x 432 (Bevorzugter Farbraum: Planar YV12) zu setzen.
Konnte keinen passenden Farbraum finden - neuer Versuch mit '-vf scale'...
Öffne Videofilter: [scale]
VDec: Verwende Planar YV12 als Ausgabefarbraum (Nummer 0).
Film-Aspekt ist 1.78:1 - Vorskalierung zur Korrektur der Seitenverhältnisse.
[swscaler @ 0xbf3a90]SwScaler: using unscaled yuv420p -> yuv420p special converter
x264 [info]: using SAR=1/1
x264 [info]: using cpu capabilities MMX MMXEXT SSE SSE2 3DNow!
Pos: 0.0s 1f ( 0%) 0.00fps Trem: 0min 0mb A-V:0.000 [0:0]
1 doppelte(r) Frame(s)!
Schreibe Dateikopf...
ODML: vprp aspect is 16:9.
Schreibe Dateikopf...
ODML: vprp aspect is 16:9.
New_Face failed. Maybe the font path is wrong.n 0mb A-V:0.004 [0:0]
Please supply the text font file (~/.mplayer/subfont.ttf).
subtitle font: load_sub_face failed.
Schreibe Dateikopf...
ODML: vprp aspect is 16:9.
Auch beim x264 Codec ein ähnliches Bild mit mencoder wie mit ffmpeg.
Soviel erst einmal zur Videokonvertierung. Manchmal will man allerdings auch nur Audiodaten konvertieren, daher noch ein Blick auf oggenc, LAME und flac.
Gleich vorweg, keines der drei Programme unterstützt Multithreading. Hat man mehrere Audiodateien zu konvertieren, kann man allerdings auch mehrere Instanzen gleichzeitig starten und so ebenfalls deutliche Vorteile mit Multi-Core Prozessoren erzielen.
Das Quellmaterial ist eine von CD gerippte Audiodatei im wav Format.
OggEnc v1.0.2
oggenc -q 10 b1.wav
Opening with wav module: WAV file readerEncoding "b1.wav" to "b1.ogg"
at quality 10,00
[ 99,8%] [ 0m00s remaining] /
Done encoding file "b1.ogg"
File length: 7m 39,0s
Elapsed time: 0m 19,3s
Rate: 23,8433
Average bitrate: 457,3 kb/s
Kaum ein Unterschied zwischen AMD und Intel.
lame -V0 b1.wav b2.mp3
LAME version 3.96.1 (http://lame.sourceforge.net/)Using polyphase lowpass filter, transition band: 19383 Hz - 19916 HzEncoding b1.wav to b2.mp3
Encoding as 44.1 kHz VBR(q=0) j-stereo MPEG-1 Layer III (ca. 5.7x) qval=3
Frame | CPU time/estim | REAL time/estim | play/CPU | ETA
17600/17600 (100%)| 0:38/ 0:38| 0:39/ 0:39| 11.917x| 0:00
32 [ 1] *
128 [ 129] %%
160 [ 451] %%%%
192 [ 3851] %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
224 [ 7579] %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
256 [ 4789] %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
320 [ 800] %%%%%%%%
-------------------------------------------------------------------------------
kbps LR MS % long switch short %
227.7 100.0 0.0 97.8 1.1 1.1
Writing LAME Tag...done
ReplayGain: -1.0dB
Hier mal wieder der Intel leicht im Vorteil.
flac -8 -f b1.wav
flac 1.2.1, Copyright (C) 2000,2001,2002,2003,2004,2005,2006,2007 Josh Coalsonflac comes with ABSOLUTELY NO WARRANTY. This is free software, and you are
welcome to redistribute it under certain conditions. Type `flac' for details.
b1.wav: wrote 46269265 bytes, ratio=0,571
Und hier noch einmal ein kleiner Vorteil für AMD.
Eine besondere Anmerkung zu flac, ein Update von flac 1.1 auf 1.2 hat die Encodinggeschwindigkeit ungefähr verdreifacht, auf beiden Systemen.
Was sagen diese Ergebnisse nun? Zum Einen besteht auf der Softwareseite noch eheblicher Nachholbedarf in Punkto Multithreading, zum Anderen überrascht es doch sehr, dass der Core 2 Duo in diesem Bereich seine theoretisch nahezu doppelte SSE Leistung gegenüber dem Athlon 64 praktisch nicht nutzen kann.
OGG Vorbis
Es gibt sehrwohl speziell angepasste Mehrkernversionen des Codecs.
Inkl. der SSE-Unterstützung bis hin zu SSE3.
z.B. die Lancer-Pakete (auch mit aoTuv feintuning zu haben)
http://homepage3.nifty.com/blacksword