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은 인터페이스로 디자인되지 않은 출력을 구문 분석하기 때문에 약간 깨지기 쉽습니다. 그들은 아마 몇 년 동안 계속 일할 것이라고 말했다.

ffmpegffprobe오디오 파일 (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.