비디오 지속 시간을 초 단위로 얻는 방법은 무엇입니까?


63

비디오 지속 시간 (초)을 어떻게 얻을 수 있습니까?

내가 시도한 것 :

ffmpeg -i file.flv 2>&1 | grep "Duration"
  Duration: 00:39:43.08, start: 0.040000, bitrate: 386 kb/s


mediainfo file.flv | grep Duration
Duration : 39mn 43s

이것에 가깝지만 정확하지는 않습니다. 2383은 39.71 분입니다.

ffmpeg -i file.flv 2>&1 | grep "Duration"| cut -d ' ' -f 4 | sed s/,// | sed 's@\..*@@g' | awk '{ split($1, A, ":"); split(A[3], B, "."); print 3600*A[1] + 60*A[2] + B[1] }'
2383

답변:


34

분을 얻으려면 2383 초를 60으로 나눕니다.

39.7167

그런 다음 분수 부분 .7167에 60을 곱하여 남은 초를 얻습니다.

43.002

39 분 43 초입니다. 응용 프로그램이 정확한 값을 제공하는 것 같습니다.


93

ffprobe직접 사용하십시오 . 에 대한 필요 sed, grep등 여러 가지 "기간이"당신이 (당신의 입력에 따라) 획득 할 수 없습니다.

형식 (컨테이너) 기간

$ ffprobe -v error -show_entries format=duration \
  -of default=noprint_wrappers=1:nokey=1 input.mp4

30.024000

-sexagesimal옵션을 추가하면 HOURS : MM : SS.MICROSECONDS 시간 단위 형식이 사용됩니다.

0:00:30.024000

비디오 스트림 기간

$ ffprobe -v error -select_streams v:0 -show_entries stream=duration \
  -of default=noprint_wrappers=1:nokey=1 input.mp4
30.000000

위의 명령은 FFmpeg Wiki : FFprobe Tips의 명령 입니다.

ffmpeg

컨테이너 또는 스트림 지속 시간이 누락되었거나 정확하지 않은 경우 (파일 손상 또는 잘림으로 인해) 입력을 완전히 디코딩해야 할 수 있습니다.

$ ffmpeg -i input.mp4 -f null -
  …
  frame= 1587 fps=0.0 q=0.0 Lsize=N/A time=00:01:03.48 bitrate=N/A

이 예 time=00:01:03.48에서는 기간입니다.

이 작업에 걸리는 시간은 입력의 디코딩 복잡성 및 지속 시간과 컴퓨터 기능에 따라 다릅니다.


는 .m2v 파일 당신이 aswell 그들에 대한 해결책이 있습니까 위해이 작동하지 않습니다
utdev

@utdev "With ffmpeg"섹션을 참조하십시오 .
llogan

당신은 이런 일이 왜 생각합니까, 15.32 : 세 번째 솔루션 내 동영상이 1시 19분 0초의 길이가, 나에게 잘못된 시간을 제공하지만 명령은 나에게 시간 = 01 리턴 : 09
utdev

미디어 스트림 지속 시간에 매우 유용합니다. 감사합니다.
우리는 Borg입니다

avprobe를 사용하는 사람은 매개 변수가 약간 다릅니다. avprobe -v error -show_format_entry duration. \ Sample.mp4
Brad

32

당신이있는 경우 ffmpeg, 당신은 또한이 있어야합니다 ffprobe:

ffprobe -i input.file -show_format | grep duration
ffprobe -i input.file -show_format -v quiet | sed -n 's/duration=//p'

이것은 또한 몇 분의 1 초를 줄 것입니다. 문제가 있다면 sed로 추가 처리 할 수 ​​있습니다.


초의 소수 부분을 어떻게 제거 할 수 있습니까?
Tina J

@TinaJ 그냥 다음과 printf같이 파이프 | xargs printf %.0f하면 정수 값이 반환됩니다.
Ilia Rostovtsev

3

내 ffmpeg-0.6.5-1.el6.rf.x86_64의 경우 두 번째 ffprobe 명령 형식은 다음과 같습니다.

ffprobe <file> -show_format 2>&1 | sed -n 's/duration=//p' 

초의 소수 부분을 어떻게 제거 할 수 있습니까?
Tina J

3

mplayer를 사용하여 직접 초를 제공하는 솔루션 :

mplayer -identify -frames 0 -vo null -nosound file.flv 2>&1 | awk -F= '/LENGTH/{print $2}'

2
mediainfo --Output='General;%Duration%' file.flv

지속 시간을 단일 정수 값으로 밀리 초 단위로 출력합니다. grep / cut / sed / ... 필요 없음


고마워-이것은 내가 찾던 것입니다. brew install mediainfo
Alex K

0

내가 일하고있는 일부 비디오 파일에서 이상하고 잘못된 메타 데이터를 얻는 문제가 생겼으며 ffmpeg, mp4box, ffprobe, mediainfo, mplayer와 같은 코드 및 도구를 사용하여 패턴 또는 모든 유형의 처리를 찾을 수 없었습니다. 비디오의 실제 길이를 얻을 수 있습니다.

비디오의 실제 지속 시간을 식별하는 것은 내가 일하고있는 프로젝트의 요구 사항이며 항상 올바르게 처리하는 유일한 방법은 ffmpeg를 사용하여 비디오 파일을 다시 인코딩하고 인코딩 된 파일을 원본 파일의 메타 데이터를 무시하도록 강제하는 것입니다.

ffmpeg -i INPUT_FILENAME -acodec copy -vcodec copy -map_metadata -1 OUTPUT_FILENAME"

(이것은 예상보다 빠르게 실행될 수 있습니다. 내용의 유형과 내가 사용하는 환경에서 평균 시간은 2 초였습니다.)

... 그리고 원하는 도구를 사용하여 지속 시간을 얻으십시오. 나는 mediainfo, btw를 좋아한다 :- "mediainfo FILE --Inform ="Video; % Duration % "은 당신에게 밀리 초 단위의 지속 시간을 제공합니다.


다른 답변보다 더 많은 정보 나 더 나은 솔루션을 제공하지 않았습니다
Sam

0

메타 데이터 만 쿼리해야하는 경우 :

ffprobe -hide_banner -v quiet -show_streams -print_format flat video.mp4

[...]

streams.stream.0.duration="5221.146009"

[...]

그래서 당신은 그것을 파싱 할 수 있습니다 :

while read -r; do
  if [[ "$REPLY" =~ ^streams\.stream\.([0-9])+\.duration=\"([^"]+)\"$ ]]; then
    echo -E Duration of stream "${BASH_REMATCH[1]}": "${BASH_REMATCH[2]}"
  fi
done < <(ffprobe -hide_banner -v quiet -show_streams -print_format flat video.mp4)

그러나 효과적인 컨테이너 기간을 얻으려면 컨테이너를 디코딩해야합니다.

AV_LOG_FORCE_NOCOLOR=y ffmpeg -nostdin -hide_banner -nostats -loglevel info -i video.mp4 -f null -c copy - 2>&1 | tail -n 2

디코딩 할 때까지 CPU 시간이 약간 걸립니다.

[...]

frame=130527 fps=53271 q=-1.0 Lsize=N/A time=01:27:01.12 bitrate=N/A speed=2.13e+03x
video:152014kB audio:40790kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown

그런 다음 구문 분석 할 수 있습니다.

if [[ "$(AV_LOG_FORCE_NOCOLOR=y ffmpeg -nostdin -hide_banner -nostats -loglevel info -i video.mp4 -f null -c copy - 2>&1 | tail -n 2 | head -n 1)" =~ \ time=([0-9]+):([0-9]{2}):([0-9]{2})\.([0-9]+) ]]; then
  declare duration=0 us="${BASH_REMATCH[4]}" t
  for t in "${BASH_REMATCH[@]:1:3}"; do
    ((duration *= 60))
    ((duration += ${t#0} ))
  done
  while [ ${#us} -lt 6 ]; do us+=0; done
  ((us >= 500000)) && ((duration++))
  ((duration)) || ((duration++))
fi
echo -E Duration: "$duration"

-6

정확한 지속 시간을 원하면 FFmpeg를 잊어 버리십시오. 파일 크기 및 평균 비트 전송률을 기반으로 한 추정치 만 제공합니다. 경우에 따라 예상 지속 시간이 2 배 줄어드는 것을 발견했습니다!

Linux에서, 해당 비디오 녹화 중 파일 만 작성 및 수정되는 경우 대체 솔루션은 다음과 같이 작성 및 마지막 수정 시간을 사용하여 지속 시간을 계산하는 것입니다.

stat -c "%X %Y" video.mpg | awk '{print $2 - $1}'

5
ffmpeg가 정확하지 않은 곳은 어디입니까?
aleb

4
% X는 마지막 액세스 시간입니다. % Y는 마지막 수정 이후의 시간입니다. 이것은 비디오 길이에 대해서는 아무 것도 말하지 않습니다.
Joe Hillenbrand

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