Respostas:
Com o ffmpeg, não sei como obter o comprimento como uma variável que você pode usar em um script. Mas mp3info faz.
mp3info -p "%S" sample.mp3 // total time in seconds
\n
para imprimir uma nova linha também. > mp3info -p "%S\n" sample.mp3
// tempo total em segundos
ffmpeg
imprimirá tudo o que sabe sobre o arquivo se você não fornecer outros argumentos. Use grep
para remover tudo, exceto a "Duração":
$ ffmpeg -i foo.mp3 2>&1 | grep Duration
Duration: 01:02:20.20, start: 0.000000, bitrate: 128 kb/s
Você também pode usar mplayer
. Grep para a linha "ID_LENGTH =":
$ mplayer -ao null -identify -frames 0 foo.mp3 2>&1 | grep ID_LENGTH
ID_LENGTH=3740.00
TOTLENGTH=0; for f in *.mp3; do LENGTH=$(mplayer -ao null -identify -frames 0 "$f" 2>&1 | awk -F= '/ID_LENGTH/ {print $2}' | awk -F. '{print $1}'); TOTLENGTH=$(($TOTLENGTH + $LENGTH)); done; echo $TOTLENGTH
imprimir a duração total do áudio em todos os arquivos, em segundos. Provavelmente, isso pode ser feito com mais eficiência, mas, como o escrevi como único, foi bom o suficiente para minhas necessidades. (A segunda chamada awk retira decimais, de modo que o resultado não é 100% exato, mas, novamente, bom o suficiente para minhas necessidades.)
Estimating duration from bitrate, this may be inaccurate
. Eu acho que essa resposta é válida apenas com o MP3 de taxa de bits constante .
Curiosamente, o aplicativo EXIFTool fornece a duração do MP3 como a última linha!
$ exiftool somefile.mp3 Número da versão ExifTool: 7.98 Nome do arquivo: somefile.mp3 Diretório:. Tamanho do arquivo: 49 MB Data / hora da modificação do arquivo: 2009: 09: 10 11: 04: 54 + 05: 30 Tipo de arquivo: MP3 Tipo MIME: audio / mpeg Versão de áudio MPEG: 2.5 Camada de áudio: 3 Taxa de bits do áudio: 64000 Taxa da amostra: 8000 Modo de Canal: Canal Único Estéreo MS: Desligado Intensidade Estéreo: Desligado Bandeira de direitos autorais: False Mídia original: True Ênfase: Nenhuma ID3 Tamanho: 26 Gênero: Blues Duração: 1:47:46 (aprox.)
As soluções usando ffmpeg
me parecem um pouco frágeis, pois estão analisando uma saída que não é totalmente projetada como uma interface. Dito isto, eles provavelmente continuarão a trabalhar por vários anos, independentemente.
ffmpeg
vem com uma ferramenta ffprobe
para obter informações sobre arquivos de áudio (vários formatos, incluindo mp3) e pode produzir saída legível por máquina. O comando a seguir obtém a duração da música.
ffprobe -show_streams -print_format json song.mp3 -v fatal | jq '.streams[0].duration'
ffprobe -show_entries stream=duration -of compact=p=0:nk=1 -v fatal song.mp3
Pessoalmente, uso o Mplayer para extrair as informações, principalmente porque já as tenho instaladas e não posso me incomodar em instalar novos softwares desnecessariamente. A vantagem disso é que ele não se limita aos arquivos mp3 em particular e deve funcionar com qualquer arquivo de mídia que o Mplayer possa manipular. A seguinte linha retornará a duração da faixa em segundos.
mplayer -identify -ao null -vo null -frames 0 Filename.mp3 | grep ^ID_LENGTH= | cut -d = -f 2
Você pode usar o ffmpeg para obter a duração do arquivo. Apenas use:
ffmpeg -i <infile> 2>&1 | grep "Duration" | cut -d ' ' -f 4 | sed s/,//
Aqui está o meu simples usando a referência acima.
mp3_full_path="$HOME/i/want/the/length/of/file.mp3"
ffmpeg -i "$mp3_full_path" 2>&1 | grep Duration | awk -F ' ' '{print $2}' | awk -F '[,|.]' '{print $1}'
10:47:15
Envio esse valor para a variável mp3_full_length
mp3_full_path="$HOME/i/want/the/length/of/file.mp3"
read -r mp3_full_length <<< `ffmpeg -i "$mp3_full_path" 2>&1 | grep Duration | awk -F ' ' '{print $2}' | awk -F '[,|.]' '{print $1}'`
# I can use this variable for my own purpose!
echo $mp3_full_length
10:47:15
Obrigado acima das pessoas! Eu uso suas idéias e conhecimentos Obrigado pela leitura, tenha um bom dia! ;)