我当前正在编写一个命令行工具,以将带有各种格式(FLAC/OGG/MP3/...)的输入音乐库转换为给定格式的输出音乐库(FLAC/OGG/MP3)。由于它是我发现的最完整的命令行转换器,因此我已经基于AVCONV(或FFMPEG,如果AVCONV,则为FFMPEG)。我的脚本可在此URL(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
我的问题是,在Ubuntu 13.10 Saucy Salamander上使用AVCONV版本将FLAC转换为OGG时,尽管有此选项,但仍未保留元数据(复制Input FLAC FLAC文件中的全局元数据到所有音频流量流的所有音频ogg ogg ogg文件):
--map_metadata:s:a 0:g
你们中的一个人知道正确的-map_metadata选项,用于将元数据从FLAC输入文件复制到转换时OGG输出文件?
ps:其他问题:如何防止AVCONV生成的CBR MP3文件具有VBR标头?
pps:我知道诸如甜菜之类的工具,但是我还没有看到执行此任务的专用命令行工具。
在此处找到修复程序:
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
请注意,输出OGG和输入OGG时,-M -MAP_METADATA选项是相同的。
至于CBR MP3文件,此处介绍的修复程序: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