#!/bin/sh #------------------------------------------------------------------------------ # ========= | # \\ / F ield | OpenFOAM: The Open Source CFD Toolbox # \\ / O peration | # \\ / A nd | www.openfoam.com # \\/ M anipulation | #------------------------------------------------------------------------------ # Copyright (C) 2015-2016 OpenFOAM Foundation # Copyright (C) 2018-2020 OpenCFD Ltd. #------------------------------------------------------------------------------ # License # This file is part of OpenFOAM. # # OpenFOAM is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # OpenFOAM is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License # for more details. # # You should have received a copy of the GNU General Public License # along with OpenFOAM. If not, see . # # Script # foamCreateVideo # # Description # Creates a video file from PNG images # - requires one of avconv, ffmpeg, mencoder # #------------------------------------------------------------------------------ # Input defaults inputDir='.' prefix='image.' inputMask='%04d' # (avconv only) unset startNumber # (avconv only) # Output defaults outputPrefix=video outputFormat=mp4 frameRate=10 unset converter #------------------------------------------------------------------------------ printHelp () { cat< input directory with png images (default: '.') -f | -fps frames per second (default: 10) -i | -image input image sequence prefix (default: 'image.') -o | -out output video name (default: 'video') -tool=NAME Specify avconv, ffmpeg, mencoder... -mask avconv input mask width (default: 4) -start avconv start frame number -webm WebM output video file format (avconv only) -h | -help Print the usage Creates a video file from a sequence of PNG images. With the default prefix ('image.'), from image.0000.png, image.0001.png, ... - The output format is MPEG4 - The output name (with mp4 format), is "video.mp4" - By default the video codec is high resolution MPEG4 output requires avconv, mencoder, ffmpeg, ... WebM output requires avconv. By default will attempt avconv, ffmpeg, mencoder. Use the -tool option to specify a particular converter. USAGE exit 0 # A clean exit } # Report error and exit die() { exec 1>&2 echo echo "Error encountered:" while [ "$#" -ge 1 ]; do echo " $1"; shift; done echo echo "See '${0##*/} -help' for usage" echo exit 1 } #------------------------------------------------------------------------------- # Parse options while [ "$#" -gt 0 ] do case "$1" in -h | -help*) printHelp ;; -d | -dir) [ "$#" -ge 2 ] || die "'-dir' requires an argument" inputDir=$2 shift ;; -f | -fps) [ "$#" -ge 2 ] || die "'-fps' requires an argument" frameRate=$2 shift ;; -i | -image) [ "$#" -ge 2 ] || die "'-image' requires an argument" prefix=$2 shift ;; -o | -out) [ "$#" -ge 2 ] || die "'-out' requires an argument" outputPrefix=$2 shift ;; -mask) [ "$#" -ge 2 ] || die "'-mask' requires an argument" digits="$(( $2 + 0 ))" if [ "$digits" -gt 0 ] then inputMask="%0${digits}d" echo "using input mask $inputMask" else echo "input mask unchanged $inputMask" fi shift ;; -start) [ "$#" -ge 2 ] || die "'-start' requires an argument" startNumber="-start_number $2" shift ;; -webm) outputFormat=webm ;; -tool=*) converter="${1#*=}" [ -n "$converter" ] || die "Missing value for -tool= option" ;; -*) die "invalid option '$1'" ;; *) break ;; esac shift done #------------------------------------------------------------------------------ # Sanity checks if [ "$outputFormat" = webm ] then command -v avconv >/dev/null || \ die "webm format requires avconv, which was not found." elif [ -z "$converter" ] then # No converter specified, go on discovery... for candiate in avconv mencoder ffmpeg do if command -v "$candiate" >/dev/null then converter="$candiate" break fi done [ -n "$converter" ] || \ die "No suitable converter found (avconv, ffmpeg, mencoder)" \ "Cannot create video." else command -v "$converter" >/dev/null || \ die "No converter found: '$converter'" fi #------------------------------------------------------------------------------ # Check if input files exist nFiles="$(\ls $inputDir/$prefix*.png 2>/dev/null | wc -l)" echo "==============" echo "Output file: $outputPrefix.$outputFormat" echo "Input files: $prefix*.png" echo "Detected: $nFiles files" echo "==============" if [ "$nFiles" = 0 ] then echo "No input files found. Stopping" exit 1 fi #------------------------------------------------------------------------------ # Conversion if [ "$outputFormat" = webm ] then echo "Creating video with avconv..." echo avconv \ -framerate $frameRate $startNumber \ -i "$inputDir/$prefix$inputMask.png" \ -c:v libvpx -crf 15 -b:v 1M \ "$outputPrefix.$outputFormat" else # Dispatch case "$converter" in (avconv | */avconv) echo "Creating video with avconv ..." echo "$converter" \ -framerate $frameRate $startNumber \ -i "$inputDir/$prefix$inputMask.png" \ -c:v libx264 -pix_fmt yuv420p \ "$outputPrefix.$outputFormat" ;; (ffmpeg | */ffmpeg) echo "Creating video with ffmpeg ..." echo "$converter" \ -r $frameRate \ -i "$inputDir/$prefix$inputMask.png" \ -vcodec libx264 -pix_fmt yuv420p \ "$outputPrefix.$outputFormat" ;; (mencoder | */mencoder) echo "Creating video with mencoder ..." echo "$converter" \ "mf://$inputDir/$prefix*.png" \ -mf fps=$frameRate \ -o "$outputPrefix.$outputFormat" \ -ovc x264 ;; (*) die "Unknown converter: '$converter'" ;; esac fi #------------------------------------------------------------------------------