我正在尝试将元数据 id3v2.3 标签添加到使用 VLC 媒体播放器转换为 mp3 的一些文件中。这是我使用的命令:
ffmpeg -i "100000A9.mp3" -id3v2_version 3 -write_id3v1 1 -metadata title="titlename" -metadata artist="artistname" -metadata album="albumname" -b:a 320k "100000A9.mp3"
不幸的是,当我这样做时,我得到了以下输出:
ffmpeg version N-79630-g9ac154d Copyright (c) 2000-2016 the FFmpeg developers
built with gcc 5.3.0 (GCC)
configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-av
isynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enab
le-iconv --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --
enable-libfreetype --enable-libgme --enable-libgsm --enable-libilbc --enable-lib
modplug --enable-libmfx --enable-libmp3lame --enable-libopencore-amrnb --enable-
libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-librtmp --enabl
e-libschroedinger --enable-libsnappy --enable-libsoxr --enable-libspeex --enable
-libtheora --enable-libtwolame --enable-libvidstab --enable-libvo-amrwbenc --ena
ble-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx
264 --enable-libx265 --enable-libxavs --enable-libxvid --enable-libzimg --enable
-lzma --enable-decklink --enable-zlib
libavutil 55. 22.101 / 55. 22.101
libavcodec 57. 38.100 / 57. 38.100
libavformat 57. 34.103 / 57. 34.103
libavdevice 57. 0.101 / 57. 0.101
libavfilter 6. 44.100 / 6. 44.100
libswscale 4. 1.100 / 4. 1.100
libswresample 2. 0.101 / 2. 0.101
libpostproc 54. 0.100 / 54. 0.100
[mp3 @ 0000000001e42b80] Estimating duration from bitrate, this may be inaccurat
e
Input #0, mp3, from '100000A9.mp3':
Duration: 00:04:32.56, start: 0.000000, bitrate: 320 kb/s
Stream #0:0: Audio: mp3, 44100 Hz, stereo, s16p, 320 kb/s
File '100000A9.mp3' already exists. Overwrite ? [y/N] y
[mp3 @ 00000000006271e0] Using AVStream.codec to pass codec parameters to muxers
is deprecated, use AVStream.codecpar instead.
Output #0, mp3, to '100000A9.mp3':
Metadata:
TIT2 : titlename
TPE1 : artistname
TALB : albumname
TSSE : Lavf57.34.103
Stream #0:0: Audio: mp3, 44100 Hz, stereo, s16p, 320 kb/s
Metadata:
encoder : Lavc57.38.100 libmp3lame
Stream mapping:
Stream #0:0 -> #0:0 (mp3 (native) -> mp3 (libmp3lame))
Press [q] to stop, [?] for help
size= 67kB time=00:00:01.64 bitrate= 331.1kbits/s speed=10.2x
video:0kB audio:65kB subtitle:0kB other streams:0kB global headers:0kB muxing ov
erhead: 1.915571%
如您所见,文件最终输出为 67kb,长度仅为 1.64 秒。标签已正确添加,但整个文件已损坏。
FFmpeg 一开始确实看到了正确的大小(4:32.56),但出于某种原因,它拒绝正确输出。这和其他人丢失几秒钟时遇到的情况不一样。整个文件都消失了。我也检查并播放了文件,里面只有 1.64 秒的开头。有人知道为什么吗?
答案1
FFmpeg 不会对文件进行任何就地编辑或处理!
通过指定与输入文件相同的输出文件,ffmpeg 会清除文件,并且只有在输出令牌被操作之前最初读入内存的数据包才会被编码和写入。
您应该始终指定与输入不同的输出文件。
也就是说,你可以这样添加或更改标签
ffmpeg -i "current.mp3" -id3v2_version 3 -write_id3v1 1 \
-metadata title="titlename" -metadata artist="artistname" -metadata album="albumname" \
-c:a copy "new.mp3"