ffmpeg将元数据添加到ogg(opus)并嵌入图像

时间:2018-05-25 06:24:39

标签: ffmpeg

喜欢标题我想在一个文件夹(一个专辑/一个艺术家)中添加/更改元数据到ogg(opus)文件。当我从wav/flac编码到opus时,我通常使用< / p>

for f in *.*; do ffmpeg -i "$f" -c:a libopus -b:a 510000 "${f%.*}.ogg"; done

然后当我用

测试一个文件时
for f in *.*; do ffmpeg -i "$f" -c copy -metadata artist="artist name" -metadata album="album name" "${f%.*}.ogg"; done

结果是文件减少到47kb(所以我假设输入和输出名称不能相同)。

那么在保留同名的同时添加/更改元数据的任何有效方法都是如此? 以及如何将图像嵌入到ogg(opus)文件中?我希望在播放文件时显示封面图片/图像。

2 个答案:

答案 0 :(得分:0)

我不确定为什么使用-metadata时ffmpeg会对输出文件执行此操作。我试图-y覆盖,而不使用正则表达式或变量中...这很奇怪。因为如果您写入一个新文件,它将起作用。我不得不使歌曲在汽车立体声音响上正确显示,并且必须修复某些音轨并做到这一点:

#!/bin/bash

ICO="applications-multimedia"

f=$(yad --window-icon="$ICO" --center --title "Select MP3 File" --file)

function fthelp () {
yad --window-icon="gtk-help" --title="Help?" --borders=10 --center --skip-taskbar --image-on-top --image="gtk-help" --text-align=center --text="None so far..." --button=gtk-close:0
}
export -f fthelp

# SCAN FOR EXISTING TAGS
scan_art=$(ffprobe -loglevel error -show_entries format_tags=artist -of default=noprint_wrappers=1:nokey=1 "$f")
scan_alb=$(ffprobe -loglevel error -show_entries format_tags=album -of default=noprint_wrappers=1:nokey=1 "$f")
scan_tit=$(ffprobe -loglevel error -show_entries format_tags=title -of default=noprint_wrappers=1:nokey=1 "$f")
scan_year=$(ffprobe -loglevel error -show_entries format_tags=year -of default=noprint_wrappers=1:nokey=1 "$f")
scan_len=$(ffmpeg -i "$f" 2>&1 | grep "Duration"| cut -d ' ' -f 4 | sed s/,//)
scan_gen=$(ffprobe -loglevel error -show_entries format_tags=genre -of default=noprint_wrappers=1:nokey=1 "$f")
scan_lyr=$(ffprobe -loglevel error -show_entries format_tags=lyrics -of default=noprint_wrappers=1:nokey=1 "$f")

# MAIN DIALOG
MD=$(yad --window-icon="$ICO" --geometry="275x475" --center --borders="20" --justify="center" --title="2J ID3 Editor 1.0" --buttons-layout="center" --text-align="center" --text "ID3 Tag Editor" --form \
--field="Artist:" "$scan_art" \
--field="Title:" "$scan_tit" \
--field="Album:" "$scan_alb" \
--field="Year:" "$scan_year" \
--field="Length:":RO "$scan_len" \
--field="Genre:" "$scan_gen" \
--field="Lyrics:":TXT "$scan_lyr" \
--field="Create Backup?":CHK "FALSE" > /tmp/entries \
--button=gtk-help:"bash -c fthelp" \
--button=gtk-apply:0 \
--button=gtk-quit:1)

fld1=$(cut -d'|' -f1 < /tmp/entries)
fld2=$(cut -d'|' -f2 < /tmp/entries)
fld3=$(cut -d'|' -f3 < /tmp/entries)
fld4=$(cut -d'|' -f4 < /tmp/entries)
fld5=$(cut -d'|' -f5 < /tmp/entries)
fld6=$(cut -d'|' -f6 < /tmp/entries)
fld7=$(cut -d'|' -f7 < /tmp/entries)
fld8=$(cut -d'|' -f8 < /tmp/entries)

if [[ $MD == 1 ]]
then rm /tmp/entries
exit 1
else [[ $MD == 0 ]]

if [[ $fld8 == TRUE ]]
then cp "$f" "$f.bak"

ffmpeg -y -i "$f" -c copy -metadata artist="$fld1" -metadata title="$fld2" -metadata album="$fld3" -metadata year="$fld4" -metadata genre="$fld6" -metadata lyrics="$fld7" "${f#./}.new.mp3" && mv "${f#./}.new.mp3" "$f"

rm /tmp/entries
fi
fi
exit 0

如果删除.out.mp3并移至该ffmpeg命令的末尾,它将破坏该文件。就像您所说的那样,它会将您的歌曲覆盖到只有几KB大小的文件中。不知道为什么。我只是尝试使用out文件而不是覆盖文件,结果就解决了。

答案 1 :(得分:0)

对不起,我忘记了我的这个帖子,因为一个多月没有答案。 所以实际上在那时进行了一些测试之后,我的问题仅仅是因为出于某种原因,我不知道(我不是技术熟练者)ffmpeg和其他标记器在使用带有.ogg扩展名的opus编解码器时拒绝标记文件。我搜索了一下,opus编解码器的本机和推荐扩展名是.opus扩展名,因此我将其与ffmpeg -map函数一起使用,将flac中的元数据复制到了我正确创建的新opus文件中。

还可以使用ffmpeg或之后的任何标记器轻松嵌入图像。

对于覆盖问题,实际上有一点逻辑,实际上是不可能做我想要的事情,只是文件必须具有不同的全名(.flac和.opus起作用)或仅将文件输出到其他目录。