Bash 脚本——ffmpeg 没有按预期被调用

Bash 脚本——ffmpeg 没有按预期被调用

我正在编写一个 bash 脚本来将我的音乐库转换为 ogg*,但执行正确的命令不知何故让我困惑。这是应该完成它的行:

ffmpeg -i "${file}" -f flac pipe:1 | oggenc - -o "${NEWOGGFILE}"

事实上,如果我复制这一行的输出,它会按预期进行编码:

echo "ffmpeg -i \"${file}\" -f flac pipe:1 | oggenc - -o \"${NEWOGGFILE}\""

例如:

ffmpeg -i "./Music/Oldies/Sam Cooke/23 Shake.m4a" -f flac pipe:1 | oggenc - -o "/mnt/Primary/Audio_OGG_Cache/./Music/Oldies/Sam Cooke/23 Shake.ogg"

但是,当我运行该脚本时,ffmpeg 会给出错误消息,包括: Unable to find a合适的输出格式 for 'pipe:1' pipeline:1: Invalid argument Parse error, attestation at the attestation of 3args were Expected, only 1给定在字符串中'al 热身/语音课程 - V1 Vocalize & Breath/01-05- 123454321.mp3'

那么,如果第二行正确回显,第一行如何不执行该命令呢?完整的脚本如下:

#!/bin/bash
pushd "${1}"

find ./ | while read file
do
  BASENAME=`basename "${file}"`
  NEWOGGFILE=${2}`dirname "${file}"`/${BASENAME%.*}.ogg
  NEWFILE=${2}`dirname "${file}"`/${BASENAME}

  # Ignore directories, and don't re-copy existing files.
  if [ ! -d "${file}" ] && [ ! -f "${NEWFILE}" ] && [ ! -f "${NEWOGGFILE}" ]; then
    mkdir -p "`dirname "${NEWFILE}"`"
    # m4a, mp3, and flac get converted
    if [ "${file##*.}" = "flac" ]; then
      oggenc "${file}" -o "${NEWOGGFILE}"
    elif [ "${file##*.}" = "m4a" ] || [ "${file##*.}" = "mp3" ]; then
      ffmpeg -i "${file}" -f flac pipe:1 | oggenc - -o "${NEWOGGFILE}"
    # any other remaining types of files (typically album art) are copied directly.
    else
      cp "${file}" "${NEWFILE}"
    fi
  else
    echo "${NEWFILE}" already exists.
  fi
done

popd

*在单独的缓存目录中;发烧友们,别心脏病发作!

答案1

命令行出现了一些奇怪的情况 - 无论是文件系统问题还是更基本的问题(例如目录名称中的不可打印字符)。

错误消息“无法为管道找到合适的输出格式:1”是由于忽略了前面的“-f flac”。

我尝试将 mp3 重命名为您指定的问题文件名,然后运行脚本,结果发现它很好(直到 oggenc 不喜欢从标准输入编码 flac 为止)。

我建议(正如 don_crissti 建议的那样)添加-loglevel debug到命令行,然后尝试通过在目录子集上运行脚本来确定真正发生的情况来隔离导致问题的文件或目录。 (在调试级别,ffmpeg 甚至报告它对命令行的解释)

相关内容