In both my previous and recent projects, I have been working with tags (metadata) of music files. One of the reason being I am rather particular about having a nicely organised library with all tag data aligned to the same format. Until recently while I was seeking for a solution to read and write tags of (potentially) all music formatsI only have MP3, FLAC, AIFF and M4A in my library, so that’s kinda all for me., and I encountered FFmpeg, the Swiss Army Knife of media processing.
FFmpeg has always been my go-to solution for processing media programmatically or in batch, and I have recently found the way to write into the tags of music files using it. The way of doing so might be a little verbose as everything have to fit into the command line interface with other components.
Read tags
ffprobe -show_format -print_format json aiffout.aiff
ffprobe version 4.2.1 Copyright (c) 2007-2019 the FFmpeg developers
built with Apple clang version 11.0.0 (clang-1100.0.33.8)
configuration: --prefix=/usr/local/Cellar/ffmpeg/4.2.1_2 --enable-shared --enable-pthreads --enable-version3 --enable-avresample --cc=clang --host-cflags='-I/Library/Java/JavaVirtualMachines/adoptopenjdk-13.jdk/Contents/Home/include -I/Library/Java/JavaVirtualMachines/adoptopenjdk-13.jdk/Contents/Home/include/darwin -fno-stack-check' --host-ldflags= --enable-ffplay --enable-gnutls --enable-gpl --enable-libaom --enable-libbluray --enable-libmp3lame --enable-libopus --enable-librubberband --enable-libsnappy --enable-libtesseract --enable-libtheora --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libx265 --enable-libxvid --enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-librtmp --enable-libspeex --enable-libsoxr --enable-videotoolbox --disable-libjack --disable-indev=jack
libavutil 56. 31.100 / 56. 31.100
libavcodec 58. 54.100 / 58. 54.100
libavformat 58. 29.100 / 58. 29.100
libavdevice 58. 8.100 / 58. 8.100
libavfilter 7. 57.100 / 7. 57.100
libavresample 4. 0. 0 / 4. 0. 0
libswscale 5. 5.100 / 5. 5.100
libswresample 3. 5.100 / 3. 5.100
libpostproc 55. 5.100 / 55. 5.100
{
Input #0, aiff, from 'aiffout.aiff':
Metadata:
title : shake it!
artist : emon feat. 初音ミク.鏡音リン.鏡音レン
album : 「マジカルミライ 2014」OFFICIAL ALBUM
compilation : 1
encoded_by : Max 0.9.1
title-sort : shake it!
album-sort : 「まじかるみらい 2014」OFFICIAL ALBUM
TDTG : 2014-11-03T15:38:58
artist-sort : emon feat sort
encoder : Lavf58.29.100
Duration: 00:03:47.03, start: 0.000000, bitrate: 2822 kb/s
Stream #0:0: Audio: pcm_s32be, 44100 Hz, 2 channels, s32, 2822 kb/s
"format": {
"filename": "aiffout.aiff",
"nb_streams": 1,
"nb_programs": 0,
"format_name": "aiff",
"format_long_name": "Audio IFF",
"start_time": "0.000000",
"duration": "227.027528",
"size": "80095752",
"bit_rate": "2822415",
"probe_score": 100,
"tags": {
"title": "shake it!",
"artist": "emon feat. 初音ミク.鏡音リン.鏡音レン",
"album": "「マジカルミライ 2014」OFFICIAL ALBUM",
"compilation": "1",
"encoded_by": "Max 0.9.1",
"title-sort": "shake it!",
"album-sort": "「まじかるみらい 2014」OFFICIAL ALBUM",
"TDTG": "2014-11-03T15:38:58",
"artist-sort": "emon feat sort",
"encoder": "Lavf58.29.100"
}
}
}
Write tags
ffmpeg -i aiff.aiff -map 0 -y -codec copy -write_id3v2 1 -metadata "artist-sort=emon feat sort" aiffout.aiff
ffmpeg version 4.2.1 Copyright (c) 2000-2019 the FFmpeg developers
built with Apple clang version 11.0.0 (clang-1100.0.33.8)
configuration: --prefix=/usr/local/Cellar/ffmpeg/4.2.1_2 --enable-shared --enable-pthreads --enable-version3 --enable-avresample --cc=clang --host-cflags='-I/Library/Java/JavaVirtualMachines/adoptopenjdk-13.jdk/Contents/Home/include -I/Library/Java/JavaVirtualMachines/adoptopenjdk-13.jdk/Contents/Home/include/darwin -fno-stack-check' --host-ldflags= --enable-ffplay --enable-gnutls --enable-gpl --enable-libaom --enable-libbluray --enable-libmp3lame --enable-libopus --enable-librubberband --enable-libsnappy --enable-libtesseract --enable-libtheora --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libx265 --enable-libxvid --enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-librtmp --enable-libspeex --enable-libsoxr --enable-videotoolbox --disable-libjack --disable-indev=jack
libavutil 56. 31.100 / 56. 31.100
libavcodec 58. 54.100 / 58. 54.100
libavformat 58. 29.100 / 58. 29.100
libavdevice 58. 8.100 / 58. 8.100
libavfilter 7. 57.100 / 7. 57.100
libavresample 4. 0. 0 / 4. 0. 0
libswscale 5. 5.100 / 5. 5.100
libswresample 3. 5.100 / 3. 5.100
libpostproc 55. 5.100 / 55. 5.100
Guessed Channel Layout for Input Stream #0.0 : stereo
Input #0, aiff, from 'aiff.aiff':
Metadata:
title : shake it!
artist : emon feat. 初音ミク.鏡音リン.鏡音レン
album : 「マジカルミライ 2014」OFFICIAL ALBUM
compilation : 1
encoded_by : Max 0.9.1
title-sort : shake it!
creation_time : 2014-11-03T15:38:58
TDTG : 2014-11-03T15:38:58
album-sort : 「まじかるみらい 2014」OFFICIAL ALBUM
artist-sort : emon feat. はつねみく.かがみねりん.かがみねれん
Duration: 00:03:47.03, start: 0.000000, bitrate: 2822 kb/s
Stream #0:0: Audio: pcm_s32be, 44100 Hz, stereo, s32, 2822 kb/s
Output #0, aiff, to 'aiffout.aiff':
Metadata:
title : shake it!
artist : emon feat. 初音ミク.鏡音リン.鏡音レン
album : 「マジカルミライ 2014」OFFICIAL ALBUM
compilation : 1
encoded_by : Max 0.9.1
title-sort : shake it!
album-sort : 「まじかるみらい 2014」OFFICIAL ALBUM
TDTG : 2014-11-03T15:38:58
artist-sort : emon feat sort
encoder : Lavf58.29.100
Stream #0:0: Audio: pcm_s32be (NONE / 0x454E4F4E), 44100 Hz, stereo, s32, 2822 kb/s
Stream mapping:
Stream #0:0 -> #0:0 (copy)
Press [q] to stop, [?] for help
size= 78219kB time=00:03:47.02 bitrate=2822.5kbits/s speed=2.08e+03x
video:0kB audio:78218kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.000549%
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于