ffmpeg – どのように秒単位でビデオの持続時間を取得するには?

awk clock ffmpeg time

動画の持続時間を秒単位で取得するにはどうすればいいですか?

試してみたこと

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

  90  user2783132  2013-09-25


ベストアンサー

分を取得するには、2383秒を60で割る必要があります

39.7167

そして、端数部分の.7167に60を掛けて残りの秒数を求めます

43.002

39分43秒ですね。アプリが正確な値を出しているようです

44  Robert Harvey  2013-09-25


ffprobeをそのまま使えばいい。sed, grepなどは必要ありません。取得できる「持続時間」はいくつかあります(入力に応じて)

フォーマット(コンテナ)の持続時間

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

Result:

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

Result:

30.000000

上記のコマンドは、FFmpeg Wikiから引用しています。FFprobe Tips

With ffmpeg

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が持続時間です

入力ファイルによっては時間がかかる場合があります

127  llogan  2015-07-26


ffmpegがあれば、ffprobeもあるはずです

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

これは秒数の端数を与えることにもなります

33  evilsoup  2013-09-25


直接秒数を与えるmplayerでの解決策

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

3  micke  2013-09-25


私の ffmpeg-0.6.5-1.el6.rf.x86_64 の場合、2 番目だけを取得するには、ffprobe コマンドのフォーマットは次のようになります

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

2  Sunry  2014-06-16


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

これは、ミリ秒単位の持続時間を単一の整数値として出力します。grep/cut/sed/…は必要ありません

2  Josef Kufner  2018-05-05


私が作業していたいくつかの動画ファイルから奇妙で不正確なメタデータを取得する問題に出くわしましたが、パターンや、コードや ffmpeg、mp4box、ffprobe、mediainfo、mplayer などのツールを使用して、動画の実際の持続時間を取得するための処理を見つけることができませんでした

動画の本当の長さを特定することは、私が作業していたプロジェクトの要件であり、それを常に正しくするために私が見つけた唯一の方法は、ffmpegを使用して動画ファイルを再エンコードし、エンコードされたファイルを強制的に元のファイルのメタデータを無視することでした

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

思ったよりも早く動くかもしれません。コンテンツの種類や使用している環境によっては、平均時間が2秒だったのには驚きました)。)

… そして、お好みのツールを使ってデュレーションを取得します。mediainfo FILE –Inform=”Video;%Duration%”はミリ秒単位でデュレーションを表示してくれます

0  satirio  2017-06-01


メタデータの問い合わせだけが必要な場合

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"

-1  Luchostein  2019-08-30


正確なデュレーションが必要な場合は、FFmpegを忘れてください。それはファイルサイズと平均ビットレートに基づいた推定値を与えるだけです。私は、いくつかのケースでは、デュレーションの推定時間が2倍ずれていることを発見しました!

Linuxでは、ファイルが作成され、前記のビデオ録画中にのみ変更される場合、別の解決策として、以下のように、作成時間と最終変更時間を使用して持続時間を計算することが考えられます

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

-8  codechimp  2015-04-27


タイトルとURLをコピーしました