Files
2026-08-13 16:50:52 +08:00

228 lines
5.5 KiB
Bash
Executable File

#!/bin/bash
# 当前目录
CUR_DIR=`pwd`
# 配置文件目录
CONFIG_FILE=$CUR_DIR/config.sh
# 使能配置
source $CONFIG_FILE
if [ ! -f $FFMPEG_EXE ]; then
echo "工具不存在: $FFMPEG_EXE"
exit
fi
if [ ! -f $TONETOOL_EXE ]; then
echo "工具不存在: $TONETOOL_EXE"
exit
fi
WHICH_ID3_TOOL=`which $ID3TAG_EXE`
if [ -z $WHICH_ID3_TOOL ]; then
echo "工具不存在: $ID3TAG_EXE, 请安装: sudo apt-get install id3v2"
exit
fi
PROC_USER_ARG=''
PROC_IS_FILE=0
PROC_ONLY_PACK=0
function showHelp()
{
echo "脚本使用示例:"
echo "1) ./proc.sh -p ./ring -p: 仅打包路径下的音频文件"
echo "2) ./proc.sh -d ./ring -d: 处理并打包路径下的音频文件"
echo "3) ./proc.sh -f ./ring/test.mp3 -f: 处理指定的音频文件"
}
# 脚本传参解析
if [[ $# -le 1 ]]; then
showHelp
exit
fi
while [[ $# -gt 0 ]]; do
case "$1" in
-h|--help)
showHelp
exit
;;
-f|--file)
if [ -n "$2" ]; then
if [ -f $2 ]; then
echo "处理文件: $2"
PROC_IS_FILE=1
PROC_USER_ARG=$2
break
else
echo "文件无效: $2 "
exit
fi
else
echo "请指定文件"
exit
fi
;;
-d|--dir)
if [ -n "$2" ]; then
if [ -d $2 ]; then
echo "处理目录: $2"
PROC_USER_ARG=$2
break
else
echo "处理目录无效: $2 "
exit
fi
else
echo "请指定处理目录"
exit
fi
;;
-p|--pack)
if [ -n "$2" ]; then
if [ -d $2 ]; then
echo "仅打包目录: $2"
PROC_ONLY_PACK=1
PROC_USER_ARG=$2
break
else
echo "打包目录无效: $2 "
exit
fi
else
echo "请指定打包目录"
exit
fi
;;
*)
echo "不支持的选项: $1"
showHelp
exit
;;
esac
shift
done
echo "OS ARCH: $OS_ARCH"
echo "Please Visit: https://ffbinaries.com/downloads to view all ffmpeg versions"
# 静音去除
FP0=silenceremove
# 在音频开头修剪音频
FPSP=start_periods=1
# 停止裁剪音频之前必须检测到的非静音时长
FPSD=start_duration=0
# 静音检测阈值
FPST=start_threshold=$MUTE_THRESHOLD
# 头部起始静音时间
FPSS1=start_silence=$MUTE_SAVE_PREFIX_TIME
# 尾部起始静音时间
FPSS2=start_silence=$MUTE_SAVE_SUFFIX_TIME
# 使用幅度值 amplitude 计算
FPD=detection=peak
# 反转
FPAV=areverse
# FFMPEG 参数
FFMPEG_PARAM=${FP0}=${FPSP}:${FPSD}:${FPST}:${FPSS1}:${FPD},${FPAV},${FP0}=${FPSP}:${FPSD}:${FPST}:${FPSS2}:${FPD},${FPAV}
# 处理函数
function proc_audio()
{
in_file=$1
out_file=$2
in_file_suffix=${in_file##*.}
in_file_prefix=${in_file%%.*}
out_file_prefix=${out_file%%.*}
if [ $in_file_suffix == "pcm" ] || [ $in_file_suffix == "mp3" ]; then
if [ $in_file_suffix == "pcm" ]; then
mp3_file=$in_file_prefix.mp3
if [ -f $mp3_file ]; then
rm $mp3_file
fi
# 转换PCM为MP3, 只处理16K、单通道、16bit PCM音频
echo "转换PCM为MP3: $in_file -> $mp3_file"
$FFMPEG_EXE -f s16le -ar 16000 -ac 1 -i $in_file -c:a libmp3lame -b:a 96k -acodec mp3 $mp3_file
in_file=$mp3_file
out_file=$out_file_prefix.mp3
fi
echo "处理前后静音: $in_file"
$FFMPEG_EXE -hide_banner -loglevel warning -i $in_file -filter_complex \
"$FFMPEG_PARAM" \
-ar 16000 -ac 1 -b:a $MUTE_AUDIO_RATE -acodec mp3 $out_file -y
# 移动文件
mv $out_file $in_file
# 去除ID3v1 ID3v2 TAG
$ID3TAG_EXE -D $in_file >/dev/null
else
echo "不支持的文件后缀: $in_file_suffix"
fi
}
function pack_tone_binary()
{
echo "打包音频, 目录: $1"
if [ -f $1/tone.h ]; then
rm -rf $1/tone.h
fi
if [ -f $1/tone.bin ]; then
rm -rf $1/tone.bin
fi
$TONETOOL_EXE $1 > /dev/null
if [ ! -z "$PACK_TONE_OUT_BINARY" ] && [ -d $PACK_TONE_OUT_BINARY ]; then
mv $1/tone.bin $$PACK_TONE_OUT_BINARY
else
echo "音频包二进制文件: $1/tone.bin"
fi
if [ ! -z "$PACK_TONE_OUT_HEADER" ] && [ -d $PACK_TONE_OUT_HEADER ]; then
mv $1/tone.h $$PACK_TONE_OUT_HEADER
else
echo "音频包头文件: $1/tone.h"
fi
}
# 暂存文件夹
tmp_dir=$CUR_DIR/tmp
if [ -d $tmp_dir ]; then
rm -rf $tmp_dir
fi
mkdir $tmp_dir
if [ $PROC_IS_FILE -eq 1 ]; then
# 处理文件
audio_file=`basename $PROC_USER_ARG`
proc_audio $PROC_USER_ARG $tmp_dir/$audio_file
else
# 去除路径后的反斜杠
PROC_USER_ARG=$(echo "$PROC_USER_ARG" | sed 's/\/$//')
if [ $PROC_ONLY_PACK -eq 0 ]; then
# 处理目录
for audio_file in `ls $PROC_USER_ARG`
do
proc_audio $PROC_USER_ARG/$audio_file $tmp_dir/$audio_file
done
fi
pack_tone_binary $PROC_USER_ARG
fi
# 清除暂存文件夹
if [ -d $tmp_dir ]; then
rm -rf $tmp_dir
fi