Obtenha o tamanho do MP3 no Linux / FreeBSD

27

Eu tenho um monte de arquivos mp3 com vários tamanhos. Quero reduzi-lo para 50% -60% de comprimento. Diz, de 1 minuto a 30 segundos. Deve ser trivial usando ffmpeg. Mas não sei como determinar o tamanho original como base para o processamento usando o ffmpeg.

Alguém tem uma ideia?

ariefbayu
fonte

Respostas:

31

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
Um anão
fonte
Sim, não há como obter informações sobre o comprimento no ffmpeg. Eu já afirmei lá, eu uso o ffmpeg somente depois de obter o comprimento. De qualquer forma, obrigado pelas cabeças.
Ariefbayu 31/10/09
4
Vale notar que isso só fornece o comprimento como um número inteiro. Portanto, pode não ser preciso o suficiente para alguns casos de uso.
Ross
A melhor resposta, pois funciona mesmo com MP3 com taxa de bits média ou variável!
KrisWebDev
1
Adicione \npara imprimir uma nova linha também. > mp3info -p "%S\n" sample.mp3 // tempo total em segundos
nexayq 16/04
22

ffmpegimprimirá tudo o que sabe sobre o arquivo se você não fornecer outros argumentos. Use greppara 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
charlatão quixote
fonte
3
$ ffmpeg -i foo.mp3 2> & 1 | awk '/ Duration / {print substr ($ 2,0, length ($ 2) -1)}' 'Apenas pela parte do tempo
Craig Tataryn
Para somar a duração de um conjunto de arquivos MP3, você pode usar algo como 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 $TOTLENGTHimprimir 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.)
um CVn
Cuidado com o sinalizador de analização de ffmpeg. Basicamente, os números relatados são estimativas após um certo ponto para economizar a CPU.
mlissner
Usando um MP3 com taxa de bits média, o ffmpeg relata uma duração incorreta junto com este aviso Estimating duration from bitrate, this may be inaccurate. Eu acho que essa resposta é válida apenas com o MP3 de taxa de bits constante .
KrisWebDev #
9

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.)
nik
fonte
3

Apenas outra maneira de obter a duração apenas usando ffmpege grep:

# ffmpeg -i rara.mp3 2>&1 |grep -oP "[0-9]{2}:[0-9]{2}:[0-9]{2}.[0-9]{2}"
00:03:49.12
FC
fonte
2

As soluções usando ffmpegme 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.

ffmpegvem com uma ferramenta ffprobepara 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'
Att Righ
fonte
2
Você pode simplesmente fazerffprobe -show_entries stream=duration -of compact=p=0:nk=1 -v fatal song.mp3
Gyan
1

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
goldPseudo
fonte
1

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/,//
Monica Sol
fonte
0

Eu tive o mesmo problema e descobri que o comando mplayer (goldPseudo) funcionou bem, mas descobri que, se você abrir um álbum no RhythmBox, verá que sua linha de status fornece o número de faixas, o tempo total de reprodução e o tamanho do disco.

AFH
fonte
-1

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! ;)

Jeongpyo Lee
fonte