| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154 | #!/bin/bash# Best settings like in mixcloud.comSETT_PART_COUNT=5SETT_PART_DURATION=5SETT_CROSSFADE=1SETT_FORMAT="mp3"# Get system utilites with full pathUTIL_FFMPEG=`whereis ffmpeg | awk {'print $2'}`UTIL_CUT=`whereis cut | awk {'print $2'}`UTIL_ECHO=`whereis echo | awk {'print $2'}`UTIL_EXPR=`whereis expr | awk {'print $2'}`UTIL_RM=`whereis rm | awk {'print $2'}`UTIL_MV=`whereis mv | awk {'print $2'}`# Get current process IDUNIQ_STR="$$"# Input and output filesINPUT_FILE="$1"OUTPUT_FILE="$2"# Temp dir, RAM disk is the best placeTEMP_DIR="$3"# Set default temp dir if not setif [ "$TEMP_DIR" != "" ]; then	TEMP_DIR=${3%/}	else	TEMP_DIR="/tmp"fi# Check if temp dir is existsif [ ! -d "$TEMP_DIR" ]; then	$UTIL_ECHO " ✗ Temporary directory ($TEMP_DIR) is not available"	exit 1fi# Checks, if all system utilites are presentif [ "$UTIL_FFMPEG" = "" ] || [ "$UTIL_CUT" = "" ] || [ "$UTIL_ECHO" = "" ] || [ "$UTIL_EXPR" = "" ] || [ "$UTIL_RM" = "" ] || [ "$UTIL_MV" = "" ]; then	$UTIL_ECHO " ✗ Some utility, what needed for work is not present in system"	exit 1fi# Check if input file is setif [ "$INPUT_FILE" = "" ]; then	$UTIL_ECHO " ✗ Please set source file name"	exit 1fi# Check if output file is setif [ "$OUTPUT_FILE" = "" ]; then	$UTIL_ECHO " ✗ Please set output file name"	exit 1fi# Check if input file is existif [ ! -f "$INPUT_FILE" ]; then	$UTIL_ECHO " ✗ Source file is not exist"	exit 1fi# Perfomance checkPROC_START=`date +%s`# Extract file lengthINPUT_LEN_STR=`$UTIL_FFMPEG -i $INPUT_FILE 2>&1 | awk '/Duration/ { print substr($2,0,length($2)-1) }' | $UTIL_CUT -d. -f1`if [ "$INPUT_LEN_STR" = "" ]; then	$UTIL_ECHO " ✗ Can't get file duration"	exit 1fi# Convert length to integerINPUT_LEN_HOURS=`$UTIL_ECHO $INPUT_LEN_STR | $UTIL_CUT -d: -f1`INPUT_LEN_MINUTES=`$UTIL_ECHO $INPUT_LEN_STR | $UTIL_CUT -d: -f2`INPUT_LEN_SECONDS=`$UTIL_ECHO $INPUT_LEN_STR | $UTIL_CUT -d: -f3`INPUT_LEN_HOURS=`$UTIL_EXPR $INPUT_LEN_HOURS + 0`INPUT_LEN_MINUTES=`$UTIL_EXPR $INPUT_LEN_MINUTES + 0`INPUT_LEN_SECONDS=`$UTIL_EXPR $INPUT_LEN_SECONDS + 0`# Convert length to secondsINPUT_LENGTH=$((INPUT_LEN_HOURS * 60 * 60))INPUT_LENGTH=$((INPUT_LENGTH + INPUT_LEN_MINUTES * 60))INPUT_LENGTH=$((INPUT_LENGTH + INPUT_LEN_SECONDS))# Some temp varsTMP_STEP=$((INPUT_LENGTH / SETT_PART_COUNT))# Check for minimum lengthINPUT_LEN_MINIMUM=$((SETT_PART_COUNT * SETT_PART_DURATION + SETT_CROSSFADE * SETT_PART_DURATION))if (( INPUT_LENGTH < INPUT_LEN_MINIMUM )); then	$UTIL_ECHO " ✗ File length is too small"	exit 1fi# Some temp varsTMP_LEN=$((SETT_PART_DURATION + SETT_CROSSFADE))TMP_CMD_FILES=""TMP_CMD_FILTERS=""TMP_CMD_CROSSFADE=""TMP_CMD_LAST=""# Split file to parts and generate filtersfor ((i = 1; i <= SETT_PART_COUNT; i++)); do	TMP_S=$((i * TMP_STEP - TMP_STEP))	TMP_E=$((i * TMP_STEP - TMP_STEP))	TMP_E=$((TMP_E + SETT_PART_DURATION + SETT_CROSSFADE))	TMP_CMD="$UTIL_FFMPEG -i $INPUT_FILE -ss $TMP_S -to $TMP_E -c copy -y $TEMP_DIR/$UNIQ_STR_$i.$SETT_FORMAT"	TMP_OUTPUT=`$TMP_CMD 2>&1`	k=$((i - 1))	TMP_CMD_FILES="$TMP_CMD_FILES -i $TEMP_DIR/$UNIQ_STR_$i.$SETT_FORMAT"	TMP_CMD_FILTERS="$TMP_CMD_FILTERS[$k]atrim=0:$TMP_LEN[a$i];"	if (( i >= 2 )); then		if (( i == 2 )); then			TMP_CMD_CROSSFADE="$TMP_CMD_CROSSFADE[a$k][a$i]acrossfade=d=$SETT_CROSSFADE[r$k];"			TMP_CMD_LAST="r$k"		else			r=$((k - 1))			if (( i >= SETT_PART_COUNT )); then				TMP_CMD_CROSSFADE="$TMP_CMD_CROSSFADE[r$r][a$i]acrossfade=d=$SETT_CROSSFADE[r$k]"			else				TMP_CMD_CROSSFADE="$TMP_CMD_CROSSFADE[r$r][a$i]acrossfade=d=$SETT_CROSSFADE[r$k];"			fi			TMP_CMD_LAST="r$k"		fi	fidone$UTIL_ECHO " ✓ Particles created ($SETT_PART_COUNT)"# Connect all parts with crosfade effectTMP_OUTPUT=`$UTIL_FFMPEG $TMP_CMD_FILES -filter_complex "$TMP_CMD_FILTERS$TMP_CMD_CROSSFADE" -map [$TMP_CMD_LAST] -y $OUTPUT_FILE 2>&1`$UTIL_ECHO " ✓ Particles connected together"# Make fade-in at start and fade-out at the endTMP_OUTPUT=`$UTIL_FFMPEG -i $OUTPUT_FILE -af 'afade=t=in:ss=0:d=0.8,afade=t=out:st=25:d=0.8' -y tmp.$OUTPUT_FILE 2>&1`$UTIL_RM $OUTPUT_FILE$UTIL_MV tmp.$OUTPUT_FILE $OUTPUT_FILE$UTIL_ECHO " ✓ FadeIn/FadeOut created"# Delete temp partsfor ((i = 1; i <= SETT_PART_COUNT; i++)); do	$UTIL_RM $TEMP_DIR/$UNIQ_STR_$i.$SETT_FORMATdone# Perfomance checkPROC_END=`date +%s`PROC_ALL=$((PROC_END - PROC_START))$UTIL_ECHO " ✓ Particle files deleted"# Done$UTIL_ECHO " ✓ Done in $PROC_ALL second(s)"exit 0
 |