Sign inSign up

spion06/ffmpeg

By spion06

•Updated over 6 years ago

Image
0

363

spion06/ffmpeg repository overview

⁠FFmpeg Docker image

Docker Stars Docker pulls gitlab pipeline status Azure Build Status Docker Automated build

This project prepares a minimalist Docker image with FFmpeg. It compiles FFmpeg from sources following instructions from the Compilation Guide⁠.

You can install the latest build of this image by running docker pull jrottenberg/ffmpeg.

This image can be used as a base for an encoding farm.

⁠Builds

You can use jrottenberg/ffmpeg or jrottenberg/ffmpeg:3.3 to get the latest build based on ubuntu.

Note : I've made ubuntu the default after 3.1

You'll find centos based image using ffmpeg:X.Y-centos or ffmpeg:centos to get the latest. alpine images ffmpeg:X.Y-alpine to get the latest. scratch images ffmpeg:X.Y-scratch to get the latest. (Scratch is an experimental image containing only FFmpeg and libraries)

Format is ffmpeg:MAJOR.MINOR-VARIANT with MAJOR.MINOR in :

  • 2.8
  • 3.0
  • 3.1
  • 3.2
  • 3.3
  • 3.4
  • 4.0
  • 4.1
  • snapshot

and VARIANT in :

  • alpine
  • centos
  • nvidia
  • scratch
  • ubuntu
  • vaapi

Recent images:

snapshot-vaapi      74mb
snapshot-ubuntu     86mb
snapshot-scratch    20mb
snapshot-nvidia     640mb
snapshot-centos     97mb
snapshot-alpine     35mb
4.1-vaapi           73mb
4.1-ubuntu          85mb
4.1-scratch         20mb
4.1-nvidia          640mb
4.1-centos          97mb
4.1-alpine          34mb
4.0-vaapi           73mb
4.0-ubuntu          83mb
4.0-scratch         20mb
4.0-nvidia          639mb
4.0-centos          97mb
4.0-alpine          34mb
3.4-vaapi           71mb
3.4-ubuntu          83mb
3.4-scratch         18mb
3.4-nvidia          637mb
3.4-centos          97mb
3.4-alpine          32mb
3.4                 83mb
3.3-vaapi           71mb
3.3-ubuntu          83mb
3.3-scratch         18mb
3.3-nvidia          637mb
3.3-centos          96mb
3.3-alpine          31mb
3.3                 82mb
3.2-vaapi           83mb
3.2-ubuntu          83mb
3.2-scratch         18mb
3.2-nvidia          623mb
3.2-centos          96mb
3.2-alpine          32mb
3.1-vaapi           83mb
3.1-ubuntu          82mb
3.1-scratch         17mb
3.1-nvidia          623mb
3.1-centos          96mb
3.1-alpine          32mb
3.1                 81mb
3.0-ubuntu          82mb
3.0-scratch         17mb
3.0-nvidia          623mb
3.0-centos          96mb
3.0-alpine          31mb
2.8-vaapi           82mb
2.8-ubuntu          81mb
2.8-scratch         17mb
2.8-nvidia          622mb
2.8-centos          95mb
2.8-alpine          30mb
⁠How the 'recent images' was generated
$ curl --silent https://hub.docker.com/v2/repositories/jrottenberg/ffmpeg/tags/?page_size=500 | jq -cr ".results|sort_by(.name)|reverse[]|.sz=(.full_size/1048576|floor|tostring+\"mb\")|[.name,( (20-(.name|length))*\" \" ),.sz,( (8-(.sz|length))*\" \"),.last_updated[:10]]|@text|gsub(\"[,\\\"\\\]\\\[]\";null)"

# If you want to compare the one you have locally
$ docker images | grep ffmpeg | sort | awk '{print $1 ":" $2 "\t" $7 $8}'

Please use Github issues⁠ to report any bug or missing feature.

⁠Test

ffmpeg version 4.2.2 Copyright (c) 2000-2019 the FFmpeg developers
  built with gcc 7 (Ubuntu 7.5.0-3ubuntu1~18.04)
  configuration: --disable-debug --disable-doc --disable-ffplay --enable-shared --enable-avresample --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-gpl --enable-libass --enable-fontconfig --enable-libfreetype --enable-libvidstab --enable-libmp3lame --enable-libopus --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libxcb --enable-libx265 --enable-libxvid --enable-libx264 --enable-nonfree --enable-openssl --enable-libfdk_aac --enable-postproc --enable-small --enable-version3 --enable-libbluray --enable-libzmq --enable-libsrt --extra-libs=-ldl --prefix=/opt/ffmpeg --enable-libopenjpeg --enable-libkvazaar --enable-libaom --extra-libs=-lpthread --extra-cflags=-I/opt/ffmpeg/include --extra-ldflags=-L/opt/ffmpeg/lib
  libavutil      56. 31.100 / 56. 31.100
  libavcodec     58. 54.100 / 58. 54.100
  libavformat    58. 29.100 / 58. 29.100
  libavdevice    58.  8.100 / 58.  8.100
  libavfilter     7. 57.100 /  7. 57.100
  libavresample   4.  0.  0 /  4.  0.  0
  libswscale      5.  5.100 /  5.  5.100
  libswresample   3.  5.100 /  3.  5.100
  libpostproc    55.  5.100 / 55.  5.100

  configuration:
    --disable-debug
    --disable-doc
    --disable-ffplay
    --enable-shared
    --enable-avresample
    --enable-libopencore-amrnb
    --enable-libopencore-amrwb
    --enable-gpl
    --enable-libass
    --enable-fontconfig
    --enable-libfreetype
    --enable-libvidstab
    --enable-libmp3lame
    --enable-libopus
    --enable-libtheora
    --enable-libvorbis
    --enable-libvpx
    --enable-libwebp
    --enable-libxcb
    --enable-libx265
    --enable-libxvid
    --enable-libx264
    --enable-nonfree
    --enable-openssl
    --enable-libfdk_aac
    --enable-postproc
    --enable-small
    --enable-version3
    --enable-libbluray
    --enable-libzmq
    --enable-libsrt
    --extra-libs=-ldl
    --prefix=/opt/ffmpeg
    --enable-libopenjpeg
    --enable-libkvazaar
    --enable-libaom
    --extra-libs=-lpthread
    --extra-cflags=-I/opt/ffmpeg/include
    --extra-ldflags=-L/opt/ffmpeg/lib

Capture output from the container to the host running the command

 docker run jrottenberg/ffmpeg \
            -i http://url/to/media.mp4 \
            -stats \
            $ffmpeg_options  - > out.mp4
⁠Examples
⁠Extract 5s @00:49:42 into a GIF
 docker run jrottenberg/ffmpeg -stats  \
        -i http://archive.org/download/thethreeagesbusterkeaton/Buster.Keaton.The.Three.Ages.ogv \
        -loop 0  \
        -final_delay 500 -c:v gif -f gif -ss 00:49:42 -t 5 - > trow_ball.gif
⁠Convert 10bits MKV into a 10Bits MP4
 docker run -v $(pwd):$(pwd) -w $(pwd) jrottenberg/ffmpeg:3.4-scratch \
        -stats \
        -i http://www.jell.yfish.us/media/jellyfish-20-mbps-hd-hevc-10bit.mkv \
        -c:v libx265 -pix_fmt yuv420p10 \
        -t 5 -f mp4 test.mp4

The image has been compiled with X265 Multilib⁠. Use the pixel format switch to change the number of bits per pixel by suffixing it with 10 for 10bits or 12 for 12bits.

⁠Convert a local GIF into a mp4

Let's assume original.gif is located in the current directory :

 docker run -v $(pwd):$(pwd) -w $(pwd)\
        jrottenberg/ffmpeg:3.2-scratch -stats \
        -i original.gif \
        original-converted.mp4
⁠Use ZeroMQ to toggle filter value on-fly

Let's start some process continuously writing some radio music, and listen it:

 docker run --rm -d -v $(pwd):$(pwd) -w $(pwd) -p 11235:11235 \
        --name radio-writer jrottenberg/ffmpeg \
        -i http://radio.casse-tete.solutions/salut-radio-64.mp3 \
        -filter_complex '[0:a]volume@vol=1,azmq=bind_address=tcp\\\://0.0.0.0\\\:11235[out]' \
        -map '[out]' ./salut-radio.mp3

 ffplay ./salut-radio.mp3

Now, just toggle its volume on-fly, and hear how it changes:

 docker run --rm --network=host --entrypoint sh jrottenberg/ffmpeg -c \
        'echo "volume@vol volume 2" | zmqsend -b tcp://127.0.0.1:11235'
⁠Send a stream over SRT

Let's send video.mp4 to srt-listener on port 9000 over SRT protocol.

docker run -v $(pwd):$(pwd) jrottenberg/ffmpeg \
       -re -i $(pwd)/video.mp4 -acodec copy -vcodec copy -f mpegts srt://srt-listener:9000?pkt_size=1316
⁠Use hardware acceleration enabled build

Thanks to qmfrederik⁠ for the vaapi ubuntu based variant⁠

jrottenberg/ffmpeg:vaapi or jrottenberg/ffmpeg:${VERSION}-vaapi

  • Run the container with the device attached /dev/dri from your host into the container :

docker run --device /dev/dri:/dev/dri -v $(pwd):$(pwd) -w $(pwd) jrottenberg/ffmpeg:vaapi [...]

  • Have the Intel drivers up and running on your host. You can run vainfo (part of vainfo package on Ubuntu) to determine whether your graphics card has been recognized correctly.
  • Run ffmpeg with the correct parameters, this is the same as when running ffmpeg natively⁠.
⁠Use nvidia hardware acceleration enabled build

Thanks to ShaulMyplay⁠ for the nvidia based variant⁠

Supports nvenc only on all ffmpeg versions, and hardware decoding and scaling on ffmpeg >= 4.0

Hardware encoding only example:

docker run --runtime=nvidia jrottenberg/ffmpeg:2.8-nvidia -i INPUT -c:v nvenc_h264 -preset hq OUTPUT Full hardware acceleration example: docker run --runtime=nvidia jrottenberg/ffmpeg:4.1-nvidia -hwaccel cuvid -c:v h264_cuvid -i INPUT -vf scale_npp=-1:720 -c:v h264_nvenc -preset slow OUTPUT

⁠See what's inside the beast
docker run -it --entrypoint='bash' jrottenberg/ffmpeg

for i in ogg amr vorbis theora mp3lame opus vpx xvid fdk x264 x265;do echo $i; find /usr/local/ -name *$i*;done

⁠Keep up to date

See Dockerfile-env to update a version

⁠Contribute

# Add / fix stuff
${EDITOR} templates/

# Generates the Dockerfile for all variants
./update.py

# Test a specific variant
docker build -t my-build docker-images/VERSION/

# Make sure all variants pass before CI
find ffmpeg/ -name Dockerfile | xargs dirname | parallel --no-notice -j 4 --results logs docker build -t {} {}

Commit the templates files THEN all the generated Dockerfile for a merge request. So it's easier to review the template change.

Tag summary

Content type

Image

Digest

Size

72.2 MB

Last updated

over 6 years ago

docker pull spion06/ffmpeg