读取到 iTunes 时,ffmpeg m4a/m4b/mp4 输出文件的 "Time"值不正确

标签 ffmpeg mp4 itunes m4a

我正在使用 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/

相关文章:

audio - 如何使用 ffmpeg 将单个 showwaves(或 showfreqs)叠加层与两个对称滚动的 showspectrum 叠加层集中定位?

android - 在 android 中将 SurfaceView 动画录制为视频文件

streaming - MP4 大文件慢启动

video - 透明地将 mp4 转换为 webm?

ios - Apple 发布和取消发布应用程序需要多少时间?

iphone - 如何获取 iTunes 应用程序描述?

ffmpeg - VLC:无法使用 FFMPEG 打开 H265 的 SDP 文件

video - 如何避免声音和原始视频数据之间的 ffmpeg 延迟增加?

ios - 如何提交Xcode "Generic Archive"

multithreading - 不同服务器配置的 MediaCodec 硬件解码器要慢得多?