2023-10-30 03:49:10 +03:00
|
|
|
# mux audio into containers. file names in sound and current dirrectories must match. tmp usage for anime downloads.
|
|
|
|
# usage: ffmpeg_mux_audio <SOUND> <OUTPUT DIR>
|
2023-08-08 16:24:15 +03:00
|
|
|
ffmpeg_mux_audio()
|
|
|
|
{
|
|
|
|
if [[ "$1" = "" ]]; then
|
2023-10-30 03:49:10 +03:00
|
|
|
echo "usage: ffmpeg_mux_audio <SOUND> <OUTPUT DIR>"
|
2023-11-30 03:52:05 +03:00
|
|
|
return 2
|
2023-08-08 16:24:15 +03:00
|
|
|
fi
|
|
|
|
|
|
|
|
for file in *; do ffmpeg -i "$file" -i "$1"/"$file" -c copy -map 0:v:0 -map 1:a:0 -shortest "$2"/"$file"; done
|
|
|
|
}
|
2023-11-26 01:23:30 +03:00
|
|
|
|
|
|
|
# Mux cover into music file.
|
|
|
|
# Usage: ffmpeg_mux_cover <FORMAT> <COVER>
|
|
|
|
ffmpeg_mux_cover()
|
|
|
|
{
|
|
|
|
if [[ "${1}" = "" ]]; then
|
|
|
|
echo "Usage: ffmpeg_mux_cover <FORMAT> <COVER>"
|
2023-11-30 03:52:05 +03:00
|
|
|
return 2
|
2023-11-26 01:23:30 +03:00
|
|
|
fi
|
|
|
|
|
2023-11-30 02:00:14 +03:00
|
|
|
local format="${1}"
|
|
|
|
local cover="${2}"
|
|
|
|
|
2023-11-26 01:23:30 +03:00
|
|
|
mkdir out
|
|
|
|
|
2023-11-30 02:00:14 +03:00
|
|
|
for file in *.${format}; do
|
|
|
|
ffmpeg -i "${file}" -i "${cover}" -map 0:a -map 1 -codec copy -metadata:s:v title="Album cover" -metadata:s:v comment="Cover (front)" -disposition:v attached_pic ./out/"${file}" || return 1
|
2023-11-26 01:23:30 +03:00
|
|
|
done
|
|
|
|
|
2023-11-30 03:52:05 +03:00
|
|
|
mv out/* .
|
|
|
|
rm -d out/ && rm "${2}"
|
2023-11-26 01:23:30 +03:00
|
|
|
}
|
2023-11-28 02:30:13 +03:00
|
|
|
|
2023-11-30 03:52:05 +03:00
|
|
|
# Change music metadata.
|
|
|
|
# Usage: ffmpeg_music_meta <FORMAT>
|
|
|
|
ffmpeg_music_meta()
|
2023-11-30 02:00:14 +03:00
|
|
|
{
|
|
|
|
if [[ "${1}" = "" ]]; then
|
2023-11-30 03:54:45 +03:00
|
|
|
echo "Usage: ffmpeg_music_meta <FORMAT>"
|
2023-11-30 03:52:05 +03:00
|
|
|
return 2
|
2023-11-30 02:00:14 +03:00
|
|
|
fi
|
|
|
|
|
|
|
|
local format="${1}"
|
2023-11-30 03:52:05 +03:00
|
|
|
|
2023-11-30 05:23:07 +03:00
|
|
|
ls *.${format} &> /dev/null || return 1
|
|
|
|
|
2023-11-30 03:54:45 +03:00
|
|
|
local artist="${PWD%/*}"; artist="${artist##*/}"; artist="${artist//_/ }"
|
|
|
|
local album="${PWD##*/}"; album="${album#*_}"; album="${album//_/ }"
|
2023-11-30 03:52:05 +03:00
|
|
|
local year="${PWD##*/}"; year="${year%%_*}"
|
2023-11-30 02:00:14 +03:00
|
|
|
|
|
|
|
mkdir out
|
|
|
|
|
|
|
|
for file in *.${format}; do
|
2023-11-30 03:54:45 +03:00
|
|
|
local track="${file%%_*}"; track=$((10#${track})); [[ "${track}" = "" ]] && track=0
|
|
|
|
local title="${file#*_}"; title="${title%.*}"; title="${title//_/ }"
|
2023-11-30 03:52:05 +03:00
|
|
|
|
2023-11-30 03:54:45 +03:00
|
|
|
# echo "${artist}; ${album}; ${year}; ${track}; ${title}"
|
2023-11-30 16:53:52 +03:00
|
|
|
ffmpeg -i "${file}" -c copy -metadata "artist=${artist}" -metadata "album_artist=${artist}" -metadata "album=${album}" -metadata "date=${year}" -metadata "year=${year}" -metadata "track=${track}" -metadata "title=${title}" ./out/"${file}" || return 1
|
2023-11-30 02:00:14 +03:00
|
|
|
done
|
|
|
|
|
2023-11-30 03:52:05 +03:00
|
|
|
mv out/* .
|
|
|
|
rm -d out/
|
2023-11-30 02:00:14 +03:00
|
|
|
}
|
|
|
|
|
2023-11-28 02:30:13 +03:00
|
|
|
_ffprobe_fps()
|
|
|
|
{
|
|
|
|
local fps=$(ffprobe -v 0 -of csv=p=0 -select_streams v:0 -show_entries stream=r_frame_rate "${1}")
|
|
|
|
fps="${fps%%/*}"
|
|
|
|
echo "${fps}"
|
|
|
|
}
|
|
|
|
|
|
|
|
_ffprobe_keyint()
|
|
|
|
{
|
|
|
|
local fps=$(_ffprobe_fps "${1}")
|
|
|
|
echo $((fps*5))
|
|
|
|
}
|
|
|
|
|
|
|
|
_ffprobe_ba()
|
|
|
|
{
|
|
|
|
local ba=$(ffprobe -v error -select_streams a:0 -show_entries stream=bit_rate -of default=noprint_wrappers=1:nokey=1 "${1}")
|
2023-12-01 00:44:25 +03:00
|
|
|
[[ "${ba}" != "N/A" ]] && echo $((ba/1024)) || echo 128
|
2023-11-28 02:30:13 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
export -f _ffprobe_keyint _ffprobe_ba _ffprobe_fps
|