184 lines
5.8 KiB
Bash
Executable File
184 lines
5.8 KiB
Bash
Executable File
#!/bin/bash
|
|
set -e
|
|
|
|
usage(){
|
|
printf "Usage:
|
|
-i <file>\tInfo
|
|
-av <file>\tChange Audio and Video Codec
|
|
-v <file>\tChange Video Codec
|
|
-a <file>\tChange Audio Codec
|
|
-s <file>\tRemove Subtitles
|
|
-rm <file>\tRemove First Audio
|
|
-subs <file>\tEmbed subtitles
|
|
-dir_down\tDownsize all files in dir to 1920x1080
|
|
-find\tFind files from file and resize
|
|
-d <file>\tDownsize input video
|
|
-filter <file> filter video file\n"
|
|
}
|
|
if [ $# -lt 2 ]; then
|
|
echo "Too few arguments <file> <part of filename to remove>"
|
|
else
|
|
if [ -d "$2" ] || [ ]; then
|
|
echo "Argument is directory"
|
|
input_dir=$2
|
|
elif [ -f "$2" ]; then
|
|
echo "Argument is file"
|
|
input=$2
|
|
else
|
|
echo "Argument $2 doesnt exist"
|
|
exit
|
|
fi
|
|
if [ "$1" == "-av" ]; then
|
|
ffmpeg -i "$input" -vcodec mpeg4 -acodec mp3 -preset veryslow -qp 0 "_$input"
|
|
elif [ "$1" == "-s" ]; then
|
|
ffmpeg -i "$input" -sn -c copy "_$input"
|
|
elif [ "$1" == "-a" ]; then
|
|
ffmpeg -i "$input" -vcodec copy -acodec mp3 -preset veryslow -qp 0 "_$input"
|
|
elif [ "$1" == "-v" ]; then
|
|
ffmpeg -i "$input" -vcodec mpeg4 -preset veryslow -qp 0 -acodec copy "_$input"
|
|
elif [ "$1" == "-rm" ]; then
|
|
ffmpeg -i "$input" -map 0 -map -0:a:0 -c copy -y "_$input";
|
|
# mv "_$file" "$file";
|
|
echo $input
|
|
elif [ "$1" == "-i" ]; then
|
|
ffmpeg -i "$input"
|
|
elif [ "$1" == "-d" ]; then
|
|
ffmpeg -i "$input" -c:v libx264 -crf 27 "${input%%.*}_downsize.${input##*.}"
|
|
elif [ "$1" == "-subs" ]; then
|
|
#for file in *${input}; do ls "subs/$(echo $file | rev | cut -f2- -d'.' | rev).srt" ; done
|
|
for file in *${input}; do
|
|
ls "$(echo $file | rev | cut -f2- -d'.' | rev).srt"
|
|
ffmpeg -i "$file" -f srt -i "$(echo $file | rev | cut -f2- -d'.' | rev).srt" -c copy -c:s mov_text "_$file"
|
|
mv "_$file" "$file"
|
|
done
|
|
elif [ "$1" == "-frame" ]; then
|
|
ffmpeg -ss 00:00:05.01 -i myvideo.avi -frames:v 1 myimage.jpg
|
|
elif [ "$1" == "-cut" ]; then
|
|
ffmpeg -ss 00:00:02 -i GMT20210112-071517_Vorlesung-_1920x1220.mp4 -to 01:28:49 -c copy output.mp4
|
|
elif [ "$1" == "-dir-down" ]; then
|
|
echo "Resize all files in ${input_dir}"
|
|
if [ ! -d "${input_dir}/comp" ];then
|
|
mkdir "${input_dir}/comp"
|
|
fi
|
|
for file in ${input_dir}/*; do
|
|
if [ -f "${file}" ]; then
|
|
#echo ${file%.*} ${file##*.} ${file##*/}
|
|
ffmpeg -i "${file}" -vf scale=1920x1080 "${input_dir}/comp/${file##*/}" 2>/dev/null 1>&2
|
|
fi
|
|
done
|
|
elif [ "$1" == "-find" ]; then
|
|
echo "Find files in ${input_dir}"
|
|
if [ ! -d "${input_dir}/comp" ];then
|
|
mkdir ${input_dir}/comp
|
|
fi
|
|
while read -r line; do
|
|
file=$(find . -name "$line")
|
|
if [ -f "${file}" ]; then
|
|
#echo ${file%.*}
|
|
#echo ${file%/*}
|
|
#echo ${file##*.}
|
|
|
|
ffmpeg -i "${file}" -vf scale=1920x1080 "${input_dir}/comp/${file##*/}"
|
|
fi
|
|
done<$3
|
|
echo "Converted all files in ${input_dir}"
|
|
elif [ "$1" == "-file2mp3" ]; then
|
|
codec=$3
|
|
find "${input_dir}" -name "*$codec" -print0 | while read -d $'\0' file; do
|
|
#echo $file
|
|
echo ${file%.*}
|
|
|
|
#ffmpeg -i "$file" -sample_fmt s16 -ar 48000 "${file%.*}_.flac"< /dev/null
|
|
#mv "${file%.*}_.flac" "$file"
|
|
ffmpeg -i "$file" -vn -ar 44100 -ac 2 -b:a 192k "${file%.*}.mp3"< /dev/null
|
|
#ffmpeg -i "$file" -ab 320k -map_metadata 0 -id3v2_version 3 "${file%.*}.mp3"< /dev/null
|
|
done
|
|
elif [ "$1" == "-filter" ]; then
|
|
#!/usr/bin/env bash
|
|
|
|
|
|
|
|
file="$2"
|
|
selected_stream="$3"
|
|
file_new="${file%.*}_processed.${file##*.}"
|
|
|
|
if [[ -z "$file" ]]; then
|
|
echo "Usage: $0 input_file [audio_stream_index]"
|
|
exit 1
|
|
fi
|
|
# Get list of audio streams
|
|
mapfile -t streams < <(
|
|
ffprobe -v error -select_streams a \
|
|
-show_entries stream=index:stream_tags=language \
|
|
-of json "$file" |
|
|
jq -r '.streams[] | "\(.index),\(.tags.language // "unknown")"'
|
|
)
|
|
|
|
stream_count=${#streams[@]}
|
|
|
|
if [[ "$stream_count" -eq 0 ]]; then
|
|
echo "No audio streams found."
|
|
exit 1
|
|
fi
|
|
|
|
echo "Found $stream_count audio stream(s)."
|
|
|
|
# If not provided, prompt when multiple exist
|
|
if [[ -z "$selected_stream" ]]; then
|
|
if [[ "$stream_count" -eq 1 ]]; then
|
|
selected_stream="${streams[0]%,*}"
|
|
echo "Using only audio stream: $selected_stream"
|
|
else
|
|
echo "Available audio streams:"
|
|
i=0
|
|
for s in "${streams[@]}"; do
|
|
idx="${s%,*}"
|
|
lang="${s#*,}"
|
|
echo "[$i] stream_index=$idx language=${lang:-unknown}"
|
|
((i++))
|
|
done
|
|
|
|
read -rp "Select audio stream index (ffmpeg stream index): " selected_stream
|
|
fi
|
|
fi
|
|
|
|
echo "Processing audio stream: $selected_stream"
|
|
|
|
ffmpeg -i "$file" \
|
|
-map 0:v -c:v copy \
|
|
-map 0:a:"$selected_stream" \
|
|
-filter_complex "[0:a]highpass=f=100,\
|
|
acompressor=threshold=-22dB:ratio=4:attack=10:release=150,\
|
|
equalizer=f=2500:t=q:w=1:g=5,\
|
|
equalizer=f=4000:t=q:w=1:g=4,\
|
|
deesser=i=0.4:f=0.25,\
|
|
alimiter=limit=0.95,\
|
|
dynaudnorm=f=200:g=15[a]" \
|
|
-map "[a]" -c:a libvorbis \
|
|
"$file_new"
|
|
|
|
echo "Done: $file_new"
|
|
else
|
|
usage
|
|
exit
|
|
fi
|
|
fi
|
|
#Uncompatible Videocodecs:
|
|
# mpeg4 (DX50 / 0x30355844)
|
|
#h264 (High) (avc1 / 0x31637661)
|
|
#Uncompatible AUdiocodecs:
|
|
|
|
#Multiple Audiolines
|
|
|
|
#Subtitles
|
|
# ffmpeg -i $input -sn -vcodec copy -acodec copy
|
|
#Keep Audio/Video Settings
|
|
# ffmpeg -i $input -acodec copy -vcodec copy
|
|
#delete audio trach 0:1
|
|
#for file in *avi ; do ffmpeg -i "$file" -map 0:0 -map 0:2 -acodec copy -vcodec copy "New_$file"; mv "New_$file" "$file"; done
|
|
#ffmpeg -ss 00:00:00 -i Stargate.mp4 -to 02:09:39 -c copy output.mp4
|
|
# Embed Subtitles
|
|
#for file in Subs/.*srt; do ffmpeg -i "$file" "$(echo $file | sed 's/srt/ass/g')"; done
|
|
#for file in *avi; do ffmpeg -i "$file" -vf ass="Subs/$(echo $file | sed 's/avi/ass/g' | sed 's/S01E/s01e/g')" "New1_$file" ;done
|
|
|