【问题标题】:ffmpeg add metadata to ogg(opus) and embed imageffmpeg 将元数据添加到 ogg(opus) 并嵌入图像
【发布时间】:2023-04-10 10:47:02
【问题描述】:

像标题一样,我想将元数据添加/更改到一个文件夹中的ogg(opus) 文件(一张专辑/一位艺术家)。当我从wav/flac 编码到opus 时,我通常使用

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) 文件中?我希望在播放文件时显示封面艺术/图像。

【问题讨论】:

    标签: ffmpeg


    【解决方案1】:

    很抱歉我忘记了我的这篇文章,因为一个多月没有答案。 所以实际上在当时经过一些测试之后,我的问题仅仅是因为我不知道(我不是技术专家)ffmpeg 和其他标记器在使用带有 .ogg 扩展名的 opus 编解码器时拒绝标记文件。我搜索了一下,opus 编解码器的原生和推荐扩展名是 .opus 扩展名,所以我使用它并使用 ffmpeg -map 函数将来自 flac 的元数据复制到我正确创建的新 opus 文件中。

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

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

    【讨论】:

    • 会不会只是编码的问题?像base64...
    【解决方案2】:

    我不确定为什么 ffmpeg 在使用 -metadata 时会对输出文件这样做。我尝试过 -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 文件而不是覆盖,结果成功了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-23
      • 2021-08-13
      • 2021-11-19
      • 2020-08-04
      • 2021-02-05
      • 1970-01-01
      • 2021-08-09
      • 2023-03-26
      相关资源
      最近更新 更多