首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当读取到iTunes时,ffmpeg m4a/m4b/mp4输出文件的“时间”值不正确

当读取到iTunes时,ffmpeg m4a/m4b/mp4输出文件的“时间”值不正确
EN

Stack Overflow用户
提问于 2019-05-27 00:10:38
回答 1查看 490关注 0票数 2

我使用ffmpeg将有声读物转换为m4a/m4b/mp4。在尝试在iTunes中播放它们之前,一切似乎都很有效。它可以在VLC、QuickTime和MacOS的Quicklook中播放,没有问题。

“那么你为什么要在这里发帖呢?这不是一个iTunes论坛。”

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

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

代码语言:javascript
复制
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中播放它时,"time“字段已经关闭,它立即跳过队列中的下一首歌曲/有声本。

在iTunes中转换它的尝试立即失败-太快,看不出发生了什么。控制台中的错误仅仅是“:”(冒号之后没有任何内容)。

编辑:汤米回答了这个问题。下面是一个有用的bash函数:

代码语言:javascript
复制
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}"
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-30 20:17:18

他们也停止了对我的工作,但如果您只需将文件扩展名更改为.m4a,它将导入很好,那么您只需将类型从音乐更改为有声读物,并告诉它记住位置,它在mac或iPhone上运行良好。

另一种方法是,我返回并在.aax上重新运行ffmpeg,输出到.m4b,iTunes处理得很好。我以前没有use.m4b,但坦白地说,我不记得原因了。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56318303

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档