nginx-video-thumbextractor-module
nginx-video-thumbextractor-module copied to clipboard
Nginx module to extract thumbs from a video file
h1(#nginx_video_thumbextractor_module). Nginx Video Thumb Extractor Module
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":installation.
Available on github at "nginx-video-thumbextractor-module":repository
h1(#status). Status
This module is considered production ready.
h1(#requirements). Requirements
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":http://ffmpeg.org
- avcodec >= 57.64.101 (last tested versions: 58.18.100) - commonly distributed with "FFmpeg":http://ffmpeg.org
- avutil >= 55.34.101 (last tested versions: 56.14.100) - commonly distributed with "FFmpeg":http://ffmpeg.org
- avfilter >= 6.65.100 (last tested versions: 7.16.100) - commonly distributed with "FFmpeg":http://ffmpeg.org
- swscale >= 4.2.100 (last tested versions: 5.1.100) - commonly distributed with "FFmpeg":http://ffmpeg.org
- jpeg - "libjpeg":http://libjpeg.sourceforge.net
h1(#recommendation). Recommendation
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.
h1(#supported_video_formats). Supported Video Formats
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.
h1(#installation). Installation
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
h1(#basic-configuration). Basic Configuration
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;
}
h1(#basic-usage). Basic Usage
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
h1(#directives). Directives
h2(#video_thumbextractor). video_thumbextractor
syntax: video_thumbextractor
context: location
release version: 0.1.0
Set Video Thumb Extractor as the request handler for the location.
h2(#video_thumbextractor_video_filename). video_thumbextractor_video_filename
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.
h2(#video_thumbextractor_video_second). video_thumbextractor_video_second
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).
h2(#video_thumbextractor_image_width). video_thumbextractor_image_width
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.
h2(#video_thumbextractor_image_height). video_thumbextractor_image_height
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.
h2(#video_thumbextractor_only_keyframe). video_thumbextractor_only_keyframe
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.
h2(#video_thumbextractor_next_time). video_thumbextractor_next_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.
h2(#video_thumbextractor_tile_rows). video_thumbextractor_tile_rows
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.
!test/test_video_1_rows.jpg(using only 1 row)!
h2(#video_thumbextractor_tile_cols). video_thumbextractor_tile_cols
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.
!test/test_video_2_cols.jpg(using 2 cols)!
h2(#video_thumbextractor_tile_max_rows). video_thumbextractor_tile_max_rows
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.
!test/test_video_2_cols_2s_interval_2_max_rows.jpg(using 2 cols limited on up to 2 rows)!
h2(#video_thumbextractor_tile_max_cols). video_thumbextractor_tile_max_cols
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.
!test/test_video_1_rows_2s_interval_5_max_cols.jpg(using only 1 row limited on up to 5 cols)!
h2(#video_thumbextractor_tile_sample_interval). video_thumbextractor_tile_sample_interval
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.
!test/test_video_2_cols_2s_interval.jpg(using 2 cols and 2 seconds of interval)!
!test/test_video_1_rows_2s_interval.jpg(using 1 row and 2 seconds of interval)!
!test/test_video_4_cols_4_rows.jpg(using 4 rows, 4 cols and calculated sample interval)!
!test/test_video_4_cols_4_rows_3s_interval.jpg(using 4 rows, 4 cols and 3 seconds of interval)!
h2(#video_thumbextractor_tile_color). video_thumbextractor_tile_color
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":https://ffmpeg.org/ffmpeg-utils.html#Color
!test/test_video_2_cols_bg_color.jpg(using #EEAA33 as background color)!
h2(#video_thumbextractor_tile_margin). video_thumbextractor_tile_margin
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.
!test/test_video_2_cols_2_rows_5_margin.jpg(using 5px of margin)!
h2(#video_thumbextractor_tile_padding). video_thumbextractor_tile_padding
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.
!test/test_video_2_cols_2_rows_3_padding.jpg(using 3px of padding)!
h2(#video_thumbextractor_threads). video_thumbextractor_threads
syntax: video_thumbextractor_threads string
default: auto
context: http
release version: 0.6.0
Set the number of threads used by avcodec.
h2(#video_thumbextractor_processes_per_worker). video_thumbextractor_processes_per_worker
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.
h1(#contributors). Contributors
"People":contributors
h1(#changelog). Changelog
h2(#0_9_0). v0.9.0
- drop support to versions prior Nginx 1.10.0 and FFmpeg libraries prior to 3.2.4
h2(#0_8_0). v0.8.0
- add support to use dynamic values on tile configurations
h2(#0_7_0). v0.7.0
- 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
h2(#0_6_2). v0.6.2
- trying to improve the performance not reading the raw response (the video)
h2(#0_6_1). v0.6.1
- 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
h2(#0_6_0). v0.6.0
- add support to tile filter, used to make story boards or sprites
- add directive to control the number of threads used by avcodec
h2(#0_5_0). v0.5.0
- fix jpeg dpi configuration usage
- remove support to old libav* libraries
- remove MagickWand dependency which cause memory leak
h2(#0_4_0). v0.4.0
- 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
h2(#0_3_0). v0.3.0
- 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
h2(#0_2_0). v0.2.0
- fix use of deprecated functions
h2(#0_1_0). v0.1.0
- Initial release
[repository]https://github.com/wandenberg/nginx-video-thumbextractor-module [installation]#instalation [contributors]https://github.com/wandenberg/nginx-video-thumbextractor-module/contributors