Tecnologia e non solo

maggio 14, 2013

x264: comprimere a 10 bit con ffmpeg

Filed under: Debian,Video — telperion @ 7:21 pm

Ultimamente va di moda comprimere con x264 a 10 bit e profilo high 10.

Vediamo come fare


Con ffmpeg di sistema (che deve avere --enable-libx264 nella configurazione),
esempio con debian-multimedia:

ffmpeg version 1.0.7 Copyright (c) 2000-2013 the FFmpeg developers
built on May 14 2013 06:27:36 with gcc 4.7 (Debian 4.7.3-4)

o con una versione compilata da voi, ad esempio:

ffmpeg version N-53043-g6b13f54 Copyright (c) 2000-2013 the FFmpeg developers
built on May 14 2013 15:34:04 with gcc 4.7 (Debian 4.7.3-4)

cioè un 1.2+git-g6b13f54,
viene usata la libx264 di sistema, che è compilata a 8 bit.

Per comprimere a 10 bit è necessario ricompilare x264 con il supporto ai 10 bit.
Se avete come nel mio caso la libx264-132, potete scaricarvi uno snapshot, scompattarlo e compilarlo con:

./configure \
--prefix=/opt/x264-10 \
--extra-cflags='-g -O3 -fstack-protector \
--param=ssp-buffer-size=4 -Wformat -Werror=format-security ' \
--extra-ldflags='-Wl,-z,relro' \
--enable-static \
--enable-pic \
--bit-depth=10 \
--enable-visualize \
--disable-lavf \
--enable-shared

poi i soliti
make
sudo make install

installeranno la nuova lib in /opt/x264-10, senza disturbare il sistema.

Ora per far usare a ffmpeg la libreria, basta creare un wrapper:

#-------------------------------------
#!/bin/sh

LD_LIBRARY_PATH=/opt/x264-10/lib
export LD_LIBRARY_PATH

ffmpeg "$@"
#-------------------------------------

salvatelo come

ffmpeg-x10bit

rendetelo eseguibile, e spostatelo in
/usr/local/bin/ffmpeg-x10bit

Ora se volete usare il normale 8bit lanciate ffmpeg,
se volete usare il 10bit lanciate ffmpeg-x10bit.

Qualche test.

10 bit

ffmpeg-x10bit -y -i /home/mc/test.mkv -t 00:03:00 -c:v libx264 -profile high10 -preset faster -tune film -b:v 730k -an -f matroska out2.mkv
ffmpeg version N-53043-g6b13f54 Copyright (c) 2000-2013 the FFmpeg developers
built on May 14 2013 15:34:04 with gcc 4.7 (Debian 4.7.3-4)
Input #0, matroska,webm, from '/home/mc/test.mkv':

Duration: 00:42:56.21, start: 0.000000, bitrate: 845 kb/s
Stream #0:0(und): Video: h264 (High), yuv420p, 720x406, SAR 1:1 DAR 360:203

[libx264 @ 0x349f240] using SAR=1/1
[libx264 @ 0x349f240] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.1 Cache64
[libx264 @ 0x349f240] profile High 10, level 3.0, 4:2:0 10-bit
[libx264 @ 0x349f240] 264 - core 132 - H.264/MPEG-4 AVC codec - Copyleft 2003-2013

Output #0, matroska, to 'out2.mkv':
frame= 4313 fps= 82 q=-1.0 Lsize= 16420kB time=00:02:59.93 bitrate= 747.6kbits/s
video:16387kB audio:0kB subtitle:0 global headers:0kB muxing overhead 0.195247%

real 0m52.385s

52 secondi per un video 720×406 di 3 minuti.

8 bit:

ffmpeg -y -i /home/mc/test.mkv -t 00:03:00 -c:v libx264 -profile high10 -preset faster -tune film -b:v 730k -an -f matroska out1.mkv
ffmpeg version N-53043-g6b13f54 Copyright (c) 2000-2013 the FFmpeg developers
built on May 14 2013 15:34:04 with gcc 4.7 (Debian 4.7.3-4)
Input #0, matroska,webm, from '/home/mc/test.mkv':

Duration: 00:42:56.21, start: 0.000000, bitrate: 845 kb/s
Stream #0:0(und): Video: h264 (High), yuv420p, 720x406, SAR 1:1 DAR 360:203

[libx264 @ 0x21fe240] using SAR=1/1
[libx264 @ 0x21fe240] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.1 Cache64
[libx264 @ 0x21fe240] profile High, level 3.0
[libx264 @ 0x21fe240] 264 - core 132 - H.264/MPEG-4 AVC codec - Copyleft 2003-2013

Output #0, matroska, to 'out1.mkv':
frame= 4313 fps=124 q=-1.0 Lsize= 16436kB time=00:02:59.93 bitrate= 748.3kbits/s
video:16404kB audio:0kB subtitle:0 global headers:0kB muxing overhead 0.195050%

real 0m34.758s

Solo 35 secondi per lo stesso video.

Se sia il caso di aumentare il tempo di compressione per avere i 10 bit, onestamente non saprei dirvi, non noto particolari differenze ad occhio.

Tenete poi presente che x264 a 10bit non viene accelerato da VDPAU durante la visione, e quindi va tutto a carico della cpu.

Il gioco vale la candela?
Per me no, poi va a gusti.

PS.

Lo stesso giochetto, funziona anche con avconv

mc@debian64:~/develop-deb/libav/0.8.7$ time ./avconv-x10bit -y -i /home/test.mkv -t 00:03:00 -c:v libx264 -profile high10 -preset faster -tune film -b:v 730k -an -f matroska out1.mkv
avconv version 0.8.7, Copyright (c) 2000-2013 the Libav developers
built on May 14 2013 22:53:32 with gcc 4.7.3
[matroska,webm @ 0x2801000] Estimating duration from bitrate, this may be inaccurate
Input #0, matroska,webm, from '/home/test.mkv':

Duration: 00:42:56.21, start: 0.000000, bitrate: N/A
Stream #0.0(und): Video: h264 (High), yuv420p, 720x406, PAR 1:1 DAR 360:203, 23.98 fps

Incompatible pixel format 'yuv420p' for codec 'libx264', auto-selecting format 'yuv420p10le'
[buffer @ 0x287bea0] w:720 h:406 pixfmt:yuv420p
[avsink @ 0x2877640] auto-inserting filter 'auto-inserted scaler 0' between the filter 'src' and the filter 'out'
[scale @ 0x28785a0] w:720 h:406 fmt:yuv420p -> w:720 h:406 fmt:yuv420p10le flags:0x4
[libx264 @ 0x2832800] using SAR=1/1
[libx264 @ 0x2832800] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.1 Cache64
[libx264 @ 0x2832800] profile High 10, level 3.0, 4:2:0 10-bit
[libx264 @ 0x2832800] 264 - core 132 - H.264/MPEG-4 AVC codec - Copyleft 2003-2013

Output #0, matroska, to 'out1.mkv':
Metadata:
Stream #0.0(und): Video: libx264, yuv420p10le, 720x406 [PAR 1:1 DAR 360:203], q=-1--1, 730 kb/s, 1k tbn, 23.98 tbc (default)

Stream mapping:
Stream #0:0 -> #0:0 (h264 -> libx264)

frame= 4313 fps= 90 q=-1.0 Lsize= 16396kB time=179.97 bitrate= 746.3kbits/s
video:16363kB audio:0kB global headers:0kB muxing overhead 0.195856%

real 0m48.258s

Crea un sito o un blog gratuitamente presso WordPress.com.

%d blogger cliccano Mi Piace per questo: