Linux / FreeBSD에서 MP3 길이 가져 오기


27

다양한 길이의 mp3 파일이 있습니다. 길이를 50 % -60 %로 줄이려고합니다. 1 분에서 30 초까지 말합니다. ffmpeg를 사용하면 간단합니다. 그러나 ffmpeg를 사용하여 처리하기위한 기준으로 원래 길이를 결정하는 방법을 모르겠습니다.

누구나 아이디어가 있습니까?

답변:


31

ffmpeg를 사용하면 길이를 스크립트에서 사용할 수있는 변수로 얻는 방법을 알 수 없습니다. 그러나 mp3info 는 않습니다.

mp3info -p "%S" sample.mp3   // total time in seconds

네, ffmpeg에서 길이 정보를 얻을 수있는 방법이 없습니다. 나는 이미 거기에 언급했다. 길이를 얻은 후에 만 ​​ffmpeg를 사용한다. 어쨌든 헤드 업 주셔서 감사합니다.
— ariefbayu

4
이것은 길이를 정수로만 제공한다는 점에 주목할 가치가 있습니다. 따라서 일부 사용 사례에 대해서는 정확하지 않을 수 있습니다.
— Ross

평균 또는 가변 비트 전송률 MP3에서도 작동하므로 최상의 답변!
— KrisWebDev

1
\n새 줄도 인쇄하려면 추가하십시오 . > mp3info -p "%S\n" sample.mp3 // 총 시간 (초)
— nexayq

22

ffmpeg다른 인수를주지 않으면 파일에 대해 알고있는 모든 것을 인쇄합니다. grep"지속 시간"을 제외한 모든 것을 제거하는 데 사용하십시오 .

$ ffmpeg -i foo.mp3 2>&1 | grep Duration
  Duration: 01:02:20.20, start: 0.000000, bitrate: 128 kb/s

당신은 또한 사용할 수 있습니다 mplayer. "ID_LENGTH ="줄에 대한 Grep :

$ mplayer -ao null -identify -frames 0 foo.mp3 2>&1 | grep ID_LENGTH
ID_LENGTH=3740.00

3
$ ffmpeg -i foo.mp3 2> & 1 | awk '/ Duration / {print substr ($ 2,0, length ($ 2) -1)}'시간 부분 만
— Craig Tataryn

MP3 파일 세트의 길이를 합산하기 위해 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모든 파일에서 오디오의 전체 길이를 초 단위로 인쇄하는 것과 같은 것을 사용할 수 있습니다 . 아마도 더 효율적으로 할 수 있지만 일회성으로 작성했기 때문에 내 요구에 충분했습니다. (두 번째 awk 호출은 소수점을 제거하므로 결과는 100 % 정확하지 않지만 다시 필요에 충분합니다.)
— CVn

ffmpeg의 분석 플래그를주의하십시오. 기본적으로보고하는 숫자는 CPU를 절약하기 위해 특정 시점 이후의 추정치입니다.
— mlissner

평균 비트 전송률 MP3를 사용하면 ffmpeg는이 경고와 함께 잘못된 지속 시간을보고합니다 Estimating duration from bitrate, this may be inaccurate. 이 답변은 Constant Bitrate MP3 에서만 유효하다고 생각합니다 .
— KrisWebDev

9

흥미롭게도 EXIFTool 응용 프로그램은 MP3 지속 시간을 마지막 줄로 제공합니다!

$ exiftool somefile.mp3
ExifTool 버전 ​​번호 : 7.98
파일 이름 : somefile.mp3
디렉토리 :.
파일 크기 : 49 MB
파일 수정 날짜 / 시간 : 2009 : 09 : 10 11 : 04 : 54 + 05 : 30
파일 형식 : MP3
MIME 유형 : 오디오 / mpeg
MPEG 오디오 버전 : 2.5
오디오 레이어 : 3
오디오 비트 전송률 : 64000
샘플링 속도 : 8000
채널 모드 : 단일 채널
MS 스테레오 : 꺼짐
강도 스테레오 : 꺼짐
저작권 : False
원본 미디어 : True
강조 : 없음
ID3 크기 : 26
장르 : 블루스
소요 시간 : 1:47:46 (약)

3

ffmpegand 만 사용하여 지속 시간을 얻는 또 다른 방법 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

2

사용하는 솔루션 ffmpeg은 인터페이스로 디자인되지 않은 출력을 구문 분석하기 때문에 약간 깨지기 쉽습니다. 그들은 아마 몇 년 동안 계속 일할 것이라고 말했다.

ffmpeg는 ffprobe오디오 파일 (mp3를 포함한 많은 형식)에 대한 정보를 가져 오고 기계가 읽을 수있는 출력을 생성 할 수 있는 도구와 함께 제공됩니다 . 다음 명령은 노래 지속 시간을 가져옵니다.

ffprobe -show_streams -print_format json song.mp3 -v fatal | jq '.streams[0].duration'

2
당신은 할 수 있습니다ffprobe -show_entries stream=duration -of compact=p=0:nk=1 -v fatal song.mp3
— Gyan

1

개인적으로 Mplayer 를 사용하여 정보를 추출합니다. 대부분 이미 정보가 설치되어 있고 불필요하게 새 소프트웨어를 설치하는 데 방해가되지 않기 때문입니다. 이것의 장점은 특히 mp3 파일로 제한되지 않으며 Mplayer가 처리 할 수있는 모든 미디어 파일과 함께 작동해야한다는 것입니다. 다음 원 라이너는 트랙 길이를 초 단위로 반환합니다.

mplayer -identify -ao null -vo null -frames 0 Filename.mp3 | grep ^ID_LENGTH= | cut -d = -f 2

1

ffmpeg를 사용하여 파일 지속 시간을 얻을 수 있습니다. 그냥 사용하십시오 :

ffmpeg -i <infile> 2>&1 | grep "Duration" | cut -d ' ' -f 4 | sed s/,//

0

나는 같은 문제가 있었고 mplayer 명령 (goldPseudo)이 잘 작동한다는 것을 알았지 만 RhythmBox에서 앨범을 열면 상태 줄에 트랙 수, 총 재생 시간 및 디스크 크기가 있음을 알았습니다.


-1

위의 참조를 사용하는 간단한 방법이 있습니다.

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

그 값을 변수 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

사람들보다 감사합니다! 나는 당신의 아이디어와 지식을 사용합니다 읽기 주셔서 감사합니다, 좋은 하루 되세요! ;)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.