Video Thumb Extractor is a module to extract an image from a video frame from a specific second resizing/cropping it to a given size.
The smallest generated image is 16x16 pixels.
This module is not distributed with the Nginx source. See the installation instructions.
Available on github at nginx-video-thumbextractor-module
This module is considered production ready.
This module depends from some libraries (headers and shared objects) which has to be installed before it:
- avformat >= 57.56.101 (last tested version: 58.12.100) – commonly distributed with FFmpeg
- avcodec >= 57.64.101 (last tested versions: 58.18.100) – commonly distributed with FFmpeg
- avutil >= 55.34.101 (last tested versions: 56.14.100) – commonly distributed with FFmpeg
- avfilter >= 6.65.100 (last tested versions: 7.16.100) – commonly distributed with FFmpeg
- swscale >= 4.2.100 (last tested versions: 5.1.100) – commonly distributed with FFmpeg
- jpeg – libjpeg
When installing FFmpeg (last tested versions: 4.0.6) from source do not forget to enable shared libraries using
--enable-shared
If you don’t install FFmpeg from source you need to be sure that you have headers files for the libs.
This module uses the libraries avcodec and avformat to read the video files. Any supported video format for these libraries will work.
Tested formats was mp4, mov and flv.
Install the above requirements and follow the steps bellow.
# clone the project git clone https://github.com/wandenberg/nginx-video-thumbextractor-module.git NGINX_VIDEO_THUMBEXTRACTOR_MODULE_PATH=$PWD/nginx-video-thumbextractor-module # get desired nginx version (tested with 1.18.x series) wget http://nginx.org/download/nginx-1.18.0.tar.gz # unpack, configure and build tar xzvf nginx-1.18.0.tar.gz cd nginx-1.18.0 # configure nginx ./configure --add-module=$NGINX_VIDEO_THUMBEXTRACTOR_MODULE_PATH make # install and finish sudo make install # check sudo /usr/local/nginx/sbin/nginx -v nginx version: nginx/1.18.0 # test configuration sudo /usr/local/nginx/sbin/nginx -c $NGINX_VIDEO_THUMBEXTRACTOR_MODULE_PATH/nginx.conf -t the configuration file $NGINX_VIDEO_THUMBEXTRACTOR_MODULE_PATH/nginx.conf syntax is ok configuration file $NGINX_VIDEO_THUMBEXTRACTOR_MODULE_PATH/nginx.conf test is successful # run sudo /usr/local/nginx/sbin/nginx -c $NGINX_VIDEO_THUMBEXTRACTOR_MODULE_PATH/nginx.conf
location ~ /thumbs(.*) { video_thumbextractor; video_thumbextractor_video_filename $1; video_thumbextractor_video_second $arg_second; video_thumbextractor_image_width $arg_width; video_thumbextractor_image_height $arg_height; }
Assuming that you have a file called video.mp4 on your root folder use a browser to test the following urls:
# get an image from second 10 with the original size http://localhost/thumbs/video.mp4?second=10 # get an image from second 20 with a 50px of height and proportional width keeping video scale http://localhost/thumbs/video.mp4?second=10&height=50 # get an image from second 30 with a 50px of height and 100px of width, the image will be cropped to keep video scale http://localhost/thumbs/video.mp4?second=20&height=50&width=100
syntax: video_thumbextractor
context: location
release version: 0.1.0
Set Video Thumb Extractor as the request handler for the location.
syntax: video_thumbextractor_video_filename filename
default: none
context: http
release version: 0.1.0
The video filename relative to root folder.
This directive is required.
Return a 404 if the video is not found.
syntax: video_thumbextractor_video_second second
default: none
context: http
release version: 0.1.0
The time in seconds where the image should be extracted. The nearest key frame will be used to get the image.
This directive is required.
Return a 400 if the value is not specified.
Return a 404 if the second is not found (the video is shorter than the time specified).
syntax: video_thumbextractor_image_width width
default: 0
context: http
release version: 0.1.0
The width used to generate the image.
This directive is optional.
If only the width is specified the video size will be used as image size.
syntax: video_thumbextractor_image_height height
default: 0
context: http
release version: 0.1.0
The height used to generate the image.
This directive is optional.
If only the height is specified the width will be determined using video scale to keep the aspect.
If both, width and height, are specified the image will suffers a resize and an eventual crop to keep the aspect.
syntax: video_thumbextractor_only_keyframe on|off
default: on
context: http
release version: 0.3.0
Set if only the keyframes should be used to create the image.
When set to off, the process will be a bit slower because the video will be decoded from the nearest keyframe up to the exact requested time.
syntax: video_thumbextractor_next_time on|off
default: on
context: http
release version: 0.3.0
Set if will use the previous or the next keyframe considering the requested time when configured to use only the keyframes.
syntax: video_thumbextractor_tile_rows number
default: none
context: http
release version: 0.6.0
Set the number of rows to be used on tile filter. The number of cols will be calculated using the sample interval, the video duration and the start time used on ‘video_second’ directive, if not set.
syntax: video_thumbextractor_tile_cols number
default: none
context: http
release version: 0.6.0
Set the number of cols to be used on tile filter. The number of rows will be calculated using the sample interval, the video duration and the start time used on ‘video_second’ directive, if not set.
syntax: video_thumbextractor_tile_max_rows number
default: none
context: http
release version: 0.6.0
Set the max number of rows to be used on tile filter when only the number of cols was set. After calculate the number of necessary rows it can be limited by the configured max number of rows.
syntax: video_thumbextractor_tile_max_cols number
default: none
context: http
release version: 0.6.0
Set the max number of cols to be used on tile filter when only the number of rows was set. After calculate the number of necessary cols it can be limited by the configured max number of cols.
syntax: video_thumbextractor_tile_sample_interval number
default: none
context: http
release version: 0.6.0
Set the sample interval to get the frames for tile. When it was not set and the number of cols and rows were, the sample interval will be calculated to the video can fit on the tile layout.
When only the number of rows or the number of cols was set and sample interval was not, the module will use the default value of 5 seconds.
To the interval be respected you should set video_thumbextractor_only_keyframe directive to off.
syntax: video_thumbextractor_tile_color string
default: none
context: http
release version: 0.6.0
Set the color to be used on the background. Valid values are defined here
syntax: video_thumbextractor_tile_margin number
default: none
context: http
release version: 0.6.0
Set the size of the margin to be used on the final image.
syntax: video_thumbextractor_tile_padding number
default: none
context: http
release version: 0.6.0
Set the size of the padding to be used between the frames.
syntax: video_thumbextractor_threads string
default: auto
context: http
release version: 0.6.0
Set the number of threads used by avcodec.
syntax: video_thumbextractor_processes_per_worker number
default: 1
context: http
release version: 0.7.0
Set the number of process each nginx worker can fork to extract the thumbs. The requests will be queued until there is an available process.
- drop support to versions prior Nginx 1.10.0 and FFmpeg libraries prior to 3.2.4
- add support to use dynamic values on tile configurations
- add support to execute the thumb extraction in a different process to not block the nginx worker
- add video_thumbextractor_processes_per_worker directive
- try to make the code simpler
- revert the changes on 0.6.2
- trying to improve the performance not reading the raw response (the video)
- add support to rotate the image when the video stream has instructions to do it
- add support to videos with different aspect ratio
- fix support to files with more than one video stream choosing the best of them
- add support to tile filter, used to make story boards or sprites
- add directive to control the number of threads used by avcodec
- fix jpeg dpi configuration usage
- remove support to old libav* libraries
- remove MagickWand dependency which cause memory leak
- fix to proper read videos with the moov atom is at the end of the file
- fix to use the nearest decoded frame, in the case of requested time is on the end of the video
- fix CFLAGS, LDFLAGS and ngx_feature_libs to find the parameters to compile using right MagickWand lib version
- using av_frame_alloc instead of avcodec_alloc_frame when available
- fix frame allocation assert
- add configuration to choose between only keyframes or not, and if will use the previous or next frame relative to given time
- make possible read the video from an nginx cache file
- fix use of deprecated functions
- Initial release