Bash Script - ffmpeg não sendo chamado como esperado

5

Estou trabalhando em um script bash para converter minha biblioteca de músicas para ogg *, mas a execução do comando correto de alguma forma me ilude. Esta é a linha que deve realizá-lo:

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

Na verdade, se eu copiar a saída dessa linha, ela codificará como esperado:

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

Por exemplo:

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"

Mas, quando eu executo o script, o ffmpeg me fornece mensagens de erro, incluindo: Não é possível encontrar um formato de saída adequado para o pipe 'pipe: 1': 1: argumento inválido Analisar erro, pelo menos 3 argumentos eram esperados, apenas 1 dado em string 'aquecimentos / voz lições para ir - V1 Vocalize & Respiração / 01-05- 123454321.mp3 '

Então, como a primeira linha não está executando o comando se a segunda linha o fizer corretamente? O script completo é o seguinte:

#!/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

* Em um diretório separado, em cache; não tenha um ataque cardíaco, audiófilos!

    
por Peter Bailey 22.05.2015 / 16:20

1 resposta

1

Há algo estranho acontecendo com a linha de comando - seja um problema no sistema de arquivos ou algo mais elementar (como caracteres não imprimíveis em um nome de diretório).

A mensagem de erro "Não foi possível encontrar um formato de saída adequado para pipe: 1" é devido ao anterior "-f flac" sendo ignorado.

Eu tentei renomear um mp3 para o nome do arquivo do seu problema, e rodar o script, apenas para descobrir que estava tudo bem (até o oggenc não gostar de codificar o flac do stdin).

Eu recomendo (como don_crissti sugeriu) adicionar -loglevel debug à linha de comando e, em seguida, tentar isolar os arquivos ou diretórios que estão causando problemas, executando o script em um subconjunto de diretórios para determinar o que realmente está acontecendo. (No nível de depuração, o ffmpeg até relata o que interpretou a linha de comando)

    
por 01.07.2015 / 15:50