Tips en Trucs 2017

FFmpeg zelf compileren

Opensuse en veel andere distributies verwijderen niet vrij te gebruiken onderdelen uit hun systeem. Dit heeft zeker voor video-liefhebbers grote gevolgen. Zelfs het afspelen van een video op het internet lukt dan niet altijd. Oorspronkelijk bevat de gebruikte software deze onderdelen wel. M.a.w. zelf de broncode downloaden en compileren is de oplossing.

FFmpeg is een zeer veel gebruikt systeem om video af te spelen en te coderen. Heel veel software is er op gebaseerd of gebruikt de FFmpeg bibliotheken. Bij de installatie van de VLC media speler wordt een volledig werkend FFMpeg systeem meegeïnstalleerd. Ook bij de installatie van de Google Chrome browser wordt een volledig werkende FFmpeg systeem meegeïnstalleerd. Een andere benadering bestaat uit het éénmaal installeren van het FFmpeg systeem en alle software die er gebruik van wenst te maken kan dit. De FFmpeg bibliotheken worden als het ware gedeeld met alle software. Voor beide systemen valt iets te zeggen. VLC en Chrome zijn bekend om hun veelzijdigheid: ze spelen alles zonder problemen af, zelfs op systemen waarop dit geblokkeerd wordt. Firefox en Chromium werken met gedeelde bibliotheken. Dit heeft als voordeel dat de bibliotheek maar één keer op het systeem aanwezig is en daardoor eenvoudiger te onderhouden is. Het nadeel is echter dat indien degene die verantwoordelijk is voor de bibliotheek iets verwijdert, alle daarop gebaseerde software daar hinder van ondervindt.

Om de door openSUSE meegeleverde beperkte FFmpeg versie te vervangen door een volledige versie, moet je de FFmpeg broncode downloaden:

dany@pindabook:~> wget http://ffmpeg.org/releases/ffmpeg-3.4.tar.bz2
--2017-11-03 16:05:12--  http://ffmpeg.org/releases/ffmpeg-3.4.tar.bz2
Herleiden van ffmpeg.org (ffmpeg.org)... 79.124.17.100
Verbinding maken met ffmpeg.org (ffmpeg.org)|79.124.17.100|:80... verbonden.
HTTP-verzoek is verzonden; wachten op antwoord... 200 OK
Lengte: 10171702 (9,7M) [application/x-bzip2]
Wordt opgeslagen als: ‘ffmpeg-3.4.tar.bz2’

100%[===============================================================>] 10.171.702  3,49MB/s   in 2,8s   

2017-11-03 16:05:15 (3,49 MB/s) - '‘ffmpeg-3.4.tar.bz2’' opgeslagen [10171702/10171702]

Daarna pak je de gedownloade broncode uit in de map /usr/local/src. In de map /usr/local komt software die je zelf manueel installeert, de installatieprogramma's van uw distributie bekijken en beheren de software in deze map niet. De src submap bevat enkel broncode.

dany@pindabook:~> sudo tar -jxf ffmpeg-3.4.tar.bz2 --directory /usr/local/src/
[sudo] wachtwoord voor root:

Open de map met de FFmpeg broncode:

dany@pindabook:~> cd /usr/local/src/ffmpeg-3.4/

Om broncode te compileren heb je software nodig (op mijn systeem ontbreekt alleen het pakket yasm):

dany@pindabook:/usr/local/src/ffmpeg-3.4> sudo zypper install gcc make kernel-default-devel yasm
Gegevens van installatiebron laden...
Lezen van geïnstalleerde pakketten...
'make' is al geïnstalleerd.
Geen updatekandidaat voor bijwerken van 'make-4.0-7.15.x86_64'. De hoogst beschikbare versie is al geïnstalleerd.
'gcc' is al geïnstalleerd.
Geen updatekandidaat voor bijwerken van 'gcc-4.8-11.16.x86_64'. De hoogst beschikbare versie is al geïnstalleerd.
'kernel-default-devel' is al geïnstalleerd.
Geen updatekandidaat voor bijwerken van 'kernel-default-devel-4.4.92-31.1.x86_64'. De hoogst beschikbare versie is al geïnstalleerd.
Pakketafhankelijkheden oplossen...

Het volgende NIEUWE pakket zal worden geïnstalleerd:
  yasm

1 nieuw te installeren pakket.
Totale downloadgrootte: 352,2 KiB. Reeds in de cache: 0 B. Na de bewerking zal aanvullend 2,0 MiB worden
gebruikt.
Doorgaan? [j/n/...? alle opties tonen] (j): 
pakket yasm-1.2.0-14.14.x86_64 wordt opgehaald                     (1/1), 352,2 KiB (  2,0 MiB uitgepakt)
Ophalen: yasm-1.2.0-14.14.x86_64.rpm ............................................................[gereed]
Controleren op conflicten tussen bestanden: .....................................................[gereed]
(1/1) Installeert: yasm-1.2.0-14.14.x86_64 ......................................................[gereed]

Daarna bepalen we hoe we FFmpeg willen compileren. In ons geval willen we gedeelde (shared) bibliotheken bekomen voor Firefox en Chromium en geen statische bibliotheken zoals voor VLC of Chrome. Bij de configuratie wordt eveneens getest of alle onderdelen voor het compileren op uw systeem aanwezig zijn. Op het einde krijg je een overzicht van alle door FFmpeg ondersteunde functies.

dany@pindabook:/usr/local/src/ffmpeg-3.4> ./configure --enable-shared --disable-static          
install prefix            /usr/local
source path               .
C compiler                gcc
C library                 glibc
ARCH                      x86 (generic)
big-endian                no
runtime cpu detection     yes
standalone assembly       yes
x86 assembler             yasm
MMX enabled               yes
MMXEXT enabled            yes
3DNow! enabled            yes
3DNow! extended enabled   yes
SSE enabled               yes
SSSE3 enabled             yes
AESNI enabled             yes
AVX enabled               yes
AVX2 enabled              yes
XOP enabled               yes
FMA3 enabled              yes
FMA4 enabled              yes
i686 features enabled     yes
CMOV is fast              yes
EBX available             yes
EBP available             yes
debug symbols             yes
strip symbols             yes
optimize for size         no
optimizations             yes
static                    no
shared                    yes
postprocessing support    no
network support           yes
threading support         pthreads
safe bitstream reader     yes
texi2html enabled         no
perl enabled              yes
pod2man enabled           yes
makeinfo enabled          no
makeinfo supports HTML    no

External libraries:
iconv                     xlib

External libraries providing hardware acceleration:
cuda                      cuvid                     nvenc                     v4l2_m2m

Libraries:
avcodec                   avfilter                  avutil                    swscale
avdevice                  avformat                  swresample

Programs:
ffmpeg                    ffprobe                   ffserver

Enabled decoders:
aac                       aura2                     ffvhuff                   motionpixels
...
realtext                  targa_y216                vp7                       zero12v

Enabled encoders:
a64multi                  flv                       pcm_mulaw                 rv20
...
flac                      pcm_f64le                 rv10

Enabled hwaccels:
h264_cuvid                mpeg1_cuvid               mpeg4_cuvid               vp8_cuvid
hevc_cuvid                mpeg2_cuvid               vc1_cuvid                 vp9_cuvid
mjpeg_cuvid

Enabled parsers:
aac                       dpx                       h264                      rv30
aac_latm                  dvaudio                   hevc                      rv40
ac3                       dvbsub                    mjpeg                     sipr
adx                       dvd_nav                   mlp                       tak
bmp                       dvdsub                    mpeg4video                vc1
cavsvideo                 flac                      mpegaudio                 vorbis
cook                      g729                      mpegvideo                 vp3
dca                       gsm                       opus                      vp8
dirac                     h261                      png                       vp9
dnxhd                     h263                      pnm                       xma

Enabled demuxers:
aa                        flac                      lrc                       r3d
...
wsvqa                     xa                        xvag                      yuv4mpegpipe
wtv

Enabled muxers:
a64                       g726                      mpeg2dvd                  rm
...
g722                      mpeg1vcd                  rawvideo                  yuv4mpegpipe
g723_1                    mpeg1video

Enabled protocols:
async                     ftp                       mmsh                      srtp
cache                     gopher                    mmst                      subfile
concat                    hls                       pipe                      tcp
crypto                    http                      prompeg                   tee
data                      httpproxy                 rtmp                      udp
ffrtmphttp                icecast                   rtmpt                     udplite
file                      md5                       rtp                       unix

Enabled filters:
abench                    blackdetect               gblur                     readeia608
...
vflip                     volumedetect              weave                     zoompan
vibrato

Enabled bsfs:
aac_adtstoasc             h264_mp4toannexb          mov2textsub               remove_extradata
chomp                     hevc_mp4toannexb          mp3_header_decompress     text2movsub
dca_core                  imx_dump_header           mpeg4_unpack_bframes      vp9_raw_reorder
dump_extradata            mjpeg2jpeg                noise                     vp9_superframe
extract_extradata         mjpega_dump_header        null                      vp9_superframe_split

Enabled indevs:
fbdev                     lavfi                     oss                       v4l2

Enabled outdevs:
fbdev                     oss                       v4l2

License: LGPL version 2.1 or later
Creating configuration files ...

Na een geslaagde configuratie (zonder foutmeldingen) kan je het compileren starten (wees geduldig):

dany@pindabook:/usr/local/src/ffmpeg-3.4> make
GEN     libavutil/libavutil.version
GEN     libswscale/libswscale.version
GEN     libswresample/libswresample.version
GEN     libavcodec/libavcodec.version
GEN     libavformat/libavformat.version
GEN     libavfilter/libavfilter.version
GEN     libavdevice/libavdevice.version
CC      libavdevice/alldevices.o
CC      libavdevice/avdevice.o
CC      libavdevice/fbdev_common.o
...
fftools/ffserver.c: In function ‘build_file_streams’:
fftools/ffserver.c:3686:17: warning: ‘codec’ is deprecated (declared at ./libavformat/avformat.h:893) [-Wdeprecated-declarations]
                 add_av_stream1(stream, infile->streams[i]->codec, 1);
                 ^
LD      ffserver_g
STRIP   ffserver

Daarna verwijderen we de openSUSE FFmpeg versie van het systeem. Dit kan volgens mij enkel met een rpm opdracht (zypper is gebaseerd op rpm).

dany@pindabook:/usr/local/src/ffmpeg-3.4> sudo rpm -e --nodeps libavcodec57 libavdevice57 libavfilter6 libavformat57 libavutil55 libswresample2 libswscale4
[sudo] wachtwoord voor root:

We moeten deze pakketten niet alleen verwijderen, maar ook verhinderen dat ze terug op het systeem terecht komen. Dit kan namelijk als zypper de afhankelijkheden controleert bij een update of installatie. Je kunt de toestand van deze pakketten vergrendelen met:

dany@pindabook:/usr/local/src/ffmpeg-3.4> sudo zypper addlock libavcodec57 libavdevice57 libavfilter6 libavformat57 libavutil55 libswresample2 libswscale4
De gespecificeerde blokkeringen zijn met succes toegevoegd.

Daarna kan je de zelf gecompileerde FFmpeg bibliotheken installeren:

dany@pindabook:/usr/local/src/ffmpeg-3.4> sudo make install
INSTALL libavdevice/libavdevice.so
STRIP   install-libavdevice-shared
INSTALL libavfilter/libavfilter.so
STRIP   install-libavfilter-shared
INSTALL libavformat/libavformat.so
STRIP   install-libavformat-shared
INSTALL libavcodec/libavcodec.so
STRIP   install-libavcodec-shared
INSTALL libswresample/libswresample.so
STRIP   install-libswresample-shared
INSTALL libswscale/libswscale.so
STRIP   install-libswscale-shared
INSTALL libavutil/libavutil.so
STRIP   install-libavutil-shared
INSTALL doc/ffmpeg.1
INSTALL doc/ffprobe.1
...
INSTALL libavutil/xtea.h
INSTALL libavutil/tea.h
INSTALL libavutil/lzo.h
INSTALL libavutil/avconfig.h
INSTALL libavutil/ffversion.h
INSTALL libavutil/libavutil.pc

Nu de nieuwe bibliotheken nog voor andere software beschikbaar stellen met:

dany@pindabook:/usr/local/src/ffmpeg-3.4> sudo ldconfig

De bibliotheken staan nu in de lib submap van /usr/local. Zo kom je te weten welke pakketten je moet verwijderen en vergrendelen.

dany@pindabook:/usr/local/src/ffmpeg-3.4> ls /usr/local/lib/
libavcodec.so             libavfilter.so            libavutil.so              libswscale.so
libavcodec.so.57          libavfilter.so.6          libavutil.so.55           libswscale.so.4
libavcodec.so.57.107.100  libavfilter.so.6.107.100  libavutil.so.55.78.100    libswscale.so.4.8.100
libavdevice.so            libavformat.so            libswresample.so          pkgconfig
libavdevice.so.57         libavformat.so.57         libswresample.so.2
libavdevice.so.57.10.100  libavformat.so.57.83.100  libswresample.so.2.9.100

Na het (her)starten van Firefox kan je nu om het even welke video op internet bekijken.
Firefox video

Bij een update met zypper merken we dat de openSUSE FFmpeg bibliotheken vergrendeld zijn en dus niet geïnstalleerd worden:

dany@pindabook:~> sudo zypper up
[sudo] wachtwoord voor root: 
Gegevens van installatiebron laden...
Lezen van geïnstalleerde pakketten...

Het volgende 7 items zijn vergrendeld en zullen niet worden veranderd door welke actie dan ook:
 Beschikbaar:
  libavcodec57 libavdevice57 libavfilter6 libavformat57 libavutil55 libswresample2 libswscale4

De volgende 20 items voor bijwerken van een pakket worden NIET geïnstalleerd:
  autofs btrfsmaintenance btrfsprogs btrfsprogs-udev-rules e2fsprogs fuse gptfdisk libbtrfs0 libcom_err2
  libext2fs2 libfuse2 libgphoto2-6 libgphoto2-6-lang libparted0 libreiserfscore0 libtwolame0 ntfs-3g
  ntfsprogs parted sshfs

De volgende toepassing zal worden VERWIJDERD:
  "VLC Media player"

De volgende 8 pakketten zullen worden opgewaardeerd:
  libvlc5 libvlccore8 vlc vlc-codec-gstreamer vlc-codecs vlc-lang vlc-noX vlc-qt

8 op te waarderen pakketten.
Totale downloadgrootte: 9,8 MiB. Reeds in de cache: 0 B. Na de bewerking zal aanvullend 41,0 B worden
gebruikt.
Doorgaan? [j/n/...? alle opties tonen] (j): 
pakket libvlccore8-2.2.6-5.2.x86_64 wordt opgehaald                (1/8), 426,7 KiB (  1,0 MiB uitgepakt)
Ophalen: libvlccore8-2.2.6-5.2.x86_64.rpm .......................................................[gereed]
pakket libvlc5-2.2.6-5.2.x86_64 wordt opgehaald                    (2/8),  96,5 KiB (131,5 KiB uitgepakt)
Ophalen: libvlc5-2.2.6-5.2.x86_64.rpm ..............................................[gereed (85,0 KiB/s)]
pakket vlc-noX-2.2.6-5.2.x86_64 wordt opgehaald                    (3/8),   3,3 MiB ( 11,5 MiB uitgepakt)
Ophalen: vlc-noX-2.2.6-5.2.x86_64.rpm ...............................................[gereed (1,7 MiB/s)]
pakket vlc-qt-2.2.6-5.2.x86_64 wordt opgehaald                     (4/8),   1,1 MiB (  3,0 MiB uitgepakt)
Ophalen: vlc-qt-2.2.6-5.2.x86_64.rpm ..............................................[gereed (196,7 KiB/s)]
pakket vlc-2.2.6-5.2.x86_64 wordt opgehaald                        (5/8), 248,3 KiB (401,7 KiB uitgepakt)
Ophalen: vlc-2.2.6-5.2.x86_64.rpm ...............................................................[gereed]
pakket vlc-lang-2.2.6-5.2.noarch wordt opgehaald                   (6/8),   4,5 MiB ( 32,1 MiB uitgepakt)
Ophalen: vlc-lang-2.2.6-5.2.noarch.rpm ..............................................[gereed (1,5 MiB/s)]
pakket vlc-codecs-2.2.6-5.2.x86_64 wordt opgehaald                 (7/8), 129,5 KiB (286,0 KiB uitgepakt)
Ophalen: vlc-codecs-2.2.6-5.2.x86_64.rpm ........................................................[gereed]
pakket vlc-codec-gstreamer-2.2.6-5.2.x86_64 wordt opgehaald        (8/8),  61,5 KiB ( 26,6 KiB uitgepakt)
Ophalen: vlc-codec-gstreamer-2.2.6-5.2.x86_64.rpm ...............................................[gereed]
Controleren op conflicten tussen bestanden: .....................................................[gereed]
(1/8) Installeert: libvlccore8-2.2.6-5.2.x86_64 .................................................[gereed]
(2/8) Installeert: libvlc5-2.2.6-5.2.x86_64 .....................................................[gereed]
(3/8) Installeert: vlc-noX-2.2.6-5.2.x86_64 .....................................................[gereed]
(4/8) Installeert: vlc-qt-2.2.6-5.2.x86_64 ......................................................[gereed]
(5/8) Installeert: vlc-2.2.6-5.2.x86_64 .........................................................[gereed]
(6/8) Installeert: vlc-lang-2.2.6-5.2.noarch ....................................................[gereed]
(7/8) Installeert: vlc-codecs-2.2.6-5.2.x86_64 ..................................................[gereed]
(8/8) Installeert: vlc-codec-gstreamer-2.2.6-5.2.x86_64 .........................................[gereed]

Bij het installeren van nieuwe op FFmpeg gebaseerde software, kan door de vergrendeling niet meer aan de afhankelijkheden worden voldaan. Je krijgt een melding met een paar opties. Betreft het enkel de FFmpeg bibliotheken, negeer dan deze afhankelijkheden en laat de installatie doorgaan:

dany@pindabook:~> sudo zypper install chromium
Gegevens van installatiebron laden...
Lezen van geïnstalleerde pakketten...
Pakketafhankelijkheden oplossen...

Probleem: chromium-62.0.3202.75-121.1.x86_64 vereist libavcodec.so.57()(64bit), maar aan deze eis kan niet voldaan worden
  niet-installeerbare providers: libavcodec57-3.3.1-1.1.x86_64[repo-oss]
                   libavcodec57-3.3.4-7.1.x86_64[repo-update]
 Oplossing 1: De volgende acties zullen uitgevoerd worden:
  verwijder de vergrendeling om de installatie van libavcodec57-3.3.1-1.1.x86_64[repo-oss] toe te staan
  verwijder de vergrendeling om de installatie van libswresample2-3.3.1-1.1.x86_64[repo-oss] toe te staan
 Oplossing 2: verwijder de vergrendeling om de installatie van libavcodec57-3.3.4-7.1.x86_64[repo-update] toe te staan
 Oplossing 3: chromium-62.0.3202.75-121.1.x86_64 niet installeren
 Oplossing 4: chromium-62.0.3202.75-121.1.x86_64 afbreken door enige van zijn afhankelijkheden te negeren

Kies uit de bovenstaande oplossingen door een nummer of kies (a)nnuleren [1/2/3/4/a] (a): 4
Afhankelijkheden oplossen...
Pakketafhankelijkheden oplossen...

De volgende toepassing wordt geïnstalleerd:
  Chromium

De volgende 6 NIEUWE pakketten zullen worden geïnstalleerd:
  chromium libminizip1 libre2-0 libwebpmux1 noto-coloremoji-fonts noto-emoji-fonts

De volgende 2 aanbevolen pakketten zijn automatisch geselecteerd:
  noto-coloremoji-fonts noto-emoji-fonts

6 nieuwe te installeren pakketten.
Totale downloadgrootte: 57,2 MiB. Reeds in de cache: 0 B. Na de bewerking zal aanvullend 203,9 MiB worden
gebruikt.
Doorgaan? [j/n/...? alle opties tonen] (j): 
pakket noto-coloremoji-fonts-20151215-4.13.noarch wordt opgehaald  (1/6),   2,2 MiB (  2,5 MiB uitgepakt)
Ophalen: noto-coloremoji-fonts-20151215-4.13.noarch.rpm ............................[gereed (17,5 KiB/s)]
pakket noto-emoji-fonts-20151215-4.13.noarch wordt opgehaald       (2/6), 269,9 KiB (409,0 KiB uitgepakt)
Ophalen: noto-emoji-fonts-20151215-4.13.noarch.rpm ..............................................[gereed]
pakket libminizip1-1.2.8-13.15.x86_64 wordt opgehaald              (3/6),  28,9 KiB ( 49,0 KiB uitgepakt)
Ophalen: libminizip1-1.2.8-13.15.x86_64.rpm .....................................................[gereed]
pakket libre2-0-20161101-5.1.x86_64 wordt opgehaald                (4/6), 143,3 KiB (411,9 KiB uitgepakt)
Ophalen: libre2-0-20161101-5.1.x86_64.rpm .......................................................[gereed]
pakket libwebpmux1-0.4.3-9.3.x86_64 wordt opgehaald                (5/6),  20,1 KiB ( 30,4 KiB uitgepakt)
Ophalen: libwebpmux1-0.4.3-9.3.x86_64.rpm .......................................................[gereed]
pakket chromium-62.0.3202.75-121.1.x86_64 wordt opgehaald          (6/6),  54,5 MiB (200,6 MiB uitgepakt)
Ophalen: chromium-62.0.3202.75-121.1.x86_64.rpm .....................................[gereed (3,3 MiB/s)]
Controleren op conflicten tussen bestanden: .....................................................[gereed]
(1/6) Installeert: noto-coloremoji-fonts-20151215-4.13.noarch ...................................[gereed]
(2/6) Installeert: noto-emoji-fonts-20151215-4.13.noarch ........................................[gereed]
(3/6) Installeert: libminizip1-1.2.8-13.15.x86_64 ...............................................[gereed]
(4/6) Installeert: libre2-0-20161101-5.1.x86_64 .................................................[gereed]
(5/6) Installeert: libwebpmux1-0.4.3-9.3.x86_64 .................................................[gereed]
(6/6) Installeert: chromium-62.0.3202.75-121.1.x86_64 ...........................................[gereed]

Chromium werkt en speelt video's op het internet af.
Chrome video