目录
- 我正在尝试做什么
- 我尝试过的方法
- 第一次尝试
- 第二次尝试
- 问题
我正在尝试做什么
假设我有一个 FLAC 文件和一个 CUE 文件,其中包含从 FLAC 文件中提取某些部分的信息。即以下部分
- 曲目“My Foo 1 Foo”从 00:00 到 00:59
- 曲目“My Foo 2 Foo”从 01:00 到 01:59
- 曲目“My Foo 3 Foo”从 02:00 到 02:59
- 曲目“My Foo 4 Foo”从 03:00 到 03:59
我知道shnsplit
可以给定一个 CUE 文件来分割一个 FLAC 文件。事实上,我尝试过使用shnsplit
,但我无法得到我提到的结果。
我尝试过的方法
通过使用以下命令,我创建了一个 FLAC 文件。如果您正在寻找示例 FLAC 文件,也可以使用它来创建一个。音频包含从数字 1 到数字 1000 的计数,持续 6 分 52 秒。
$ espeak --stdout "$(seq 1 1000 | tr '\n' ' ')" > main.wav
$ ffmpeg -y -i main.wav main.flac
您可以使用以下命令显示 FLAC 文件的持续时间。
$ ffprobe -v error -show_entries stream=duration -print_format default=nk=1:nw=1 main.flac
412.812517
第一次尝试
main.cue
下面的代码块包含我手动创建的文件的文件内容。
FILE "foo.flac" WAVE
TRACK 01 AUDIO
TITLE "My Foo 1 Foo"
INDEX 00 00:00
INDEX 01 00:59
TRACK 02 AUDIO
TITLE "My Foo 2 Foo"
INDEX 00 01:00
INDEX 01 01:59
TRACK 03 AUDIO
TITLE "My Foo 3 Foo"
INDEX 00 02:00
INDEX 01 02:59
TRACK 04 AUDIO
TITLE "My Foo 4 Foo"
INDEX 00 03:00
INDEX 01 03:59
下面的代码块显示了shnsplit
我用来分割文件的命令。
shnsplit -O always -f main.cue -t '%n - %t' -o flac main.flac
下面的代码块显示了我用来显示当前目录中的所有 FLAC 文件及其持续时间的命令。
find -name '*.flac' ! -name 'main.flac' | sort | while read -r line
do
echo "$line"
ffprobe -v error -show_entries stream=duration -print_format default=nk=1:nw=1 "$line"
done
./00 - pregap.flac
59.000000
./01 - My Foo 1 Foo.flac
60.000000
./02 - My Foo 2 Foo.flac
60.000000
./03 - My Foo 3 Foo.flac
60.000000
./04 - My Foo 4 Foo.flac
173.812517
由于两个原因,这不是我想要的结果。首先,有一个名为的文件,00 - pregap.flac
其持续时间为 59 秒。此文件不应该存在,因为第一首曲目(即My Foo 1 Foo
)从 00:00 开始,因此没有前间隙。其次,该文件预计持续时间为 60 秒,但是,它似乎一直持续到 FLAC 文件的末尾。
第二次尝试
与第一次尝试相反,在这次尝试中我没有指定INDEX 00
。
main.cue
下面的代码块包含我手动创建的文件的文件内容。
FILE "foo.flac" WAVE
TRACK 01 AUDIO
TITLE "My Foo 1 Foo"
INDEX 01 00:00
TRACK 02 AUDIO
TITLE "My Foo 2 Foo"
INDEX 01 01:00
TRACK 03 AUDIO
TITLE "My Foo 3 Foo"
INDEX 01 02:00
TRACK 04 AUDIO
TITLE "My Foo 4 Foo"
INDEX 01 03:00
下面的代码块显示了shnsplit
我用来分割文件的命令。
shnsplit -O always -f main.cue -t '%n - %t' -o flac main.flac
下面的代码块显示了我用来显示当前目录中的所有 FLAC 文件及其持续时间的命令。
find -name '*.flac' ! -name 'main.flac' | sort | while read -r line
do
echo "$line"
ffprobe -v error -show_entries stream=duration -print_format default=nk=1:nw=1 "$line"
done
./01 - My Foo 1 Foo.flac
60.000000
./02 - My Foo 2 Foo.flac
60.000000
./03 - My Foo 3 Foo.flac
60.000000
./04 - My Foo 4 Foo.flac
232.812517
虽然这次尝试没有创建文件pregap.flac
,但这不是我想要的结果,原因如下:该曲目My Foo 4 Foo
持续时间超过 3 分钟,预期结果是它的持续时间与所有其他曲目一样为 60 秒。
问题
您能否提供一个最小的工作示例来说明如何使用shnsplit
它来获得我在第一部分中提到的结果?