我有一个巨大的脚本来将我的 FLAC 转换为 OPUS 文件,但我正在努力解决一个特定问题。转换并尝试复制封面图像时,会抛出错误。序言,这是处理转换的脚本的一部分:
find $DIRECTORY -type f \
\( -iname "*${EXTENSIONS[0]}" $(if [ ${#EXTENSIONS[@]} -gt 1 ]; \
then printf -- '-o -iname *%s ' "${EXTENSIONS[@]:1}"; fi) \) \
-print0 | \
xargs -0 -P $THREADS -I {} \
ffmpeg -i "{}" \
$(if [ ! $VERBOSE ]; then echo "-loglevel warning"; fi) \
-map 0:a \
-c:a libopus -map_metadata 0 -map_metadata:s:a 0:s:a \
-b:a $BITRATE \
-map 0:v \
-c:v copy -map_metadata 0 -map_metadata:s:v 0:s:v -disposition:v:1 attached_pic \
-y "{}.opus"
我收到以下错误:
Stream mapping:
Stream #0:0 -> #0:0 (flac (native) -> opus (libopus))
Stream #0:1 -> #0:1 (copy)
Press [q] to stop, [?] for help
[opus @ 0x562a9db664c0] Unsupported codec id in stream 1
[out#0/opus @ 0x562a9db64580] Could not write header (incorrect codec parameters ?): Invalid argument
[aost#0:0/libopus @ 0x562a9db68540] Error initializing output stream:
然而,这在这里有效:
ffmpeg -i "{}" \
$(if [ ! $VERBOSE ]; then echo "-loglevel warning"; fi) \
-map 0:a \
-c:a libopus -map_metadata 0 -map_metadata:s:a 0:s:a \
-b:a $BITRATE \
-y "{}.opus"
以及这里的这个:
ffmpeg -i "{}" \
$(if [ ! $VERBOSE ]; then echo "-loglevel warning"; fi) \
-map 0:a \
-map_metadata 0 -map_metadata:s:a 0:s:a \
-b:a $BITRATE \
-map 0:v \
-c:v copy -map_metadata 0 -map_metadata:s:v 0:s:v -disposition:v:1 attached_pic \
-y "{}.mp3"
唯一的区别是,后者要么不复制视频,要么输出 MP3 而不是作品。因此 ffmpeg 命令本身应该是正确的,因为如果我不包含视频流(在 OPUS 和 MP3 中),它不会复制图像
这是非常奇怪的行为,我现在完全不知道如何解决它,这是否记录在某处?感觉像是 libopus 问题,但为什么 libopus 甚至会看视频,如果不看,为什么会抛出错误?
PS:意识到 ffprobe 可能有用,对于带有缩略图的 OPUS 文件(用 Kid3 创建)和对于同一首歌曲的 flac 文件
PPS:在有人对我聪明之前,是的,我可以用 for 循环来完成此操作,我想要一个挑战而不是一个有用的脚本,它恰好两者兼而有之。是的,我可以手动执行,我每个月至少购买一张专辑,我不想手动执行这些操作,也不想在我的 Jellyfin 上添加flac
答案1
目前,FFMPEG 不支持 OGG 容器中的封面艺术,请参阅支持编写嵌入 ogg/opus 元数据中的专辑封面艺术图像 - 评论 11
您可以使用参数手动添加图像作为封面艺术-metadata:s:a METADATA_BLOCK_PICTURE=...
。
如需手动解决方案,请参阅在 OGG 音频文件中添加艺术封面在超级用户上