Skip to content

Instantly share code, notes, and snippets.

@drouarb
Last active October 5, 2022 03:21
Show Gist options
  • Save drouarb/fb082c521d46aa43fdbb8cdc3d61ffbc to your computer and use it in GitHub Desktop.
Save drouarb/fb082c521d46aa43fdbb8cdc3d61ffbc to your computer and use it in GitHub Desktop.
Disable HWACCELS + new paths
#Install deps
apt install libgcrypt-dev libgpg-error-dev gnutls-dev libass-dev libopus-dev librtmp-dev libvorbis-dev libzvbi-dev libx264-dev yasm
#Download source
http://files.plexapp.com/sources/ffmpeg-2017-08.txz
#Extract & Configure
./configure --prefix=/root/build/ffmpeg/build/ --disable-bzlib --disable-ffplay --disable-ffserver --disable-ffprobe --disable-avdevice --disable-schannel --disable-vda --disable-doc --pkg-config-flags=--static --enable-muxers --enable-gpl --enable-version3 --enable-gnutls --disable-hwaccels --enable-libass --enable-librtmp --disable-devices --disable-lzma --disable-iconv --disable-protocol=concat --enable-libvorbis --enable-libopus --external-decoder=h264 --disable-bsfs --enable-bsf='aac_adtstoasc,extract_extradata,dca_core,h264_mp4toannexb,hevc_mp4toannexb,vp9_superframe,vp9_superframe_split,framedrop' --enable-decoder=png --enable-decoder=apng --enable-decoder=bmp --enable-decoder=mjpeg --enable-decoder=thp --enable-decoder=gif --enable-decoder=dirac --enable-decoder=ffv1 --enable-decoder=ffvhuff --enable-decoder=huffyuv --enable-decoder=rawvideo --enable-decoder=zero12v --enable-decoder=ayuv --enable-decoder=r210 --enable-decoder=v210 --enable-decoder=v210x --enable-decoder=v308 --enable-decoder=v408 --enable-decoder=v410 --enable-decoder=y41p --enable-decoder=yuv4 --enable-decoder=ansi --enable-decoder=alac --enable-decoder=flac --enable-decoder=vorbis --enable-decoder=opus --enable-decoder=pcm_f32be --enable-decoder=pcm_f32le --enable-decoder=pcm_f64be --enable-decoder=pcm_f64le --enable-decoder=pcm_lxf --enable-decoder=pcm_s16be --enable-decoder=pcm_s16be_planar --enable-decoder=pcm_s16le --enable-decoder=pcm_s16le_planar --enable-decoder=pcm_s24be --enable-decoder=pcm_s24le --enable-decoder=pcm_s24le_planar --enable-decoder=pcm_s32be --enable-decoder=pcm_s32le --enable-decoder=pcm_s32le_planar --enable-decoder=pcm_s8 --enable-decoder=pcm_s8_planar --enable-decoder=pcm_u16be --enable-decoder=pcm_u16le --enable-decoder=pcm_u24be --enable-decoder=pcm_u24le --enable-decoder=pcm_u32be --enable-decoder=pcm_u32le --enable-decoder=pcm_u8 --enable-decoder=pcm_alaw --enable-decoder=pcm_mulaw --enable-decoder=ass --enable-decoder=dvbsub --enable-decoder=dvdsub --enable-decoder=ccaption --enable-decoder=pgssub --enable-decoder=jacosub --enable-decoder=microdvd --enable-decoder=movtext --enable-decoder=mpl2 --enable-decoder=pjs --enable-decoder=realtext --enable-decoder=sami --enable-decoder=ssa --enable-decoder=stl --enable-decoder=subrip --enable-decoder=subviewer --enable-decoder=text --enable-decoder=vplayer --enable-decoder=webvtt --enable-decoder=xsub --enable-decoder=libzvbi_teletext --enable-decoder=eac3_eae --enable-decoder=truehd_eae --enable-decoder=mlp_eae --enable-encoder=flac --enable-encoder=alac --enable-encoder=libvorbis --enable-encoder=libopus --enable-encoder=mjpeg --enable-encoder=wrapped_avframe --enable-encoder=ass --enable-encoder=dvbsub --enable-encoder=dvdsub --enable-encoder=movtext --enable-encoder=ssa --enable-encoder=subrip --enable-encoder=text --enable-encoder=webvtt --enable-encoder=xsub --enable-encoder=pcm_f32be --enable-encoder=pcm_f32le --enable-encoder=pcm_f64be --enable-encoder=pcm_f64le --enable-encoder=pcm_s8 --enable-encoder=pcm_s8_planar --enable-encoder=pcm_s16be --enable-encoder=pcm_s16be_planar --enable-encoder=pcm_s16le --enable-encoder=pcm_s16le_planar --enable-encoder=pcm_s24be --enable-encoder=pcm_s24le --enable-encoder=pcm_s24le_planar --enable-encoder=pcm_s32be --enable-encoder=pcm_s32le --enable-encoder=pcm_s32le_planar --enable-encoder=pcm_u8 --enable-encoder=pcm_u16be --enable-encoder=pcm_u16le --enable-encoder=pcm_u24be --enable-encoder=pcm_u24le --enable-encoder=pcm_u32be --enable-encoder=pcm_u32le --enable-encoder=eac3_eae --enable-libzvbi --extra-libs='-lgcrypt -lgpg-error -ldl' --enable-pic --external-decoder=aac --external-encoder=aac --external-decoder=ac3 --external-encoder=ac3 --external-decoder=dca --external-decoder=flv --external-decoder=hevc --external-encoder=libx264 --external-decoder=mp2 --external-decoder=mp3 --external-decoder=mpeg2video --external-decoder=mpeg4 --external-decoder=msmpeg4v3 --external-decoder=rv40 --external-decoder=vc1 --external-decoder=wmav2 --external-decoder=wmv2 --enable-libx264 --enable-shared --disable-hwaccels
#Compile
make -j 8
#Cp
cp `find -name '*.so*' | grep -P '(encoder|decoder)'` /root/unicorn/UnicornTranscoder/Codecs
cp `find -name '*.so*' | grep -Pv '(encoder|decoder)'` /root/unicorn/UnicornTranscoder/Resources
cp `find -name 'ffmpeg'` /root/unicorn/UnicornTranscoder/Resources/Plex\ Transcoder
@colemickens
Copy link

Out of curiosity, why bother with Plex's instead of using upstream ffmpeg? Is there something valuable in it?

@drouarb
Copy link
Author

drouarb commented Jun 30, 2018

Plex uses a modified version of FFMPEG, it includes a callback URL to notify Plex of the progression of the conversion and the speed of it. It also includes a codec for EasyAudioEncoder which is a software allowing them to transcode proprietary audio codecs. Plex distributes only a version compiled for ARMv7 and amd64, I wanted to try to compile it for ARMv8 but the implementation of libx264 for ARM is really poor so the transcode is slow.

@scaronni
Copy link

This is the last version that appears in the license file of my Plex Media Server package (Plexpass account version):

$ cat usr/lib/plexmediaserver/Resources/LICENSE | grep -i ffmpeg
Plex Transcoder contains code from ffmpeg: http://downloads.plex.tv/ffmpeg-source/ffmpeg-2018-03-22.tar.gz
Plex Media Scanner and Plex Media Server contain code from ffmpeg: http://downloads.plex.tv/ffmpeg-source/ffmpeg-2018-03-22.tar.gz

@scaronni
Copy link

Probably it's too old and the LICENSE file is not updated, as this is the version I have installed locally:

$ LD_LIBRARY_PATH=. ./Plex\ Transcoder -version
ffmpeg version git-2018-06-20-e944d3a Copyright (c) 2000-2018 the FFmpeg developers
built with gcc 4.8.2 (GCC)
configuration: --libdir=/data/jenkins/pms-deps-universal-v2/BUILD_TAG/linux-ubuntu-x86_64/output/pms-depends-linux-ubuntu-x86_64-release-ec83f26/lib --prefix=/data/jenkins/pms-deps-universal-v2/BUILD_TAG/linux-ubuntu-x86_64/output/pms-depends-linux-ubuntu-x86_64-release-ec83f26 --disable-bzlib --disable-ffplay --disable-ffprobe --disable-avdevice --disable-schannel --disable-linux-perf --disable-mediacodec --disable-debug --disable-doc --disable-shared --pkg-config-flags=--static --enable-muxers --enable-gpl --enable-version3 --enable-gnutls --enable-eae --disable-encoders --disable-decoders --disable-hwaccels --enable-libass --enable-librtmp --disable-devices --disable-lzma --disable-iconv --disable-protocol=concat --enable-libvorbis --enable-libopus --external-decoder=h264 --disable-bsfs --enable-bsf='aac_adtstoasc,extract_extradata,dca_core,h264_mp4toannexb,hevc_mp4toannexb,vp9_superframe,vp9_superframe_split,framedrop' --enable-decoder=png --enable-decoder=apng --enable-decoder=bmp --enable-decoder=mjpeg --enable-decoder=thp --enable-decoder=gif --enable-decoder=dirac --enable-decoder=ffv1 --enable-decoder=ffvhuff --enable-decoder=huffyuv --enable-decoder=rawvideo --enable-decoder=zero12v --enable-decoder=ayuv --enable-decoder=r210 --enable-decoder=v210 --enable-decoder=v210x --enable-decoder=v308 --enable-decoder=v408 --enable-decoder=v410 --enable-decoder=y41p --enable-decoder=yuv4 --enable-decoder=ansi --enable-decoder=alac --enable-decoder=flac --enable-decoder=vorbis --enable-decoder=opus --enable-decoder=pcm_f32be --enable-decoder=pcm_f32le --enable-decoder=pcm_f64be --enable-decoder=pcm_f64le --enable-decoder=pcm_lxf --enable-decoder=pcm_s16be --enable-decoder=pcm_s16be_planar --enable-decoder=pcm_s16le --enable-decoder=pcm_s16le_planar --enable-decoder=pcm_s24be --enable-decoder=pcm_s24le --enable-decoder=pcm_s24le_planar --enable-decoder=pcm_s32be --enable-decoder=pcm_s32le --enable-decoder=pcm_s32le_planar --enable-decoder=pcm_s8 --enable-decoder=pcm_s8_planar --enable-decoder=pcm_u16be --enable-decoder=pcm_u16le --enable-decoder=pcm_u24be --enable-decoder=pcm_u24le --enable-decoder=pcm_u32be --enable-decoder=pcm_u32le --enable-decoder=pcm_u8 --enable-decoder=pcm_alaw --enable-decoder=pcm_mulaw --enable-decoder=ass --enable-decoder=dvbsub --enable-decoder=dvdsub --enable-decoder=ccaption --enable-decoder=pgssub --enable-decoder=jacosub --enable-decoder=microdvd --enable-decoder=movtext --enable-decoder=mpl2 --enable-decoder=pjs --enable-decoder=realtext --enable-decoder=sami --enable-decoder=ssa --enable-decoder=stl --enable-decoder=subrip --enable-decoder=subviewer --enable-decoder=text --enable-decoder=vplayer --enable-decoder=webvtt --enable-decoder=xsub --enable-decoder=libzvbi_teletext --enable-decoder=eac3_eae --enable-decoder=truehd_eae --enable-decoder=mlp_eae --enable-encoder=flac --enable-encoder=alac --enable-encoder=libvorbis --enable-encoder=libopus --enable-encoder=mjpeg --enable-encoder=wrapped_avframe --enable-encoder=ass --enable-encoder=dvbsub --enable-encoder=dvdsub --enable-encoder=movtext --enable-encoder=ssa --enable-encoder=subrip --enable-encoder=text --enable-encoder=webvtt --enable-encoder=xsub --enable-encoder=pcm_f32be --enable-encoder=pcm_f32le --enable-encoder=pcm_f64be --enable-encoder=pcm_f64le --enable-encoder=pcm_s8 --enable-encoder=pcm_s8_planar --enable-encoder=pcm_s16be --enable-encoder=pcm_s16be_planar --enable-encoder=pcm_s16le --enable-encoder=pcm_s16le_planar --enable-encoder=pcm_s24be --enable-encoder=pcm_s24le --enable-encoder=pcm_s24le_planar --enable-encoder=pcm_s32be --enable-encoder=pcm_s32le --enable-encoder=pcm_s32le_planar --enable-encoder=pcm_u8 --enable-encoder=pcm_u16be --enable-encoder=pcm_u16le --enable-encoder=pcm_u24be --enable-encoder=pcm_u24le --enable-encoder=pcm_u32be --enable-encoder=pcm_u32le --enable-encoder=h264_vaapi --enable-encoder=hevc_vaapi --enable-encoder=h264_nvenc --enable-encoder=eac3_eae --arch=x86_64 --enable-libzvbi --cc='ccache gcc' --extra-ldflags=-L/data/jenkins/pms-deps-universal-v2/BUILD_TAG/linux-ubuntu-x86_64/output/pms-depends-linux-ubuntu-x86_64-release-ec83f26/lib --extra-libs='-lgcrypt -lgpg-error -ldl'
libavutil      56.  7.101 / 56.  7.101
libavcodec     58. 12.102 / 58. 12.102
libavformat    58.  9.100 / 58.  9.100
libavfilter     7. 12.100 /  7. 12.100
libswscale      5.  0.101 /  5.  0.101
libswresample   3.  0.101 /  3.  0.101
libpostproc    55.  0.100 / 55.  0.100

It's a master branch snapshot post 4.0.1 release.

@scaronni
Copy link

Also, these are the only options I can't find in an upstream 4.0.1 configure script:

--enable-bsf='framedrop'
--enable-decoder=eac3_eae
--enable-decoder=mlp_eae
--enable-decoder=truehd_eae
--enable-eae
--enable-encoder=eac3_eae
--enable-muxers
--external-decoder=h264

@Maxou44
Copy link

Maxou44 commented Nov 7, 2018

@drouarb
Copy link
Author

drouarb commented Feb 23, 2019

Here is a way to get the list of external decoders https://gist.github.com/drouarb/9e84ebd0937ca9a026c1a587ca79dc42

@g-vdn
Copy link

g-vdn commented Jan 27, 2021

Followed your solution to build the plex transcoder for a rpi4, but got stuck on making.

For anyone who follows this and gets the error when compiling:

"collect2: error: ld returned 1 exit status
ERROR: gnutls not found using pkg-config"

You need to also install libunistring-dev . For me worked and compiled successfully, but got hundred of errors like bellow. Any idea? Running Raspbian OS on rpi4. TIA

gcc: error: intrax8.o: No such file or directory
gcc: error: intrax8dsp.o: No such file or directory
gcc: error: msmpeg4data.o: No such file or directory
gcc: error: arm/vc1dsp_init_neon.o: No such file or directory
gcc: error: arm/vc1dsp_neon.o: No such file or directory
gcc: error: vc1dsp.o: No such file or directory
gcc: error: arm/vc1dsp_init_arm.o: No such file or directory
gcc: error: intrax8.o: No such file or directory
gcc: error: intrax8dsp.o: No such file or directory
gcc: error: msmpeg4data.o: No such file or directory
gcc: error: arm/vc1dsp_init_neon.o: No such file or directory
gcc: error: arm/vc1dsp_neon.o: No such file or directory
gcc: error: vc1dsp.o: No such file or directory
gcc: error: arm/vc1dsp_init_arm.o: No such file or directory

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment