228 lines
5.5 KiB
Bash
Executable File
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 |