我正在使用 ffmpeg 将有声读物转换为 m4a/m4b/mp4。一切似乎都正常,直到尝试在 iTunes 中播放它们。它可以在 VLC、QuickTime 和 MacOS 的 Quicklook 中正常播放。
“那你为什么要在这里发帖?这不是 iTunes 论坛。”
我希望这是 iTunes 对文件格式的挑剔,我可以向我的 ffmpeg 命令添加一些神奇的参数,让它输出 iTunes 可以读取的内容。
下面是我用来进行转换的 bash 函数。我尝试过 m4a/mp4/m4b 作为 TEMP_FILE_EXTENSION 的值,并尝试打开中间文件。当您将其放入 iTunes 时,它始终是相同的损坏的“时间”值。
dedrm_audible () {
# Check for AtomicParsley, ffmpeg, and 3 args
if (! type AtomicParsley >/dev/null 2>/dev/null) || (! type ffmpeg >/dev/null 2>/dev/null) || [ ! $# -eq 3 ]; then
echo "Usage:"
echo " dedrm_audible <path to .aax> <activation bytes> <path to output file>"
echo " Note: AtomicParsley and ffmpeg must be in PATH variable"
return
fi
local ORIGINAL_PWD="$(pwd)"
local TEMP_DIR="/tmp/audible"
local AUDIOBOOK_FILE="$1"
local ACTIVATION_BYTES="$2"
local OUTPUT_FILE="$3"
local FULL_AUDIOBOOK_PATH="$(realpath "${AUDIOBOOK_FILE}")"
local OUTPUT_PATH="$(realpath "${OUTPUT_FILE}")"
local TEMP_FILE_EXTENSION="m4a"
mkdir -p "${TEMP_DIR}"
cd "${TEMP_DIR}"
# Extract the book cover
ffmpeg -activation_bytes "${ACTIVATION_BYTES}" -i "${FULL_AUDIOBOOK_PATH}" -vcodec copy artwork.png
# Convert the audio
ffmpeg -activation_bytes "${ACTIVATION_BYTES}" -i "${FULL_AUDIOBOOK_PATH}" -vn -c:a copy -v debug output.${TEMP_FILE_EXTENSION}
# Add the cover to the new file
AtomicParsley output.${TEMP_FILE_EXTENSION} --artwork artwork.png --overWrite
# Put it where you want it and clean up
cp output.${TEMP_FILE_EXTENSION} "${OUTPUT_PATH}"
rm artwork.png
rm output.${TEMP_FILE_EXTENSION}
cd "${ORIGINAL_PWD}"
}
一切顺利。新文件就在那里等着我,其中包含所有元数据,包括当我对其执行“获取信息”或“快速查看”时的封面(我使用的是 MacOS)。但是,当打开它并尝试在 iTunes 中播放它时,“时间”字段远远消失,它立即跳到队列中的下一首歌曲/有声读物。
在 iTunes 中对其进行转换的尝试立即失败 - 速度太快,无法看到发生了什么。控制台中的错误只是显示“断言失败:”(冒号后没有任何内容)。
编辑:汤米回答了问题。这是一个有效的 bash 函数:
dedrm_audible () {
# Check for AtomicParsley, ffmpeg, and 3 args
if (! type AtomicParsley >/dev/null 2>/dev/null) || (! type ffmpeg >/dev/null 2>/dev/null) || [ ! $# -eq 3 ]; then
echo "Usage:"
echo " dedrm_audible <path to .aax> <activation bytes> <path to output file>"
echo " Note: AtomicParsley and ffmpeg must be in PATH variable"
return
fi
local ORIGINAL_PWD="$(pwd)"
local TEMP_DIR="/tmp/audible"
local AUDIOBOOK_FILE="$1"
local ACTIVATION_BYTES="$2"
local OUTPUT_FILE="$3"
# Alternative to realpath (since I read somewhere that it's not there by default on some systems): OUTPUT_PATH="$( cd "$( dirname "$OUTPUT_FILE" )" && pwd )"
local FULL_AUDIOBOOK_PATH="$(realpath "${AUDIOBOOK_FILE}")"
local AUDIOBOOK_NAME="${$(basename "${FULL_AUDIOBOOK_PATH}")%.aax}.m4a"
local OUTPUT_PATH="$(realpath "${OUTPUT_FILE}")"
local TEMP_FILE_EXTENSION="m4a"
mkdir -p "${TEMP_DIR}"
cd "${TEMP_DIR}"
cp "${FULL_AUDIOBOOK_PATH}" "${AUDIOBOOK_NAME}"
# Extract the book cover
ffmpeg -activation_bytes "${ACTIVATION_BYTES}" -i "${AUDIOBOOK_NAME}" -vcodec copy artwork.png
# Convert the audio
ffmpeg -activation_bytes "${ACTIVATION_BYTES}" -i "${AUDIOBOOK_NAME}" -vn -c:a copy -v debug output.${TEMP_FILE_EXTENSION}
# Add the cover to the new file
AtomicParsley output.${TEMP_FILE_EXTENSION} --artwork artwork.png --overWrite
# Put it where you want it and clean up
mv output.${TEMP_FILE_EXTENSION} "${OUTPUT_PATH}"
rm artwork.png
rm "${AUDIOBOOK_NAME}"
cd "${ORIGINAL_PWD}"
}
最佳答案
他们也不再为我工作,但如果你只是将文件扩展名更改为 .m4a,它将可以正常导入,然后你只需将类型从音乐更改为有声读物,并告诉它记住位置,它就可以在 Mac 或iPhone。
另一种方法是我返回并在 .aax 上重新运行 ffmpeg,输出为 .m4b,iTunes 处理得很好。我以前没有使用过.m4b,但坦率地说我不记得为什么。
关于读取到 iTunes 时,ffmpeg m4a/m4b/mp4 输出文件的 "Time"值不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56318303/