avconv: преобразование flac в ogg с сохранением метаданных

В настоящее время я пишу инструмент командной строки для преобразования входной музыкальной библиотеки различных форматов (flac / ogg / mp3 / ...) в выходную музыкальную библиотеку заданного формата (flac / ogg / mp3). Я основал его на avconv (или ffmpeg, если avconv недоступен), так как это самый полный конвертер командной строки, который я нашел. Мой скрипт доступен по этому адресу (GitHub):

https://github.com/biapy/howto.biapy.com/blob/master/various/mussync-tools

Я пытаюсь передать метаданные из входных библиотечных файлов в выходные / преобразованные библиотечные файлы.

Я пришел с этим кодом:

 local MAP_METADATA=' 0:g'
  # Specific needs for some input formats/
  case "${INPUT_FILE_MIMETYPE}" in
    'application/ogg' )
      # Get input metadata from first audio stream and direct it to global.
      MAP_METADATA=' 0:s:0'
      ;;

    * )
      # Do nothing.
      # MAP_METADATA=' 0:g'
      ;;
  esac

  # Specific needs for some output formats/
  local OUTPUT_OPTIONS=""
  case "${OUTPUT_FORMAT}" in
    'flac' )
      # No encoding options needed.
      ENCODING_OPTIONS=""
      ;;

    'ogg' )
      # Set vorbis as default codec for ogg.
      OUTPUT_OPTIONS="-codec:a libvorbis -f ${OUTPUT_FORMAT}"
      # Map input metadata to all audio streams in ogg container.
      MAP_METADATA=":s:a ${MAP_METADATA}"
      ;;

    * )
      # Do nothing.
      # MAP_METADATA="${MAP_METADATA}"
      OUTPUT_OPTIONS="-f ${OUTPUT_FORMAT}"
      ;;
  esac

  # Dangerous solution for mp3 cbr format:
  # Write output on pipe and then directed to file.
  # For cbr format for mp3 files. Harmless for other formats.
  # See: http://ffmpeg.zeranoe.com/forum/viewtopic.php?f=7&t=377
  #
  # What about log output ? how to prevent it from being included in
  # the resulting output file ?

  if ! command ${AVCONV} -i "${INPUT_FILE}" \
             -vn -sn \
            -map_metadata${MAP_METADATA} \
            -loglevel "${LOG_LEVEL}" \
            ${AVCONV_OPTIONS} \
            ${OUTPUT_OPTIONS} \
            ${ENCODING_OPTIONS} \
            "${OUTPUT_TEMP_FILE}"; then
    test "${QUIET}" != 'True' && echo "Failed."
    test -e "${OUTPUT_TEMP_FILE}" && command rm "${OUTPUT_TEMP_FILE}"

    return 1
  else
    test "${QUIET}" != 'True' && echo "Done."

    # Test if fix for MP3 VBR is needed.
    # See: http://ffmpeg.zeranoe.com/forum/viewtopic.php?f=7&t=377
    if [ "${OUTPUT_FORMAT}" = 'mp3' -a "${ENCODING_MODE}" != 'CBR' ]; then
      # Output file is MP3 and VBR. Apply header fix.
      if [ "${VERBOSE}" = 'True' ]; then
        command vbrfix "${OUTPUT_TEMP_FILE}" "${OUTPUT_FILE}"
      else
        command vbrfix "${OUTPUT_TEMP_FILE}" "${OUTPUT_FILE}"
      fi
    else
      # Nothing to do but rename the file.
      command mv "${OUTPUT_TEMP_FILE}" "${OUTPUT_FILE}"
    fi

    # Delete temporary file if it is still present.
    test -e "${OUTPUT_TEMP_FILE}" && command rm "${OUTPUT_TEMP_FILE}"

    # Fetch cover art from input file.
    transfert_images "${INPUT_FILE}" "${OUTPUT_FILE}"
  fi

Моя проблема заключается в том, что при преобразовании flac в ogg с помощью версии avconv, доступной в Ubuntu 13.10 Saucy Salamander, метаданные не сохраняются, несмотря на эту опцию (копировать глобальные метаданные из входного файла flac во все аудиопотоки выходного файла ogg):

--map_metadata:s:a 0:g

Знает ли кто-нибудь из вас правильную опцию --map_metadata для копирования метаданных из входного файла flac в выходной файл ogg при преобразовании?

PS: дополнительный вопрос: как предотвратить сгенерированные avconv mp3-файлы CBR иметь заголовок VBR?

pps: мне известны такие инструменты, как свекла, но я еще не видел специализированный инструмент командной строки, который выполняет эту задачу.

1 ответ

Решение

Нашел исправление здесь:

https://bugs.kde.org/show_bug.cgi?id=306895

Хорошие параметры --map_metadata:

  • для ogg к любому: --map_metadata 0:s:0
  • для любого, кроме ogg к ogg: --map_metadata:s:a 0:s:0

Обратите внимание, что опция --map_metadata одинакова при выводе Ogg и вводе ogg.

Что касается mp3-файлов CBR, исправление, представленное здесь: http://ffmpeg.zeranoe.com/forum/viewtopic.php?f=7&t=37 (вывод в канал), является действительным. avconv выводит информацию журнала в &2. &1 бесплатно для данных.РЕДАКТИРОВАТЬ: это исправление работает только для CBR mp3, оно ломает VBR mp3, который нуждается в прямом выводе в файл.

Я интегрировал изменения в mussync-tools 1.2.0:

https://github.com/biapy/howto.biapy.com/blob/master/various/mussync-tools

Другие вопросы по тегам