ffmpeg m4a/m4b/mp4 输出文件的 "Time" 值在读入 iTunes 时不正确

ffmpeg m4a/m4b/mp4 output file's "Time" value is incorrect when read into iTunes

我正在使用 ffmpeg 将有声读物转换为 m4a/m4b/mp4。似乎一切正常,直到尝试在 iTunes 中播放它们。它在 VLC、QuickTime 和 MacOS 的 Quicklook 中播放没有问题。

"So why are you posting here? This isn't an iTunes forum."

我希望这是 iTunes 对文件格式的挑剔,我可以在我的 ffmpeg 命令中添加一些神奇的参数,让它吐出 iTunes 可以读取的内容。

下面是我用来进行转换的 bash 函数。我尝试将 m4a/mp4/m4b 作为 TEMP_FILE_EXTENSION 的值,并尝试打开中间文件。当您将其放入 iTunes 时,它始终是相同的损坏 "Time" 值。

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=""
  local ACTIVATION_BYTES=""
  local OUTPUT_FILE=""
  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}"
}

一切顺利。新文件在那里等着我,当我对它执行 "Get Info" 或 "Quick look" 时,所有元数据包括封面(我在 MacOS 上)。但是当打开它并尝试在 iTunes 中播放它时,"time" 字段被 way 关闭并且它立即跳到队列中的下一个 song/audiobook。

尝试在 iTunes 中转换它立即失败 - 太快以至于看不到发生了什么。控制台中的错误只是说 "Assert failure:"(冒号后没有任何内容)。

编辑:汤米回答了问题。这是一个有效的 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=""
  local ACTIVATION_BYTES=""
  local OUTPUT_FILE=""
  # 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,但坦率地说,我不记得为什么。