如何使用FFmpeg将FLAC文件转换为ALAC并完整保留所有元数据
如何使用FFmpeg将FLAC文件转换为ALAC并完整保留所有元数据
嗨,我来帮你解决这个FLAC转ALAC时元数据丢失的问题!我之前也碰到过类似的情况——FFmpeg默认的元数据映射有时候确实没法把VorbisComment(FLAC用的元数据格式)完整转换成MP4容器(ALAC常用的m4a格式)支持的QuickTime元数据字段,光加-map_metadata 0和-id3v2_version 2确实不够。
试试这个优化后的命令,应该能解决大部分元数据丢失的问题:
for i in *.flac; do ffmpeg -i "$i" -y -vn -c:a alac -map_metadata 0 -map_metadata:s:a 0:s:a -movflags use_metadata_tags "${i%.flac}".m4a; done
我给你拆解下关键参数的作用:
-map_metadata 0:把源文件的全局元数据(比如专辑名、艺术家)映射到输出文件-map_metadata:s:a 0:s:a:专门处理音频流的元数据,避免漏掉流层面的标签-movflags use_metadata_tags:这个是核心!它会让FFmpeg严格按照MP4的元数据规范来转换标签,把FLAC里的VorbisComment对应到正确的QuickTime字段里,之前没加这个的话很多标签会被忽略。
如果还是有个别自定义标签或者特殊字段没被保留,那可以用更手动的方式:先用ffprobe提取FLAC里的标签,再手动注入到输出的m4a中,命令示例如下:
for i in *.flac; do ffmpeg -i "$i" -y -vn -c:a alac \ -metadata title="$(ffprobe -v error -show_entries format_tags=title -of default=noprint_wrappers=1:nokey=1 "$i")" \ -metadata artist="$(ffprobe -v error -show_entries format_tags=artist -of default=noprint_wrappers=1:nokey=1 "$i")" \ -metadata album="$(ffprobe -v error -show_entries format_tags=album -of default=noprint_wrappers=1:nokey=1 "$i")" \ -metadata genre="$(ffprobe -v error -show_entries format_tags=genre -of default=noprint_wrappers=1:nokey=1 "$i")" \ -metadata date="$(ffprobe -v error -show_entries format_tags=date -of default=noprint_wrappers=1:nokey=1 "$i")" \ "${i%.flac}".m4a; done
你可以根据自己的需求添加更多-metadata行,覆盖你需要保留的所有标签。
转换完成后,你可以用这个命令验证元数据是否完整:
ffprobe -show_entries format_tags -of default=noprint_wrappers=1 output.m4a
备注:内容来源于stack exchange,提问作者AxZxP
相关产品推荐
相关产品推荐

