Files
ffmpeg-builder/lib/ffmpeg.sh
2025-08-30 17:39:18 -05:00

94 lines
1.7 KiB
Bash

#!/usr/bin/env bash
get_duration() {
local file="$1"
ffprobe \
-v error \
-show_entries format=duration \
-of default=noprint_wrappers=1:nokey=1 \
"${file}"
}
get_crop() {
local file="$1"
local duration
duration="$(get_duration "${file}")" || return 1
# don't care about decimal points
IFS='.' read -r duration _ <<<"${duration}"
# get crop value for first half of input
local timeEnc=$((duration / 2))
ffmpeg \
-y \
-hide_banner \
-ss 0 \
-discard 'nokey' \
-i "${file}" \
-t "${timeEnc}" \
-map '0:v:0' \
-filter:v:0 'cropdetect=limit=100:round=16:skip=2:reset_count=0' \
-codec:v 'wrapped_avframe' \
-f 'null' '/dev/null' 2>&1 |
grep -o crop=.* |
sort -bh |
uniq -c |
sort -bh |
tail -n1 |
grep -o "crop=.*"
}
get_stream_codec() {
local file="$1"
local stream="$2"
ffprobe \
-v error \
-select_streams "${stream}" \
-show_entries stream=codec_name \
-of default=noprint_wrappers=1:nokey=1 \
"${file}"
}
get_file_format() {
local file="$1"
local probe
probe="$(ffprobe \
-v error \
-show_entries format=format_name \
-of default=noprint_wrappers=1:nokey=1 \
"${file}")" || return 1
if line_contains "${probe}" 'matroska'; then
echo mkv
else
echo mp4
fi
}
get_num_streams() {
local file="$1"
ffprobe \
-v error \
-show_entries stream=index \
-of default=noprint_wrappers=1:nokey=1 \
"${file}"
}
get_num_audio_streams() {
local file="$1"
ffprobe \
-v error \
-select_streams a \
-show_entries stream=index \
-of default=noprint_wrappers=1:nokey=1 \
"${file}"
}
get_num_audio_channels() {
local file="$1"
local stream="$2"
ffprobe \
-v error \
-select_streams "${stream}" \
-show_entries stream=channels \
-of default=noprint_wrappers=1:nokey=1 \
"${file}"
}