Eu tenho um arquivo, input.mp3, que rodando o ffprobe dá o seguinte:
[mp3 @ 0x559431400a00] Estimating duration from bitrate, this may be inaccurate
Input #0, mp3, from '../backup/1.mp3':
Metadata:
album : DW01-The Colour Of Magic
artist : Terry Pratchett
album_artist : Terry Pratchett
comment : Read By Nigel Planer
composer : Nigel Planer
genre : Discworld
publisher : Polygram
title : Colour Of Magic 1 of 6
track : 1
date : 1983
id3v2_priv.WM/Provider: A\x00M\x00G\x00\x00\x00
id3v2_priv.WM/WMCollectionGroupID: \xe4\xbba\xf0\xf2\xcd.D\xab\x92b\xeb{\x8b\x9a\xce
id3v2_priv.WM/WMCollectionID: \xe4\xbba\xf0\xf2\xcd.D\xab\x92b\xeb{\x8b\x9a\xce
id3v2_priv.WM/UniqueFileIdentifier: A\x00M\x00G\x00a\x00_\x00i\x00d\x00=\x00R\x00 \x00 \x00 \x002\x007\x007\x008\x004\x003\x00;\x00A\x00M\x00G\x00p\x00_\x00i\x00d\x00=\x00P\x00 \x00 \x00 \x00 \x00 \x00 \x003\x003\x007\x00;\x00A\x00M\x00G\x00t\x00_\x00i\x00d\x00=\x00T\x00 \x00 \x001\x005\x00
id3v2_priv.WM/WMContentID: h\x86H@^\xe6qF\x95T\x04m\x01P\x90\x7f
id3v2_priv.WM/MediaClassSecondaryID: \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00
id3v2_priv.WM/MediaClassPrimaryID: \xbc}`\xd1#\xe3\xe2K\x86\xa1H\xa4*(D\x1e
id3v2_priv.ZuneCollectionID: \x1d\xcb\xdf\xf3X89D\x81\xd1\xd0s#P\x00\xf8
Duration: 01:08:19.30, start: 0.000000, bitrate: 32 kb/s
Stream #0:0: Audio: mp3, 44100 Hz, stereo, fltp, 32 kb/s
Stream #0:1: Video: mjpeg (Baseline), yuvj420p(pc, bt470bg/unknown/unknown), 274x417, 90k tbr, 90k tbn, 90k tbc (attached pic)
Metadata:
comment : Cover (front)
Há várias coisas que quero fazer com este arquivo, como concatená-lo com outros arquivos e, em seguida, dividi-lo em pequenos segmentos. Mas, por enquanto, considerarei apenas o caso simples de remover os metadados, pois isso por si só produz problemas semelhantes aos que estou enfrentando com essas outras operações. Quando executo o seguinte comando no arquivo acima:
ffmpeg -i input.mp3 -map 0:a -c:a copy -map_metadata -1 output.mp3
Então eu corro ffprobe em output.mp3
Input #0, mp3, from 'output.mp3':
Metadata:
encoder : Lavf58.29.100
Duration: 01:08:19.27, start: 0.011995, bitrate: 32 kb/s
Stream #0:0: Audio: mp3, 44100 Hz, stereo, fltp, 32 kb/s
Metadata:
encoder : Lavf
Por que a duração diminui em 0,03 segundos? E por que a hora de início não é mais 0? Além disso, por que, quando abro este arquivo em um vlc, parece ter problemas para descobrir a duração? Com o arquivo original, sabia a duração instantaneamente. Mas com o novo arquivo, parece estar tentando estimá-lo, aproximando-se lentamente com o tempo enquanto o reproduzo.
Informações do codec em vlc (e são idênticas para ambos os arquivos)
Stream 0
Codec: MPEG Audio layer 1/2 (mpga)
Type: Audio
Channels: Stereo
Sample rate: 44100 Hz
Bits per sample: 32
Bitrate: 32 kb/s
Os arquivos MP3 não têm o mesmo tipo de estrutura interna que, por exemplo, um arquivo MP4 ou MKV teria - um MP3 "simples" é apenas uma série bruta de quadros de áudio e não tem sua duração armazenada em nenhum lugar. Para arquivos MP3 de taxa de bits constante, a duração pode ser calculada a partir do tamanho do arquivo, enquanto para VBR ela só pode ser determinada avaliando todo o arquivo quadro a quadro.
Isto é, a menos que o codificador armazene a duração e as informações VBR em uma " tag LAME INFO " (também conhecida como "tag Xing VBR"). Praticamente todos os codificadores e players suportam essa tag agora, e a maioria dos arquivos MP3 a possui.
A partir da saída do ffprobe, parece que seu arquivo original não possui essa tag, enquanto o novo arquivo possui ("encoder: Lavf" faz parte dele, adicionado por FFmpeg). Portanto, eu esperaria o resultado oposto - a duração deve ser conhecida para o novo arquivo, mas não para o original - isto é, a menos que o FFmpeg tenha adicionado informações imprecisas.
Na verdade, um arquivo MP3 simples nem mesmo reserva espaço para metadados – as tags Xing e ID3 são, na verdade, disfarçadas como quadros de áudio especiais que a maioria dos decodificadores sabe ignorar – o que também significa que a duração estimada de um arquivo MP3 pode depender de como quantos metadados ele contém ou costumava conter. Uma estimativa simples como "tamanho÷bitrate" estará errada se o arquivo tiver um buraco remanescente da remoção da tag ID3v2.
Você pode usar Mp3Diags para dar uma olhada na estrutura do arquivo. (Ele também pode ser usado para corrigir tags Xing imprecisas que fazem os jogadores pensarem que a pista é mais longa ou mais curta do que realmente é.)
Um arquivo mp3 contém três coisas: blocos de áudio, metadados e lixo. Um reprodutor de áudio provavelmente tem código para ler e exibir os metadados e deve ter código para reproduzir os blocos de áudio. O lixo é ignorado.
Agora, a duração exibida dos dados de áudio foi alterada. Existem duas razões possíveis:
O editor de metadados conseguiu destruir o cabeçalho de um bloco de áudio (e os blocos de áudio geralmente têm cerca de 30ms). Com o cabeçalho destruído, o bloco de áudio agora é lixo, então isso realmente reduziu a duração do áudio.
O reprodutor de áudio não verifica todos os blocos de áudio e soma sua duração, mas adivinha o número de blocos de áudio com base no tamanho do arquivo. E talvez não leve em consideração os metadados, portanto, ter mais metadados faz com que superestime a duração do áudio. Como você excluiu os metadados, a duração estimada do áudio foi reduzida. O comprimento real permanece inalterado e provavelmente menor do que o exibido.