[教学] 分割cue的音乐整轨文件(更新于2024-03-29)

Totem,mplayer,sopcast,realplayer,bmp
回复
头像
flwwater
帖子: 762
注册时间: 2010-10-31 9:15
系统: kubuntu 24.04

[教学] 分割cue的音乐整轨文件(更新于2024-03-29)

#1

帖子 flwwater » 2023-07-29 20:49

最优方法:在Linux里,可以用:
sudo apt install shntool
命令安装shntool


假设当前目录下有CDImage.cueCDImage.flac两个文件
先用kate等文本编辑器查看cue文件是否为utf8格式的,用文本编辑器打开,如果不是,需要另存为utf8格式的。不然分割出来的文件名都是乱码
一般1411kbps的wav文件分割正确,但是高于1411kbps的分割会不完整,可能是bug,这里可用下面第二种办法分割。



最后用命令:
shnsplit -t "%n.%p-%t" -f ./CDImage.cue -o flac CDImage.flac

-t是输出文件名的格式 (%p =艺人, %a =专辑, %t = 轨道标题, %n = 轨道编号 等等)
-f是输入文件./CDImage.cue 存在于当前目录下的。
-o flac是输出格式,CDImage.flac是那个需要分割的单一音乐文件


示例:
假设你下载了整轨文件,解压后当前目录下有CDImage.cueCDImage.wav两个文件
先用kate等文本编辑器查看cue文件是否为utf8格式的,用文本编辑器打开,如果不是,需要另存为utf8格式的。
shnsplit -t "%n.%p-%t" -f ./CDImage.cue -o wav CDImage.wav
shnsplit.png


不得已但更精确的办法:

cue文件仍需要保证是utf8格式
有时候会碰到分割时间点不正确的问题,最近下了一个24bit,码率2000多kb的wav整轨文件,检查过cue,里面是正常的时间分断,但是第一首歌明明cue里面定义了3:12,但是分割出来只有2分多钟。
试试MKVmerge吧,它属于mkvtoolnix包。

按章节分割:
mkvmerge "CDImage.wav" --chapters "CDImage.cue" -o "audio.mkv"

按照章节输出文件:
mkvmerge -D -S "audio.mkv" --split chapters:all -o "split-%02d.mkv"

产生一个文件名为output的原始音频:
mkvextract split-01.mkv tracks "0:output"

假如你的原始音频是wav的,你可以把output改成output.wav即可。

一个脚本把不得已的方法简单化:
先把你下载的整轨文件(假设是wav格式)和cue文件重命名为1.wav和1.cue(必需utf8格式),然后把脚本复制到同一目录 ,执行脚本即可。你也可以不重命名下载的文件,修改脚本里的
AUDIO="1.wav" 这个是你下载的整轨文件名,作为脚本的输入文件
CUE="1.cue" 这个是你下载的cue文件,作为脚本的输入文件
这两个即可。

代码: 全选

#!/bin/bash
AUDIO="1.wav"
CUE="1.cue"
MKV="audio.mkv"
TMPPATH="/tmp/extractaudio/"

#把临时文件放到/tmp临时目录,SSD有写入寿命,为了SSD的寿命,临时文件放内存。
if [ ! -d "/tmp/extractaudio" ];then
    mkdir -p /tmp/extractaudio
fi

# 探测音频格式(使用ffmpeg命令)
#FORMAT=$(ffprobe -v error -select_streams a:0 -show_entries stream=codec_name -of default=noprint_wrappers=1:nokey=1 "$AUDIO")

#简单使用AUDIO提供的后缀
FORMAT=${AUDIO##*.}

# 生成 MKV
mkvmerge "$AUDIO" --chapters "$CUE" -o "$TMPPATH$MKV"

# 统计有多少章节
JSON=$(ffprobe -i "$TMPPATH$MKV" -print_format json -show_chapters -loglevel error)
COUNT=$(echo $JSON | jq ".chapters | length" )

# 分割完整mkv到章节式mkv
mkvmerge -D -S "${TMPPATH}${MKV}" --split chapters:all -o "${TMPPATH}split-%02d.mkv"

# 循环所有生成的 .mkv 文件
COUNTER=1
while [ $COUNTER -le $COUNT ]; do

  #获取序号,用于后面的生成文件名的开头。
  printf -v ZEROTRACK "%02d" $COUNTER

  # 获取章节名
  JSON=$(ffprobe -i "${TMPPATH}split-$ZEROTRACK.mkv" -print_format json -show_chapters -loglevel error)
  TITLE=$(echo $JSON | jq ".chapters[0].tags.title" -r)
  #输出不带有前置序号的文件名
  FILENAME="$TITLE.$FORMAT"
  #以下是带有前置序号的文件名,如果你有需要,注释掉上面的,启用下面的。
  #FILENAME="[$ZEROTRACK] $TITLE.$FORMAT"

  # 原始音频
  mkvextract "${TMPPATH}split-$ZEROTRACK.mkv" tracks "0:$FILENAME"
  # 转码(可选)
  #ffmpeg -i "split-$ZEROTRACK.mkv" "$FILENAME.flac"

  let COUNTER=COUNTER+1 
done

# 删除产生的 MKVs. (可选)
rm ${TMPPATH}*.mkv 

个人收藏的数百个精美动态壁纸:
https://url17.ctfile.com/d/15983117-593 ... 768?p=6220
(访问密码:6220


个人收藏的经典国语音乐和纯音乐(钢琴,笛子,二胡等):
https://url17.ctfile.com/d/15983117-446 ... 33e?p=6220
(访问密码:6220



如果访问密码不对,可试试这个密码 566816
回复