#!/bin/bash version="0.0.5" picsFolder='' audioFile='' outputName='' outputFolder='' allowCacheStay=0 allowOrigin=0 frameRate='30' tempFolder=/tmp/4dage-ffmpeg time=$(date "+%Y%m%d-%H%M%S") tempFilePrefix="4dage-source-${time}" declare -a outputVideoList=('mp4 flv') red=$(tput setaf 1) green=$(tput setaf 2) reset=$(tput sgr0) command_exists() { if ! [[ -x $(command -v "$1") ]]; then return 1 fi return 0 } print_usage() { echo -e "\033[43;34m $package - 4dage-ffmpeg-img2video custom version for ffmpeg: \033[0m" echo "${green}If have problem with this, please contact with gemer AKA: 张宇鹏" echo "$package [options] application [arguments]" echo " " echo "${red}options:" echo "-h, --help show brief help" echo "-p, --source=pic file folder path input the picture source path" echo "-a, --audio=audio file path audio file path" echo "-n, --name=output file name output file name" echo "-o, --output=DIR specify a directory to store output in" echo "--allow-origin, allow maintain origin video output" echo "-rate, aka: 23/23.8/24/25/30/50/60 specify output video framerate" echo "-v, --version output verison" echo " " echo -e "\033[0;33m" cat <_/___.' >' "". | | : '- \'.;'\ _ /';.'/ - ' : | | \ \ '_. \_ __\ /__ _/ .-' / / ====='-.____'.___ \_____/___.-'____.-'===== '=---=' ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 佛祖保佑 TTT 万无一失 EOF echo -e "\033[m" } make_temp_dir() { # # Make a temp folder if [ ! -d $tempFolder ]; then mkdir -p $tempFolder && chmod 776 $tempFolder fi } make_temp_dir while test $# -gt 0; do case "$1" in -h | --help) print_usage exit 0 ;; -p) shift if test $# -gt 0; then export picsFolder=$1 else echo "{$red}no video path specified" exit 1 fi shift ;; --pic*) export picsFolder=$(echo $1 | sed -e 's/^[^=]*=//g') echo $1 shift ;; -a) shift if test $# -gt 0; then export audioFile=$1 else echo "{$red}no rectangle format specified" exit 1 fi shift ;; -rate) shift export frameRate=$1 shift ;; --allow-origin) export allowOrigin=1 shift ;; --audio*) export audioFile=$(echo $1 | sed -e 's/^[^=]*=//g') shift ;; -o) shift if test $# -gt 0; then export outputFolder=$1 else echo "{$red}no output dir folder specified" exit 1 fi shift ;; --output*) export outputFolder=$(echo $1 | sed -e 's/^[^=]*=//g') shift ;; -n) shift if test $# -gt 0; then export outputName=$1 else echo "no output video name specified" exit 1 fi shift ;; --name*) export outputName=$(echo $1 | sed -e 's/^[^=]*=//g') shift ;; --cache) shift echo "allow cahche remain" export allowCacheStay=1 shift ;; -v) echo "$version" shift ;; *) print_usage # echo "111" break ;; esac done mkVerison() { touch "$outputFolder/4dage-ffmpeg-img2video-$version.version" } takeVideoCap() { FFREPORT=file="$outputFolder/$outputName.cap.txt":level=48 ffmpeg -hide_banner -loglevel error -y -i "$outputFolder/$outputName.mp4" -r 1 -ss 00:00:01 -vframes 1 -vf "transpose=1,scale=iw/5:ih/5,setsar=1:1" -f image2 "$outputFolder/$outputName.jpg" } covertVideoTask() { picsFolderType=${picsFolder##*.} allImages="$picsFolder/%06d.jpg" # -i $audioFile -filter_complex "[0:v]scale=1920:-1[vid];[vid]split=2[out1][out2]" \ echo "frameRate: $frameRate" FFREPORT=file="$outputFolder/$outputName.txt":level=48 ffmpeg -vsync 0 -framerate $frameRate -hide_banner -y -i $allImages \ -preset superfast -threads 2 -pix_fmt yuv420p -c:v libx264 "$outputFolder/$outputName.origin.mp4" FFREPORT=file="$outputFolder/$outputName.txt":level=48 ffmpeg -hide_banner -y -i "$outputFolder/$outputName.origin.mp4" \ -i $audioFile -filter_complex "[0:v]scale=1920:-1[vid];[vid]split=2[out1][out2]" \ -threads 2 -b 1.8M -minrate 1.8M -maxrate 1.8M -bufsize 2M \ -map '[out1]' -map 1:a? -strict -2 -shortest -profile:v high -vcodec libx264 -c:a copy -ab 128k "$outputFolder/$outputName.mp4" \ -map '[out2]' -map 1:a? -strict -2 -shortest -profile:v high -vcodec libx264 -c:a copy -ab 128k "$outputFolder/$outputName.flv" if test $allowOrigin -eq 0; then rm "$outputFolder/$outputName.origin.mp4" fi takeVideoCap mkVerison } clearDist() { rm -f $outputFolder/*.json rm -f $outputFolder/*.version } concatAllLogFile() { cat $outputFolder/*.txt >>"$outputFolder/$outputName.full.log" rm $outputFolder/*.txt } if [ ! -z $picsFolder ] && [ ! -z $audioFile ] && [ ! -z $outputName ] && [ ! -z $outputFolder ]; then if [ ! -d $outputFolder ]; then mkdir -p $outputFolder else clearDist fi echo "frameRate:$frameRate" covertVideoTask concatAllLogFile if command_exists "mediainfo"; then mediainfo --fullscan "$outputFolder/$outputName.mp4" --Output=JSON >"$outputFolder/$outputName.json" mediainfo --fullscan "$outputFolder/$outputName.flv" --Output=JSON >"$outputFolder/$outputName.flv.json" fi echo -e "\033[0;32m" cat <_/___.' >' "". | | : '- \'.;'\ _ /';.'/ - ' : | | \ \ '_. \_ __\ /__ _/ .-' / / ====='-.____'.___ \_____/___.-'____.-'===== '=---=' ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 佛祖保佑 TTT 顺利转换 EOF echo -e "\033[m" echo "covert done!" else if [ ! -n "$1" ]; then print_usage else if [ -z $picsFolder ]; then echo "${red}miss pics file folder path: 缺图像文件路径" fi if [ -z $audioFile ]; then echo "${red}miss rect spec : 缺少rect的技术参数" fi if [ -z $outputName ]; then echo "${red}miss file name : 缺少输出文件名称" fi if [ -z $outputFolder ]; then echo "${red}miss output path : 缺少输出路径" fi fi fi