web-dev-qa-db-ja.com

動画の再生時間を秒単位で取得する方法

動画の再生時間を秒単位で取得する

私が試したこと:

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
59
user2783132

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

39.7167

次に、小数部の.7167に60を掛けて残りの秒を求めます。

43.002

39分43秒です。アプリケーションはあなたに正確な価値を与えているようです。

34
Robert Harvey

直接ffprobeを使うだけです。 sedgrepなどは必要ありません。(入力に応じて)取得できる「期間」はいくつかあります。

フォーマット(コンテナ)期間

$ 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が期間です。

これにかかる時間はもちろん、デコードの複雑さと入力の継続時間およびコンピューターの機能によって異なります。

85
llogan

ffmpegがある場合は、ffprobeも持っている必要があります。

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

これがほんの数秒を与えるでしょう、それが問題ならあなたはそれをsedでさらに処理することができます。

31
evilsoup

秒を直接与えるmplayerによる解決策:

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

私のffmpeg-0.6.5-1.el6.rf.x86_64の場合、2番目のものを取得するには、ffprobeコマンドの形式は次のようになります。

ffprobe <file> -show_format 2>&1 | sed -n 's/duration=//p' 
2
Sunry
mediainfo --Output='General;%Duration%' file.flv

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

1
Josef Kufner

私が働いていたいくつかのビデオファイルから奇妙で不正確なメタデータを得るという問題に遭遇しました、そして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% "はミリ秒単位で長さを表します。

0
satirio