我的想法是节省一些时间并将长音频文件分割成多个音频文件并从文本文件中读取数据(startTime,endTime,artist,title)。 在MacOS(UNIX)和ffmpeg(音频)上使用终端。
用3行输入put文件示例:
00:00 - 06:16 - art - tit
06:16 - 09:22 - arti - titl
09:22 - 13:13 - artist - title
我的unix代码,shell文件:“split.command”
inputFileName=audiofile
input=test.txt
while IFS= read -r var
do
startTime=$(echo "$var" | cut -f1 -d"-")
endTime=$(echo "$var" | cut -f2 -d"-")
artist=$(echo "$var" | cut -f3 -d"-")
title=$(echo "$var" | cut -f4 -d"-")
echo ffmpeg -i ~/Downloads/$inputFileName.mp3 -metadata artist="$artist" -metadata title="$title" -ss $startTime -to $endTime -acodec copy "$title".mp3 -vsync 2
wait
done < "$input"
当我回复它时,一切看起来都很好。
$ sh split.command
ffmpeg -i /Users/tony/Downloads/audiofile.mp3 -metadata artist= art -metadata title= tit -ss 00:00 -to 06:16 -acodec copy tit.mp3 -vsync 2
ffmpeg -i /Users/tony/Downloads/audiofile.mp3 -metadata artist= arti -metadata title= titl -ss 06:16 -to 09:22 -acodec copy titl.mp3 -vsync 2
ffmpeg -i /Users/tony/Downloads/audiofile.mp3 -metadata artist= artist -metadata title= title -ss 09:22 -to 13:13 -acodec copy title.mp3 -vsync 2
删除ECHO后,它应该作为命令工作。第一个音频很好,第二个音频输出错误,第三个音响但缺少艺术作品。
1st *works*
2nd *error* Invalid duration specification for to: arti
3rd *works but..* [mp3 @ 0x7ff7e1800000] No packets were sent for some of the attached pictures.
答案 0 :(得分:0)
有两个主要问题,第一个在读取文件时有空格,第二个在输出名称中有空格。在这里,它首先将所有属性转换为字符串,然后通过ffmpeg将所有属性转换为。
read input
inputFileName=$input
mkdir $input
inputText=${inputFileName}.txt
i=0
function toString {
while IFS=- read -r startTime endTime artist title3; do
((i++))
title2="${title3// }"
str[i]=$(echo " -i "$PWD"/"${inputFileName}".mp3 -metadata artist="${artist// }" -metadata title="${title2// }" -ss "${startTime// }" -to "${endTime// }" -acodec copy "$input/${title2}".mp3 -vsync 2 ")
done< "$inputText"
}
function toSplit {
for j in $(seq 1 $i);
do
ffmpeg ${str[$j]}
done
}
toString
toSplit
在macOS上,它仅适用于终端:
sh file.command
用作可执行文件时不起作用!